Уже долгое время я пытаюсь разобраться в том, как же правильно “готовить” этот самый ООП, и долгое время смотрел в основном
книги, посвященный паттернам проектирования.
Но когда говорят о развитии ООП, то часто упоминаются язык, который оказал значительное влияние на
объектно-ориентированный подход - Smalltalk
и его создатель - Алан Кей.
В какой-то момент возникла мысль - возможно стоит взглянуть на, так сказать, исток всего этого подхода (да, формально первым языком,
использующим концепцию объектов была Simula, но именно Smalltalk
популяризовал ООП), чтобы
приблизиться к пониманию того, каким он задумывался изначально.
Первое знакомство вызвало небольшой шок - ООП в Smalltalk
вообще совсем не похоже на современные языки.
Если, считать, например, Java
за “дефолтный” ООП язык, то между ними мало общего, и дело не только в синтаксисе (хотя и в нем тоже) -
в первую очередь динамическая типизация, что делает Smalltalk
ближе к какому-нибудь Python
или даже Elixir
, с последним у них схожесть
в плане акторной модели, но об это позже.
Если вернуться опять же к Java
, то можно вспомнить, сколько там различного синтаксиса для “построения” ООП - все эти “abstract”, “interface” и т.д.
В противоположность, как утверждается в “фичах” Pharo
(современный диалект Smalltalk
), весь синтаксис насчитывает
всего 6(!) ключевых слов и может уместиться на почтовой открытке. Такой минимализм достигается как раз за счёт динамизма языка, и, как следствие, “позднего связывания”
компонентов. Язык не требует строгого описания иерархий и отношений между ними, поэтому большинство популярных “паттернов проектирования” будут иметь гораздо
меньшее значение в Smalltakl
.
Объекты по-видимому никогда не должны были иметь сложный интерфейс и внешней и закрытой частью. В инкапсуляции гораздо более важной частью будет именно “сокрытие” данных (а не связь данных и их методов). Метафора, которая предлагается Аланом Кеем - каждый объект представляет собой небольшой самодостаточный “компьютер”. Детали реализации скрыты от пользователя, позволяя объекту самостоятельно разобраться с содержанием сообщения.
Поэтому главное - это не объекты, но передача сообщений между ними. “Message-passing oriented programming” - объекты, это независмые сущности, которые асинхронно обмениваются сообщениями - изменяя свое состояние/поведения, а иногда передавая сообщение другим объектам (наследование - частный случай такого делегирования).
Ещё более странно, что настоящие наследники стиля ООП-Smalltalk - это языки и фреймворки ориентированные акторную модель.
Эта модель гораздо сильнее ассоциируется с функциональным программированием (и в частности - реактивным программированием), в
частности с Erlang/Elixir
и наиболее известным “акторным” фреймворком - Akka, который в основном написан на Scala
.
Некоторые говорят, что похожий стиль ООП наблюдается в Ruby
, и он значительно ближе к Smalltalk
чем в остальных современных языках (к сожалению, я не знаком с Ruby
).
Если кому-то хочется потестить Smalltalk
и посмотреть как ещё может выглядеть ООП-код,
то у него есть современные бесплатные реализации: Squeak/Smalltalk и уже упомянутый Pharo.
Кстати - еще одна “фишка” что у Squeak
что у Pharo
- это интеграция языка вместе со специально построенной прямо для него IDE.