суббота, 21 ноября 2015 г.

[prog.idiotic] Еще раз помяну DevZen Podcast в суе...

Полагаю, у подкаста DevZen довольно-таки широкая аудитория в Рунете, хотя сам я его не слушаю, впрочем, как и другие подкасты. Но если доводится послушать кусок этого подкаста, то просто оторопь берет. Так было в прошлый раз. Так произошло и сегодня, когда что-то дернуло меня прослушать кусок подкаста 0067 (где-то с пятидесятой минуты, когда речь зашла про обучение C++ и ООП).

Поведение большинства участников подкаста можно охарактеризовать выражением "воинствующая безграмотность". Язык C++ -- низкоуровневый, указатели нужно объяснять посредством Ассемблера, для обучения ООП использовать Smalltalk или Ruby, да и само ООП -- это не три кита "инкапсуляция, наследование и полиморфизм", а еще и принципы SOLID в купе с паттернами проектирования.

Не буду разбирать глупости про C++, просто уже задолбался это делать.

А вот зашкаливающий уровень малолетнего дебилизма в отношении ООП в последние годы откровенно поражает. Видимо, это следствие пришествия в мейнстрим сначала Java, а затем Ruby с Python-ом. Java хоть и считается чистым ОО-языком, своей убогостью лишь дискредитирует понятие ООП. А Ruby, удачно позаимствовавший идеи SmallTalk-а, демонстрирует всего лишь один из взглядов на ООП.

К счастью, в мире все несколько сложнее и разнообразнее, чем это представляется ведущим подкаста DevZen. Как минимум, нужно помнить, что кроме динамической типизации (определяющей особенности ООП в SmallTalk/Ruby и Python), есть еще и статическая типизация. И проблемы перехода от результатов ОО анализа и ОО проектирования к ОО программированию в статически типизированном языке несколько иные, чем в динамически типизированном языке. В частности, те вещи, которые в динамической типизации решаются посредством утиной типизации, в статически типизированном языке не работают. Поэтому в статически типизированных ООЯП очень важно иметь возможность порождения большого количества интерфейсов и их комбинирование в одном классе-потомке посредством наследования от нескольких базовых классов.

И, если называть вещи своими именами, в более-менее близких к мейнстриму статически типизированных языках эти самые проблемы множественного наследования нормально решены всего в двух языках. Лучше всего это сделано в Eiffel-е. Поэтому-то первая часть замечательной книги автора языка Eiffel, Бертранда Мейера, "Объектно-ориентированное конструирование программных систем", просто обязательна к прочтению всем "экспертам", претендующим на обсуждение ООП. Чуть хуже множественное наследование реализовано в C++, но там оно хотя бы есть.

В таких же языках, как Java и, если не ошибаюсь, C#, множественного наследования нет. Вообще. От слова совсем. Есть наследование интерфейсов. Но без возможности наследования от нескольких родителей со своими атрибутами, это нифига не множественное наследование.

Не суть важно почему Java реализует столь малое подмножество возможностей, необходимых статически типизированному ООЯП. Важно то, что если есть необходимость обучать людей ООП применительно к статически типизированному ЯП, то Java -- это совсем плохой вариант, т.к. это будет обучение кастрированному ООП, а не полноценному.

Собственно, с точки зрения ООП для статически типизированного языка выбор С++ не так уж и плох. Конечно, еще лучше было бы, если бы ООП для статики обучали на основе Eiffel-я, но в наших реалиях это практически невозможно. Насколько я знаю, про Eiffel студентам рассказывают всего лишь в нескольких ВУЗах на просторах СНГ. Так что в этом плане картинка совсем печальная. Следствием чего затем и является смешивание принципов ООП, SOLD и паттернов проектирования в одну кучу.

PS. Среди участников дискуссии в подкасте порадовала девушка, которая сказала, что ей доводилось обучать программистов и затем наблюдать за их развитием. Полностью подтверждаю ее наблюдение: если человек понял указатели, то из него хороший программист может получиться. А вот если не понял, то программист из него не получится. Именно так все и обстоит.

Комментариев нет: