Наверно лучше всего объяснять на метафоре живого языка. "Процедурное" программирование - это разговор глаголами: чтобы сделать Х мне надо проверить А, сформировать Б, обратиться к В за таким-то содержанием, и выделить из него части Г, которые скомбинировав вычислить результат.
А,Б,В,Г - это "существительные", некие сущности, "вещи" в самом абстрактном виде. Ими могут выступать файлы, строчки, структуры данных - всякие "что"-абстракции. А мои подпрограммы - глаголы, глагольные фразы (вроде того, как если удить, то "+ рыбу", читать книгу, спрашивать кого о чем (глагол + одушевленное + "о" + неодушевленное).
Думать так ЕСТЕСТВЕННО в первую очередь
ООП же возникло говорят для исполнения чрезвычайно громоздких проектов, о было решено объединять куски программы вокруг СУЩЕСТВИТЕЛЬНЫХ, а не глаголов, т.е. неких структур хранения или абстрактных сущностей, приписывая к ним "свойства" (attributes) и "глаголы" ("methods"):
-- у нас есть шкаф; у нас есть книги. У "объекта" шкаф есть внутренний абстрактный объект "книга", у которой может быть до 150 на трех "полках" "instances", "воплощений". У шкафа есть свойства "вместимость", "тип", а от "типа" зависят "методы" (функции, глаголы) доступа - "открыть", "вынуть", "поставить", "закрыть", "сортировать". Если шкаф с дверцами, открыть-закрыть не такие как для шкафа со сдвигаемым стеклом, но якобы внешне к ним обращаться надо так же.
Что мгновенно опознается мозгом как выморочное и вызывает естественный протест - лживость как "объектов" так и методов. Они ненатуральны, и то, как их удумал один человек другой не повторит.
Больше всего меня раздражает то, что "объекты" должны "обмениваться сообщениями" - они не обмениваются никакими сообщениями. Нет никакой реальности за представлением, что компьютер - лес, в котором постоянно якобы живут звери-обекты, которые якобы имеют свою волю и друг с другом разговаривают.
Далее, раздражает дичь того, что каждый мелкий чих оформляется в виде "объекта", и этот мусор выдается за эталон. В книге "банды четырех" ("Design Patterns") например, объясняют как это классно иметь объект-надзиратель за другим процессом - и когда ты прочитаешь пример, становится понятно, что вся мутота полностью эквивалентна установке булевой переменной-флага и ее проверке!
Я пробовал внутри своей головы перевернуть думалку и конструировать как бы высказывания на основе существительных: вот, "собрание". Его можно "проводить, созывать, распускать, закрывать, открывать". Но собрание также - событие во времени, поэтому его можно назначить (на дату), перенести, отменить. Вот уже надо встраивать "объект" в две иерархии. Далее, собрание есть множество людей. Поэтому оно может быть полным, некворумным, разгулявшимся или управляемым - третья иерархия.
Т.е. думая от существительных мы в принципе не получаем логичной однозначной последовательности, логика-организация надумана, всегда частична и произвольна. Почему "открыть" должно храниться вместе со шкафом - а для книги "открыть" будет другим, и храниться внутри "книги", и т.д. - мне неясно. За счет перечисления существительных мы повторяемся, увеличивая число глаголов - реальных компьютерных подпрограмм-вычислений, и это тоже насилует правдоподобие и понижает эффективность.
---------- Другими словами, идеальная процедура программирования должна бы соответствовать мышлению -- а поскольку мышление всегда происходит (или выражается в конце концов) на человеческом языке, то и программирование не должно бы насиловать наш язык, строясь как блоки-сочетания ему соответствующие.
При этом, разумеется, оно всегда будет составлять абстракции более высокого уровня из более мелких, это также естественно для работы мозга: ограаниченное поле внимания не позволяет оперировать миллионом деталей. Ключ в том, чтобы локальная работа над программными эпизодами была независимой - и увязывалась в логичное целое
И я тут думал о том же
Date: 2007-10-30 03:19 am (UTC)Наверно лучше всего объяснять на метафоре живого языка.
"Процедурное" программирование - это разговор глаголами:
чтобы сделать Х мне надо проверить А, сформировать Б, обратиться к В за таким-то содержанием, и выделить из него части Г, которые скомбинировав вычислить результат.
А,Б,В,Г - это "существительные", некие сущности, "вещи" в самом абстрактном виде. Ими могут выступать файлы, строчки, структуры данных - всякие "что"-абстракции.
А мои подпрограммы - глаголы, глагольные фразы (вроде того, как если удить, то "+ рыбу", читать книгу, спрашивать кого о чем (глагол + одушевленное + "о" + неодушевленное).
Думать так ЕСТЕСТВЕННО в первую очередь
ООП же возникло говорят для исполнения чрезвычайно громоздких проектов, о было решено объединять куски программы вокруг СУЩЕСТВИТЕЛЬНЫХ, а не глаголов, т.е. неких структур хранения или абстрактных сущностей, приписывая к ним "свойства" (attributes) и "глаголы" ("methods"):
-- у нас есть шкаф; у нас есть книги. У "объекта" шкаф есть внутренний абстрактный объект "книга", у которой может быть до 150 на трех "полках" "instances", "воплощений".
У шкафа есть свойства "вместимость", "тип", а от "типа" зависят "методы" (функции, глаголы) доступа - "открыть", "вынуть", "поставить", "закрыть", "сортировать". Если шкаф с дверцами, открыть-закрыть не такие как для шкафа со сдвигаемым стеклом, но якобы внешне к ним обращаться надо так же.
Что мгновенно опознается мозгом как выморочное и вызывает естественный протест - лживость как "объектов" так и методов. Они ненатуральны, и то, как их удумал один человек другой не повторит.
Больше всего меня раздражает то, что "объекты" должны "обмениваться сообщениями" - они не обмениваются никакими сообщениями. Нет никакой реальности за представлением, что компьютер - лес, в котором постоянно якобы живут звери-обекты, которые якобы имеют свою волю и друг с другом разговаривают.
Далее, раздражает дичь того, что каждый мелкий чих оформляется в виде "объекта", и этот мусор выдается за эталон.
В книге "банды четырех" ("Design Patterns") например, объясняют как это классно иметь объект-надзиратель за другим процессом - и когда ты прочитаешь пример, становится понятно, что вся мутота полностью эквивалентна установке булевой переменной-флага и ее проверке!
Я пробовал внутри своей головы перевернуть думалку и конструировать как бы высказывания на основе существительных:
вот, "собрание". Его можно "проводить, созывать, распускать, закрывать, открывать". Но собрание также - событие во времени, поэтому его можно назначить (на дату), перенести, отменить. Вот уже надо встраивать "объект" в две иерархии.
Далее, собрание есть множество людей. Поэтому оно может быть полным, некворумным, разгулявшимся или управляемым - третья иерархия.
Т.е. думая от существительных мы в принципе не получаем логичной однозначной последовательности, логика-организация надумана, всегда частична и произвольна. Почему "открыть" должно храниться вместе со шкафом - а для книги "открыть" будет другим, и храниться внутри "книги", и т.д. - мне неясно. За счет перечисления существительных мы повторяемся, увеличивая число глаголов - реальных компьютерных подпрограмм-вычислений, и это тоже насилует правдоподобие и понижает эффективность.
----------
Другими словами, идеальная процедура программирования должна бы соответствовать мышлению -- а поскольку мышление всегда происходит (или выражается в конце концов) на человеческом языке, то и программирование не должно бы насиловать наш язык, строясь как блоки-сочетания ему соответствующие.
При этом, разумеется, оно всегда будет составлять абстракции более высокого уровня из более мелких, это также естественно для работы мозга: ограаниченное поле внимания не позволяет оперировать миллионом деталей. Ключ в том, чтобы локальная работа над программными эпизодами была независимой - и увязывалась в логичное целое