CLIP/CLOP vs pure OOP

Пока народ безграмотен, из всех искусств важнейшими для нас являются кино и цирк.

В. И. Ленин, полн. собр. соч. — 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.

2 комментария



  1. > Объект может принадлежать любому количеству классов, причем, и таких, которые построены гораздо позже самого объекта.

    А вот и хаскельные классы типов подъехали…

    Ответить

Добавить комментарий для Евгений Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *