Пришло время уйти от OOP
OOP считается самым большим бриллиантом в короне компьютерной науки. Лучшим способом организации кода. Решением всех проблем. Единственно верным способом писать наши программы. Ниспосланным нам свыше самим богом программирования… Только вот OOP программист вынужден разгребать кучу всяких абстракций, следить за всеми совместно используемыми объектами, помнить тонны «паттернов программирования» — и на все это тратить свои время и силы вместо того, чтобы решать саму поставленную задачу.
Многие уже давно критикуют OOP, и среди этих критиков не мало очень уважаемых программистов. И даже Alan Kay – изобретатель OOP находится в их рядах!
Главной целью любого разработчика является написания надежного кода. Если код глючный и не работает, как задумано, то всё остальное не имеет никакого значения. А какой самый лучший способ написать надежный код? Сделать код простым. Простота – это противоположность сложности. Отсюда следует, что первоочередная цель разработчика – уменьшить сложность кода.
Disclaimer:
Я не фанат OOP, так что нет ничего удивительного, что эта статья покажется многим предвзятой. Однако, я приведу аргументы в защиту своей позиции.
Я также прекрасно понимаю, что критика OOP воспринимается многими очень болезненно. Так что многие читатели почувствуют себя оскорбленными лично. Тем не менее, я намерен высказать то, что я считаю правильным. Ибо моя цель не оскорбить, а указать на проблемы, которые есть в OOP.
Вот OOP от Alan Kay я не критикую. Он вообще гений. Лично я бы хотел, чтобы OOP был именно таким, каким его задумал Alan Kay. Что я критикую, так это OOP в реализации C# или Java.
Проблема в том, что OOP давно считается стандартом организации программного кода. И так считают очень многие, включая тех, кто занимает серьезные должности в софтверной индустрии, отчего другие подходы к программированию даже не рассматриваются в большинстве компаний.
Мне приходилось преодолевать множество сложностей, когда я писал на OOP языках. И мне всегда было интересно, почему возникали эти сложности. Может, это я был не слишком хорош? Может, мне надо было научиться еще паре десятков «паттернов программирования»? В конце концов, у меня на всё это просто не осталось сил.
Эта статья расскажет вам, какой путь длинной в десятилетие я прошел от OOP к функциональному программированию. С тех пор я не припомню случая, чтобы мне попался проект, для которого бы именно OOP подходил лучше всего. Более того, проекты, где использовался OOP, проваливались под тяжестью сложности кода – с какого-то момента их было невозможно дальше поддерживать и развивать.
TLDR
«Объектно-ориентированные программы – это альтернатива правильным программам.»
Edsger W. Dijkstra, пионер компьютерной науки
Цель создания OOP была одна – справиться со сложностью процедурного кода. Другими словами, OOP был призван улучшить организацию кода. Но с тех пор не было приведено ни одного свидетельства в пользу того, что OOP лучше старого процедурного программирования.
Горькая правда состоит в том, что OOP не справился с той единственной задачей, для которой он был создан. На бумаге всё выглядело прекрасно – у нас были строгие иерархии животных, собак, людей… (И, конечно же, фигур: прямоугольников, квадратов и кругов – куда ж без них!) Но по мере возрастания сложности кода приложения, OOP не помогал ее уменьшить, а наоборот увеличивал – тоннами необходимых «паттернов программирования» и создавая сложности для программиста уследить за тем, где и как меняются значения переменных. OOP сделал многие часто используемые процедуры, такие как рефакторинг и тестирование, неоправданно сложными.
Многие не согласиться со мной, но факт в том, что дизайн OOP в C# или Java не был продуман с научной точки зрения, он не явился результатом серьезного научного исследования. В отличие от функционального программирования, например, в Haskell, где прочной теоретической основой является лямбда-исчисление. В основе OOP не лежит ничего подобного.
В маленьких проектах OOP показывает себя вполне неплохо. Но что будет, когда проект разрастется? OOP – это мина замедленного действия, которая неизбежно рванет, когда код проекта достигнет определенных размеров. Проекты начинают задерживаться, дедлайны срываться, разработчики падают без сил, а добавление новых фич становится практически невозможным. В конце концов, компании вынуждены помечать такой код как «устаревший», а разработчиков засадить за рерайт.
OOP не слишком хорошо согласуется с тем, как думает наш мозг. Мы привыкли сосредотачиваться на действиях: пойти на прогулку, поговорить с другом, съесть пиццу. Наш мозг развивался в сторону «делания чего-то», а не в сторону выстраивания сложной иерархии из абстрактных объектов.
Код OOP недетерминированный (в отличие от функционального программирования): мы не можем быть уверены, что при одних и тех же входных данных мы каждый раз будем получать один и тот же результат. А это очень затрудняет понимание того, как программа работает. Приведу простой пример: сравните 2+2 и calculator.Add(2, 2). Последнее выражение, по идее, должно всегда выдавать 4, но оно может выдать и 5, и 3, а то и 1004, ибо зависимости объекта Calculator могут изменить его поведение самым непредсказуемым образом.
ShaltaiBoltai Автор
Пока ни ru_vds, ни mailru не выкатили свои переводы этой статьи, я решил выложить свой вольный пересказ ее начала. Посмотрим, что из этого выйдет.
Siemargl
Статье больше года. Поздняк спешить =)
TheShock
Они не переводили эту статью, ибо это дно, а не статья.
gluck59
Здесь и сейчас не принято критиковать ООП. Попробуйте вернуться к теме через пару лет.
richman5
Просто надо разделять критику ООП как такового и его реализации в конкретном ЯП.
VolCh
И критику как его используют в конкретных приложениях