Паттерны проектирования для ОО-функциональных гибридных ЯП
Увлёкшись некторое время тому объектно-ориентированно-функциональными гибридами (вроде Scala), спустя некоторое время у меня появилось желание собрать каталог лучших практик и архитектурных решений для подобных языков программирования. У меня не было практики работы с функциональными языками до того, потому первым делом я ознакомился с некоторыми паттернами для таких языков. Кроме того, в процессе изучения Скалы многие классические паттерны GoF оказываются частными случаями конструкций языка, потому в них попросту отпадает необходимость. Возможно, дело в том, что на самом деле паттерны проектирования — это слабость современных яп, но это уже тема для другой статьи.В этой статье я хотел бы вкратце рассказать о том, как обстоят дела с паттернами проектирования для языков вроде Скалы. В дальнейших статьях я расскажу о самых интересных (по моему мнению, конечно же) из них, и постараюсь составить некоторый каталог таких паттернов.
Со своими идеями я заглянул (конечно же) на StackOverflow. Оказалось, что паттерны для языков вроде Скалы вот уже год разрабатываются и совершенствуются в скала-комьюнити. В основном — самим автором языка, Мартином Одерски (несколько примеров в его работе «Scalable Component Abstractions») и его соавтором по книге «Programming In Scala» и автором фреймворка ScalaTest, Биллом Веннерсом (две публикации: «Stackable Trait» и «Selfless Trait»). Похожая проблема также поднимается в работе «Independently Extensible Solutions to the Expression Problem».
Также в эту коллекцию вполне подходят паттерны, которые применяются для систем, построенных на взаимодействии Actor'ов. Почти все паттерны из книги Боба Мартина «Enterprise Integration Patterns» можно легко перевести на язык Actor'ов.
О монадных паттенах в ближайшее время можно будет почитать в новой книге «Monadic Design Patterns for the Web» автора Грега Мередита. А кому не терпится почитать уже сейчас, можно ознакомиться с уже написанными главами тут.
Некоторые паттерны в более-менее сформулированном виде можно также найти в этом каталоге. Там же есть некоторые классические паттерны, реализованные на Скале. Почитать об особенностях реализации некоторых паттернов можно: Observer, Builder.
Эмулирование Type Classes из Хаскелля также можно считать паттерном проектирования. Об этом статья Мартина «Poor Man's Type Classes».
Ну и наконец, многие замечают, что конструкцию с несколькими списками аргументов, последний из которых состоит из одного аргумента типа Unit также вполне можно считать паттерном:
def command(expr: T)(block: => Unit) {...}
command (expr) {
block
}Но для этой конструкции пока не придумано имя. Возможно у хабрасообщества есть идеи по этому поводу?
В этой статье я лишь поделился ссылками на англоязычные источники по теме. Так как ссылок было много, собрать из них ссылочный пост, который бы поместился в 500 символов у меня так и не получилось. Надеюсь, НЛО будет благосклонно.
Если тема окажется интересной, в дальнейшем я обязательно классифицирую и упорядочу информацию из этих источников в виде удобоваримого каталога с блэкджеком и UML'ками. Очень интересно услышать отзывы сообщеста.
UPD: перенёс в новенький, сверкающий блог о Скале. Спасибо администрации хабра за его создание.

комментарии (19)