Здравствуйте, Rumata, Вы писали:
R>Сразу просьба: не кидайте тухлыми овощами. =)
R>Пару месяцев назад задался целью узнать, что такое ООП. Максимум, что получилось — вышел на omg. Но там тоже толком ничего нет. Может быть all сможет показать мне четкую формулировку, что же такое этот самый ООП =)
К сожалению, так получилось, что термин ООП стал жертвой исторических обстоятельств.
Теперь по порядку...
Автором концепии ООП является Алан Кей. Мотивацией создания ООП послужили два основных источника — SketchPad и Simula.
SketchPad — абсолютно новая и непривычная (на то время — 1966) графическая система. Основные идеи — интерактивная компьютерная графика, наличие master и instance рисунков (похоже на класс-объект), наличие динамических constraints, задающие форму и отношение частей рисунка.
Simula — system-oriented language. Имелись activities и processes (аналогично masters и instances в SketchPad). Simula был процедурным языком, имеющим средства создания и контролирования объектов.
Кроме того, имея биологическое образование Алан Кей пытался найти простые механизмы, контролирующие сложные процессы. Как-то он услышал слова одного профессора и Юты: "Базовым принципом рекурсивного дизайна является наделение частей теми же возможностями, что и целого". После этого он задумался о компьютере как о целом, которое все зачем-то пытаются поделить на более слабые понятия, такие как структуры данных и процедуры.
После этого Алан Кей сформулировал три базовых принципа объектного подхода:
1. Объект — базовая единица системы.
2. Объекты обладают состоянием.
3. Единственным способом взаимодействия между объектами является посылка сообщения. Объекты сами определяют как обрабатывать сообщения.
Соответственно объектно-ориентированным языком является язык, который взаимодействует с такой системой объектов посредством посылки сообщения.
Заметьте, тут ничего не говорится про классы и наследование.
Но почему-то так вышло, что все обратились к модели Simula, т.е. навесили ООП ярлык ИНКАПСУЛЯЦИЯ, ПОЛИМОРФИЗМ, НАСЛЕДОВАНИЕ. И главными ценностями были провозглашены модульность и повторное использование.
Но это является пагубным упрощением, которое практически сводит на нет всю идею объектного подхода. Где главным выигрышем является возможность непосредственного манипулирования динамическим миром объектов посредством гибкой операции посылки сообщения, минуя привычную чрезмерную серию трансформаций текст->код->запуск->взаимодействие->результаты->текст->...
Кое-что на эту тему можно прочитать
здесь.
Поэтому ООП можно условно поделить на две категории — OBJECT-oriented и object-ORIENTED.
В первом случае имеем полноценную динамическую систему (Smalltalk, Self, отчасти Objective-C, Ruby), во втором — процедуры, завернутые в классы (Simula, C++, Java, C#).
--
Владимир.