Пока народ безграмотен, из всех искусств важнейшими для нас являются кино и цирк.
В. И. Ленин, полн. собр. соч. — 5-е изд. — Т. 44. — С. 579: Беседа В. И. Ленина с А. В. Луначарским
Проницательный читатель уже понимает, что сейчас ему будут вещать (вешать лапшу) о том, что вместо OOP надо использовать некие CLIP и CLOP.
Отнюдь! То есть почти так, но с точностью до наоборот.
Рассмотрим самые-самые языки программирования, например, С++ и Java.
Основным понятием в этих языках является класс (Class), как собственно и в очень многих других языках, претендующих на ООП. Замечу, не во всех. Например, классов нет в Lua и Oberon.
Факт наличия языков ООП без классов: позволяет нам разделить все ООП языки на два класса:
- CLOP OOP
- И non-CLOP OOP.
CLOP, как уже понятно – это Class-Oriented Programming. Сократить до COP увы нельзя, так как это сокращение уже занято COP — Component-Oriented Programming.
Сокращение CLIP придумал Андрей Хапугин, и оно означает Class-Idolized Programming. CLIP передает смысл, пожалуй, лучше, чем CLOP, но я не могу выкинуть слова из песни, тем более, что сокращение CLOP явно намекает на интересные обстоятельства, но об этом в конце заметки.
Я не буду рассказывать знающим людям, что такое класс, напомню лишь о том, что нам дают (точнее, что у нас забирают классы). Эта тема большая, поэтому здесь я набросаю только несколько мыслей.
Возьмем классическую задачу ООП – мы делаем графический редактор и определяем класс «Фигура» и наследуем из него всяческие круги и прямоугольники.
Замечательно, теперь несколько мысленных экспериментов:
- Мы что-то добавили в базовый класс. Ой, все приходится менять
- При наследовании наследуется реализация – здорово, экономично, но Ой, мы заменили реализацию базового метода, и Ой, перестали работать часть фигур, которые до этого им «креативно» пользовались
- Нужно сделать редактор документов, в котором можно вставлять в текст фигуры. ОЙ, большая беда. Что же нам бедным делать: курочить базовый класс, вообще делать другую иерархию классов, или покупать веревку и мыло? Особенно жалко, что есть много кода, который (в принципе), мог бы работать и там, и там.
Давайте теперь представим другую картинку: объекты есть, а классов в том понимании, которое есть в самых-самых языках, нет.
Например, есть объект «Прямоугольник», у которого есть набор «ручек управления». Намеренно не говорю метод, потому что мы привыкли, что метод – это функция, а это вовсе не обязательно. Пусть объект собран статически или динамически. Естественно, такие объекты можно создавать/клонировать.
Теперь есть наши: графический редактор и редактор документов. И «Прямоугольник» можно вставить в редактор, если набор «ручек управления» является достаточным. Проверка достаточности может происходить статически или динамически. Например, прилетел к нам объект по сети – его «обнюхали», проверили достоверность источника, проверили на «не зловредность», и проверили набор ручек управления. Набор достаточный? Вставили. Не достаточно – не вставили.
Понятие класса при этом становится внешним по отношению к объектам (и вторичным). Класс «Фигура» есть, в каком-то смысле, у графического редактора, как фильтр, через который проходит или не проходит объект.
Объект может принадлежать любому количеству классов, причем, и таких, которые построены гораздо позже самого объекта.
С другой стороны, объект может быть «достроен» (статически или динамически) для того, чтобы соответствовать определению класса.
Замечание: Я уже много раз повторил «статически или динамически» – это еще одна тема для разговора, до которой я пока не смог добраться – что-то типа: Idolizing of static typing considered harmful.
Не буду пока даже пытаться описать pure OOP, как он должен быть. Добавлю только, что Вир идет именно в этом направлении.
Напоследок скажу очевидную мысль: каждый класс в CLIP/CLOP языках ограничивает разработчика, каждый класс, каждый подкласс навешивает на разработчика гири, которые с каждым уровнем наследования становятся все тяжелее.
CLIP/CLOP – это тяжелая, ограничивающая программиста технология программирование. А нам, IMHO, нужна технология программирования, расширяющая возможности и упрощающая жизнь программиста.
Вывод: CLIP/CLOP – это тупик.
Говоря языком плаката: Each CLOP is a BUG.
Постоянная ссылка
Постоянная ссылка
> Объект может принадлежать любому количеству классов, причем, и таких, которые построены гораздо позже самого объекта.
А вот и хаскельные классы типов подъехали…