Можете ли вы предложить хорошее введение в философию и дизайн программ Scala? - PullRequest
11 голосов
/ 01 сентября 2010

В Java и C ++ проектирование иерархии объектов программы довольно очевидно. Но, начиная Scala, мне было трудно решить, какие классы определить, чтобы лучше использовать синтаксические возможности Scala для сахара (даже без идеала о том, как мне проектировать для повышения производительности). Хорошие чтения по этому вопросу?

Ответы [ 4 ]

7 голосов
/ 01 сентября 2010

Я прочитал 4 книги по Scala, но я не нашел то, что вы просите.Полагаю, вы уже читали "Программирование в Scala" Одерского (Artima).Если нет, то это ссылка на онлайн-версию:

http://www.docstoc.com/docs/8692868/Programming-In-Scala

В этой книге приведено много примеров построения объектно-ориентированных моделей в Scala, но все примеры очень малы.в количестве классов.Я не знаю ни одной книги, которая научит вас, как структурировать крупномасштабные системы с использованием Scala.

  • Императивная ориентация на объекты существует со времен Smalltalk, поэтому мы знаем многооб этой парадигме.
  • Функциональная объектная ориентация , с другой стороны, является довольно новой концепцией, поэтому через несколько лет я ожидаю появления книг, описывающих крупномасштабные системы FOO.В любом случае, я думаю, что книга PiS дает вам довольно хорошее представление о том, как вы можете собрать вместе основные строительные блоки системы, такие как шаблон Factory, как заменить шаблон Strategy на функциональные литералы и т. Д.

Одна вещь, которую Виктор Кланг однажды сказал мне (и с чем я действительно согласен), заключается в том, что одно отличие между C ++ / Java и Scala OO состоит в том, что вы определяете намного больше (меньших) классов при использовании Scala.Зачем?Потому что ты можешь!Синтаксический сахар для case class приводит к очень небольшому штрафу за определение класса, как в типизации, так и в удобочитаемости кода.И, как вы знаете, многие мелкие классы обычно означают лучшую ОО (меньше ошибок), но худшую производительность.

Еще одна вещь, которую я заметил, это то, что я гораздо больше использую шаблон фабрики при работе с неизменяемыми объектами, поскольку все«изменения» экземпляра приводят к созданию нового экземпляра.Слава Богу за метод copy() на case class.Этот метод делает фабричные методы намного короче.

Я не знаю, помогло ли это вам вообще, но я думаю, что этот предмет сам по себе очень интересен, и я тоже жду больше литературы по этому вопросу.Ура!

4 голосов
/ 01 сентября 2010

Это все еще развивающийся вопрос. Например, только что выпущенный Scala 2.8.0 принес поддержку вывода конструктора типа , что позволило использовать шаблон классов типов в Scala. Сама библиотека Scala только начала использовать этот шаблон. Буквально вчера я услышал о новом модуле Lift, в котором они попытаются избежать наследования в пользу классов типов.

В Scala 2.8.0 также введены импликации с более низким приоритетом, а также параметры по умолчанию и именованные параметры, которые можно использовать по отдельности или вместе для создания проектов, отличающихся от тех, которые были возможны ранее.

И если мы вернемся назад во времени , мы заметим, что другие важные функции тоже не так уж стары:

  • Извлечение методы в объектах-компаньонах case-классов, представленные в феврале 2008 года (до этого единственным способом извлечения классов-кейсов было сопоставление с образцом).
  • Ленивые значения и Структурные типы , введенные в июле 2007 года.
  • Абстрактные типы Поддержка конструкторов Тип была введена в мае 2007 года.
  • Экстракторы для не-case классов были введены в январе 2007 года.
  • Похоже, что неявные параметры были введены только в марте 2006 года, когда они заменили способ просмотров .

Все это означает, что мы все учимся проектировать программное обеспечение Scala. Обязательно полагайтесь на проверенные конструкции функциональных и объектно-ориентированных парадигм, чтобы увидеть, как новые функции в Scala используются в других языках, таких как Haskell и классы типов или Python и стандартные (необязательно) и именованные параметры.

Некоторые люди не любят этот аспект Скалы, другие любят его. Но другие языки разделяют это. C # добавляет функции так же быстро, как Scala. Java медленнее, но также претерпевает изменения. В 2004 году в него были добавлены дженерики, и в следующей версии должны быть внесены некоторые изменения для лучшей поддержки параллельного и параллельного программирования.

1 голос
/ 01 сентября 2010

Я не думаю, что есть много учебников для этого. Я бы посоветовал придерживаться того, что вы делаете сейчас, но также посмотреть на «идиоматический» код Scala и обратить особое внимание на следующие случаи:

  • использовать классы case или объекты case вместо перечислений или «объектов значения»
  • использовать объекты для одиночных игр
  • если вам нужно поведение "в зависимости от контекста" или функциональность, подобная внедрению зависимостей, используйте implicits
  • при проектировании иерархии типов или если вы можете выделять вещи из конкретного класса, используйте черты, когда это возможно
  • Мелкозернистые иерархии наследования в порядке. Имейте в виду, что у вас есть сопоставление с шаблоном
  • Знай шаблон "Прокачай мою библиотеку"

И задайте столько вопросов, сколько считаете необходимым для понимания определенного момента. Сообщество Scala очень дружелюбное и услужливое. Я бы предложил список рассылки Scala, Scala IRC или scala-forum.org

0 голосов
/ 04 сентября 2010

Я только что случайно погуглил файл с именем "ScalaStyleGuide.pdf" . Буду читать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...