yigal_s: (Default)
[personal profile] yigal_s
Где ООП явно не в тему - это ГУИ (пример правильного построения гуя - Fudgets).

[link]

Я так-сяк повертел это заявление (и прочие, прочитанные на sql.ru), вспомнил некоторые почему-то не получившиеся для написания задачи из своей практики, равно как и некоторые "гениальные ООП решения", и сформулировал супер-радикальный тезис:

Объектно ориентированное программирование менее всего подходит для отображения объектов реального мира (включая сюда и объекты - элементы GUI) в объекты (в терминологии OOP/D) программы.

Пожалуй, истиннонсть этого тезиса мне пока трудно всерьез обосновать (ложность же напрашивается). Но что-то в этом есть. По крайней мере, стоит об этом тезисе вспоминать, прежде чем бросаться всё и вся выражать в виде объектов и протокола их взаимодействия, а потом тупо думать - что ж оно всё никак не выражается?

Почитать, что ли Симулу какую... Для избавления от ереси неверия в то, во что верил последние 14 лет.

Date: 2007-10-30 03:18 am (UTC)
From: [identity profile] gadyuka.livejournal.com
О, боже! Как давно я это всем говорю! Да еще и долгих шесть лет убила на то, чтобы создать альтернативную ООПу программную идеологию :)

Date: 2007-10-30 03:20 am (UTC)
From: (Anonymous)
Делитесь, я поделюсь своей (она у меня странная, да, но позволяет своими средствами выражать и функциональные и объектные трюки)

Date: 2007-10-30 09:52 am (UTC)
From: [identity profile] aamonster.livejournal.com
Плохо вы как-то говорите. Настолько, что я даже не исключаю, что вы говорите правильные вещи - просто не можете их объяснить :-)

Date: 2007-10-30 10:23 am (UTC)
From: [identity profile] gadyuka.livejournal.com
Может быть. А что именно, на Ваш взгляд, плохо?

Date: 2007-10-30 12:51 pm (UTC)
From: [identity profile] aamonster.livejournal.com
Непонятно. Покопался - и с ходу в предлагаемую вами альтернативу врубиться не смог. Что-то похожее на прототипное программирование, но довольно-таки неочевидно все.
Вот, к примеру, ниже под этим же постом анонимус на примере глаголов и существительных ругает ОО-программирование - тут все понятно. И понятно, как спорить, если придет охота: объект - это не обязательно существительное, вполне можно объектами считать глаголы =).

Если б понял, в чем суть - постарался бы объяснить своими словами, авось понятнее бы получилось.

И я тут думал о том же

Date: 2007-10-30 03:19 am (UTC)
From: (Anonymous)
Хмм.. на днях был озабочен такими же мыслями.

Наверно лучше всего объяснять на метафоре живого языка.
"Процедурное" программирование - это разговор глаголами:
чтобы сделать Х мне надо проверить А, сформировать Б, обратиться к В за таким-то содержанием, и выделить из него части Г, которые скомбинировав вычислить результат.

А,Б,В,Г - это "существительные", некие сущности, "вещи" в самом абстрактном виде. Ими могут выступать файлы, строчки, структуры данных - всякие "что"-абстракции.
А мои подпрограммы - глаголы, глагольные фразы (вроде того, как если удить, то "+ рыбу", читать книгу, спрашивать кого о чем (глагол + одушевленное + "о" + неодушевленное).

Думать так ЕСТЕСТВЕННО в первую очередь


ООП же возникло говорят для исполнения чрезвычайно громоздких проектов, о было решено объединять куски программы вокруг СУЩЕСТВИТЕЛЬНЫХ, а не глаголов, т.е. неких структур хранения или абстрактных сущностей, приписывая к ним "свойства" (attributes) и "глаголы" ("methods"):

-- у нас есть шкаф; у нас есть книги. У "объекта" шкаф есть внутренний абстрактный объект "книга", у которой может быть до 150 на трех "полках" "instances", "воплощений".
У шкафа есть свойства "вместимость", "тип", а от "типа" зависят "методы" (функции, глаголы) доступа - "открыть", "вынуть", "поставить", "закрыть", "сортировать". Если шкаф с дверцами, открыть-закрыть не такие как для шкафа со сдвигаемым стеклом, но якобы внешне к ним обращаться надо так же.

Что мгновенно опознается мозгом как выморочное и вызывает естественный протест - лживость как "объектов" так и методов. Они ненатуральны, и то, как их удумал один человек другой не повторит.

Больше всего меня раздражает то, что "объекты" должны "обмениваться сообщениями" - они не обмениваются никакими сообщениями. Нет никакой реальности за представлением, что компьютер - лес, в котором постоянно якобы живут звери-обекты, которые якобы имеют свою волю и друг с другом разговаривают.

Далее, раздражает дичь того, что каждый мелкий чих оформляется в виде "объекта", и этот мусор выдается за эталон.
В книге "банды четырех" ("Design Patterns") например, объясняют как это классно иметь объект-надзиратель за другим процессом - и когда ты прочитаешь пример, становится понятно, что вся мутота полностью эквивалентна установке булевой переменной-флага и ее проверке!

Я пробовал внутри своей головы перевернуть думалку и конструировать как бы высказывания на основе существительных:
вот, "собрание". Его можно "проводить, созывать, распускать, закрывать, открывать". Но собрание также - событие во времени, поэтому его можно назначить (на дату), перенести, отменить. Вот уже надо встраивать "объект" в две иерархии.
Далее, собрание есть множество людей. Поэтому оно может быть полным, некворумным, разгулявшимся или управляемым - третья иерархия.

Т.е. думая от существительных мы в принципе не получаем логичной однозначной последовательности, логика-организация надумана, всегда частична и произвольна. Почему "открыть" должно храниться вместе со шкафом - а для книги "открыть" будет другим, и храниться внутри "книги", и т.д. - мне неясно. За счет перечисления существительных мы повторяемся, увеличивая число глаголов - реальных компьютерных подпрограмм-вычислений, и это тоже насилует правдоподобие и понижает эффективность.

----------
Другими словами, идеальная процедура программирования должна бы соответствовать мышлению -- а поскольку мышление всегда происходит (или выражается в конце концов) на человеческом языке, то и программирование не должно бы насиловать наш язык, строясь как блоки-сочетания ему соответствующие.

При этом, разумеется, оно всегда будет составлять абстракции более высокого уровня из более мелких, это также естественно для работы мозга: ограаниченное поле внимания не позволяет оперировать миллионом деталей. Ключ в том, чтобы локальная работа над программными эпизодами была независимой - и увязывалась в логичное целое

Полнота

Date: 2007-10-30 03:26 am (UTC)
From: (Anonymous)
Есть и еще одна сторона.

Когда возникало "структурное" программирование, математики озаботились доказательствами и подбором минимально необходимого числа действий для полного выражения всего, что можно выразить.
Как в логике все можно свести к двум операторам, так, оказалось, для эквивалентности вычислялке Тьюринга достаточно иметь: (а) последовательность действий (б) ветвления и (в) повторения

Для объектно-ориентированной модели подобных доказательств полноты, насколько я знаю, не существует