xeno_by (xeno_by) wrote,
xeno_by
xeno_by

Categories:

про ООП - 2

Я вот сейчас с ребе sorhed обсуждал и выяснил, что мне больше всего нравится в Скале. Ее система модулей основанная на объектах и миксинах. Объектно-ориентированная система.

Читал на днях недавнюю паперу First-Class Modules for Haskell, где рассказывается про то, как SPJ с товарищем добавляют Scala-like (ну, или ML-like, как кому приятнее) систему модулей в Хаскелл. Вслед за авторами сравнивал этот подход с Nested Types - основополагающей паперой Одерского.

Как я понял, все решают одну и ту же проблему. Как сделать так, чтобы: 1) был модуль Set с функциями empty, add и asList, 2) внутреннее представление множества (структуры данных, возвращаемой empty, и манипулируемой остальными функциями) было скрыто, 3) можно было писать s.add 1 s.empty и все тайпчекалось.

Это вполне можно сделать без объектов - как показывает практика ML и схема, описанная в папере про Хаскелл. Внутреннее представление скрывается за экзистенциальным типом (абстрактный тип в ML или экзистенциальный тип в расширенном Хаскелле), в язык добавляется конструкция, которая говорит, что у s.add и s.empty совместимые типы (manifest types в ML или open в расширенном Хаскелле) - все, готово, можно юзать.

Здорово то, как это сделано в Скале. Модули (они же objects ака singleton types) + абстрактные типы (они же abstract type members) + self-types или явные type refinements. Под капотом там тот же самый матан с экзистенциальными типами (чтобы убедиться, можно почитать вышеслинкованную паперу Nested Types), но выглядит это все как кейк паттерн на всем привычном.

Из ООП взята инкапсуляция как понимание того, что есть первоклассная сущность - модуль, он же объект - внутри которого находятся штучки (в данном случае, типы и термы). Взято наследование (ака subtyping) в плане того, что для абстрактных типов можно задавать upper bounds и в плане того, что сущности можно смешивать вместе при помощи миксин-композиции. Про полиморфизм можно много чего подогнать. Например то, что неважно, что именно под капотом абстрактного типа - главное, что все, кому надо, умеют с ним работать (через функции модуля или через функции из upper bound), поэтому подкапотное содержимое можно удобно заменять.

В итоге: ФП-шный матан теории типов скрестили с идеями из ООП - получилась Скала. Матан остался только под капотом, а фасад оказался "объектно-ориентированный", в результате чего получилась гибкая (наппример, на кейке без привлечения дополнительных языковых средств можно сделать виртуальные классы), но простая для восприятия система. upd. Хорошая иллюстрация к посту есть вот тут: http://maxim.livejournal.com/393915.html.
Tags: ооп
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 12 comments