Пока ещё не умер, конечно, но и вечно пребывать в здравии не придётся. В конце концов это не панацея от всех проблем и не абсолют, следуя которому всё у программиста получает быстро и легко.
1 Модульность, как аргумент
ООП завоевал популярность. Почему? На выходе получаются хорошо структурированные программные продукты, базисной единицей которых является объект. Объектам свойственны полиморфизм и наследование. Первый, грубо говоря, распространяется на методы объектов, создавая единый интерфейс для выполнения определённых действий. Второй затрагивает атрибуты объекта и его методы, позволяет проводить родственные связи между сущностями, получая таким образом иерархическую структуру от предка к дочерним элементам. В общем случае, наследник получает в своё пользование атрибуты и методы родителя и добавляет свои - специфические - атрибуты и методы, то есть раздувается. Причём каждое изменение состава атрибутов влияет на состав методов и их алгоритмы.
Пример1. Существует модель "Сообщение для блога", включающая атрибуты Дата, Заголовок, ТелоСообщения. Задача: добавить новый атрибут Автор в существующую модель.
Решение. Создаётся новая модель "Сообщение для блога с указанием автора", наследующая простую модель "Сообщение для блога"; добавляется новый атрибут; добавляются методы для работы с новым атрибутом.
Пример2. Ситуация аналогичная Примеру 1 за тем исключением, что требуется добавить атрибут СсылкаНаРодительскоеСообщение, который бы содержал ссылку на экземпляр другого существующего сообщения (условно связанного с данным).
Решение. С первого взгляда ничего не изменилось. На самом деле поменялась смысловая нагрузка: появляется ассоциативная связь (которая с одной стороны может быть, а может и не быть) с другим экземпляром. Повторять решение не стоит.
2 Сегодняшние реалии - нужна параллельность
Потихоньку начинается и подхватывается движение в сторону распределённых (или параллельных) вычислений. Та же ситуация с распределёнными хранилищами данных. А если нужна параллельность, то нужно менять парадигму. Это проявляется в том, что мейнстрим начинает переориентироваться на функциональное программирование (ФП). Чисто параллельная модель вычислений (Erlang) - с одной стороны и объектные базы данных - с другой. Последние используют функциональные приёмы по манипулированию информацией и их особенностью является отказ от понятия отношение (присущее реляционным базам данных) и переход к нотации ключ-значение (Пример2 возможно развить, используя расширение в виде "ключ-значение"?).
3 Симбиоз ООП и ФП
Лично я считаю, что сосуществование с одной стороны выглядит привлекательно, но будущего не имеет. Обязательно родится что-то новое, возьмёт сильные стороны обоих подходов, привнесёт своё уникальное. А пока наблюдается совмещение ООП и ФП: Scala и Clojure (Java VM), F# (dotNet), OCaml.
4 Понятие объекта
Что такое объект в ООП? Для чего он? Во-первых, объект представляет данные. Во-вторых, он - часть структурной композиции всей системы (инкапсуляция + полиморфизм + наследование). Чем можно представить данные? Списками, коллекциями, одним словом - структурами. Данные отдельно от методов. К структурам также могут быть применены функции перечисления элементов, изменения, фильтрации (по критерию). Необходим другой взгляд на данные. И вот с какой стороны. Предметная область дробится на конечное множество сущностей, наделённых узким кругом обязанностей.
Наследование заменяется комплексированием, то есть дополнением одного объекта другим, но посредством ассоциирования. Наращивание знаний о предметной области происходит последовательно, а каждый новый объект отвечает только за себя, не несёт ответственности за другие объекты, с которыми он связан. В случае ООП наследование наделяет новый объект атрибутами родителя. Зачем ему эти знания? В случае с Примером 1, таким образом, потребуется создать новую структуру Автор с атрибутами СсылкаНаСообщение и ФИО (это также может быть представлено как пара "ключ-значение"). Новый объект Автор лишь дополнит модель, не перегружая её. Знание в этом процесс приобретается (полная аналогия с человеческим знанием). Модель - система, развивающаяся в процессе разработки ПО; гармоничная.
5 Вместо вывода
Смысл эволюции языков программирования: сделав малое, получить хороший результат. Человек, конечно, может научится понимать любой язык программирования (и использовать его), вот только для трансформирования мысли в код обычно нужно основательно подумать. Аналогично с архитектурными решениями. Как только начинают появляться запутанные паттерны программирования, значит всё не так хорошо как с языком, так и с подходом. А потому ... да здравствует...
Is the Supremacy of Object-Oriented Programming Over?
Комментариев нет:
Отправить комментарий