В Java и С++ проектирование иерархии объектов программы довольно очевидно. Но начиная с Scala мне было трудно решить, какие классы следует определять, чтобы лучше использовать синтаксические сахаровые установки Scala (даже идеальная идея о том, как я должен проектировать для лучшей производительности). Любые хорошие чтения по этому вопросу?
Можете ли вы предложить хорошее введение в концепцию Scala философии и программ?
Ответ 1
Я прочитал 4 книги на Scala, но я не нашел того, о чем вы просите. Наверное, вы уже читали "Программирование в Scala" Odersky (Artima). Если нет, это ссылка на он-лайн версию:
http://www.docstoc.com/docs/8692868/Programming-In-Scala
В этой книге приводятся многочисленные примеры построения объектно-ориентированных моделей в Scala, но все примеры очень малы по количеству классов. Я не знаю ни одной книги, которая научит вас, как структурировать крупномасштабные системы, используя Scala.
- Императивная объектная ориентация были вокруг с Smalltalk, поэтому мы много знаю об этой парадигме.
- Функциональная объектная ориентация на другая рука, является довольно новой концепцией, поэтому через несколько лет я ожидаю книги описывающих широкомасштабные системы FOO для появляются. Во всяком случае, я думаю, что PiS книга дает вам довольно хорошую картину как вы можете собрать основные строительных блоков системы, например Factory, как заменить Стратегия с функцией литералы и т.д.
Одна вещь, которую однажды сказал мне Виктор Кланг (и что-то, на чем я действительно согласен), заключается в том, что одно отличие между С++/Java и Scala OO заключается в том, что вы определяете намного больше (меньших) классов при использовании Scala. Зачем? Потому что ты можешь! Синтаксический сахар для case class
приводит к очень маленькому штрафу за определение класса, как при наборе текста, так и в удобочитаемости кода. И, как вы знаете, многие маленькие классы обычно означают лучшее OO (меньше ошибок), но хуже производительность.
Еще одна вещь, которую я заметил, заключается в том, что я использую шаблон factory намного больше при работе с неизменяемыми объектами, поскольку все "изменения" экземпляра приводят к созданию нового экземпляра. Слава Богу за метод copy()
на case class
. Этот метод значительно упрощает методы factory.
Я не знаю, помогло ли это вам вообще, но я думаю, что этот предмет очень интересен сам, и я тоже жду больше литературы по этому вопросу. Ура!
Ответ 2
Это все еще развивающееся дело. Например, только что выпущенный Scala 2.8.0 обеспечил поддержку вывода конструктора типа, который включил шаблон классов типов в Scala. Сама библиотека Scala только что начала использовать этот шаблон. Только вчера я услышал о новом модуле Lift, в котором они попытаются избежать наследования в пользу классов типов.
Scala 2.8.0 также введены более низкие приоритеты, а также параметры по умолчанию и именованные параметры, которые могут использоваться отдельно или вместе, чтобы создавать самые разные проекты, чем это было возможно раньше.
И если мы вернемся назад во времени, отметим, что другие важные функции не так уж и старые:
- Методы экстрактора на объектных компаньонах классов классов, где был представлен февраль 2008 г. (до этого единственным способом сделать извлечение в классах классов было сопоставление шаблонов).
- Предельные значения и структурные типы, введенные в июле 2007 г.
- Поддержка абстрактных типов для конструкторов типов была введена в мае 2007 года.
- Экстракторы для классов, отличных от случая, были представлены в январе 2007 года.
- Кажется, что неявные параметры были введены только в марте 2006 года, когда они заменили способ представления представлений.
Все это означает, что мы все учимся разработке программного обеспечения Scala. Обязательно полагайтесь на проверенные образцы функциональных и объектно-ориентированных парадигм, чтобы увидеть, как новые функции в Scala используются в других языках, таких как классы Haskell и типа, или Python, и стандартные (необязательные) и именованные параметры.
Некоторым людям не нравится этот аспект Scala, другим это нравится. Но другие языки разделяют его. С# добавляет функции так же быстро, как Scala. Java медленнее, но он также проходит через изменения. В 2004 году он добавил generics, и следующая версия должна внести некоторые изменения для лучшей поддержки параллельного и параллельного программирования.
Ответ 3
Я не думаю, что для этого есть много учебников. Я предлагаю остаться с тем, как вы это делаете сейчас, но и посмотреть "идиоматический" код Scala и обратить особое внимание в следующих случаях:
- использовать классы case или case-объекты вместо перечислений или "объекты-значения"
- использовать объекты для одиночных игр
- если вам нужно поведение "в зависимости от контекста" или функция, подобная инъекции, используйте implicits
- при проектировании иерархии типов или если вы можете выставлять вещи из конкретного класса, используйте черты, когда это возможно.
- Строгое иерархирование наследования в порядке. Имейте в виду, что у вас есть соответствие шаблону
- Знайте шаблон "pimp my library"
И задайте столько вопросов, сколько вам кажется, вам нужно понять определенный момент. Сообщество Scala очень дружелюбное и полезное. Я бы предложил список рассылки Scala, Scala IRC или scala -forum.org
Ответ 4
Я случайно случайно перешел в файл под названием "ScalaStyleGuide.pdf" . Иду читать...