воскресенье, 28 февраля 2010 г.

Принципы ООП

Мне кажется, многие люди неправильно понимают что такое ООП. Если вы попросите любого программиста дать определение ООП, то чаще всего получите один и тот же ответ - ООП, это инкапсуляция, наследование и полиморфизм. На самом деле ООП, это парадигма программирования, согласно которой программа состоит из объектов, обменивающихся сообщениями. Объекты могут обладать состоянием, единственный способ изменить состояние объекта - послать ему сообщение, в ответ на которое, объект может изменить собственное состояние. Я знаю, что вы это и так знаете, я про других программистов :)
Многие вещи, которые мы привыкли причислять к ООП, такие как классы и наследование, это лишь средства моделирования предметной области средствами языка программирования, не более. Теперь по порядку.
Инкапсуляция.
В программе, состоящей из объектов обменивающихся сообщениями, этот принцип выполняется автоматически. Единственное, что может один объект сделать с другим - послать ему сообщение. Другой объект, отреагировав на это сообщение, может изменить свое состояние. Непосредственно изменять состояние друг друга, в нашей гипотетической true OOP системе, объекты не могут. Следовательно, инкапсуляция, лишь средство, с помощью которого принципы ООП реализуются в том или ином языке программирования.
Наследование.
Всего лишь позволяет моделировать отношения между сущностями, не между самими объектами.
Полиморфизм.
Обычно его понимают как subtype полиморфизм - использование объекта производного класса, вместо объекта базового класса. Для нашей true OOP системы это не актуально, так как любому объекту, можно послать любое сообщение. Это актуально для тех языков программирования, в которых передача сообщения объекту реализована как вызов виртуального метода этого объекта.
В качестве примера true OOP системы программирования, можно привести совсем не ООП(по крайней мере в головах mainstream программистов) язык программирования - Erlang. Его процессы - классические объекты, конечно у процесса нет класса, свойств, методов, процессы не наследуются, и так далее. Но, erlang программа - это множество обменивающихся сообщениями процессов/объектов. Получив сообщение, процесс может изменить свое состояние - сделать что-нибудь. Поэтому, erlang - не менее объектно ориентированный, чем Java или Python :)
P.S.
Этим постом я не пытаюсь сказать, что использовать mainstream языки программирования - плохо и что всем нужно срочно переходить на Erlang. Просто мысли вслух :)

14 комментариев:

mrbrooks комментирует...

Этим заявлением сложно удивить человека пишущим на том же С#.
Хотя конечно дельфятники найдут много нового.

Andy комментирует...

ИМХО вы не правы тк :

"На самом деле ООП, это парадигма программирования, согласно которой программа состоит из объектов, обменивающихся сообщениями. Объекты могут обладать состоянием, единственный способ изменить состояние объекта - послать ему сообщение, в ответ на которое, объект может изменить собственное состояние." - это парадигма ОБЬЕКТНОГО языка но НЕ ОБЬЕКТНО ОРИЕНТИРОВАННОГО.

А ОБЬЕКТНО ОРИЕНТИРОВАННЫЙ это :
инкапсуляция, наследование и полиморфизм.

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

Имхо вы не видите разницы ОБЬЕКТНЫЙ И ОЬЕКТНО ОРИЕНТИРОВАННЫЙ, а она есть .....

Lazin комментирует...

Имхо вы не видите разницы ОБЬЕКТНЫЙ И ОЬЕКТНО ОРИЕНТИРОВАННЫЙ, а она есть .....На самом деле такого понятия как объектный язык программирования не существует. Некоторые авторы называют объектными - языки, предназначенные для работы с объектами, а именно - VBScript. Но устоявшегося понятия - объектный - не существует.
А ОБЬЕКТНО ОРИЕНТИРОВАННЫЙ это :
инкапсуляция, наследование и полиморфизм.
Это свойства языков программирования, если они соблюдаются, то язык можно считать объектно ориентированным.
Не верно - как пример чистый С ( там возможны обьекты и методы но инкапсуляции фактически нет )Если объекты и методы возможны в Си, то это вовсе не означает, что Си - объектно ориентированный язык.
В общем, объектно ориентированное программирование, это когда мы строим программу из взаимодействующих объектов, причем вовсе не обязательно использовать для этого язык, поддерживающий парадигму ООП. Впрочем и наоборот, на Java или Ruby вполне можно писать в процедурном стиле.

Andy комментирует...

"Но устоявшегося понятия - объектный - не существует.
"

Возможно. Но Вы то поняли о чем я :)
В любой ООП литературе вначале описывают "3-х китов, на которых все стоит" и отрицать это, а тем более сводить ООП к обмену сообщениями это как-то ....

Может я запутанно написал свой коммент, но все фактически что я хотел сказать это : не только ООП-языки поддерживают обмен сообщений объектами , соответственно судить по этому о принадлежности к ООП нельзя.

"Если объекты и методы возможны в Си, то это вовсе не означает, что Си - объектно ориентированный язык. "
Именно об этом я и говорю. Си в каком то смысле Объектный язык, есть объекты , возможны сообщения - но инкапсуляции нету и нет ООП.

Lazin комментирует...

Этой записью в своем дорогом дневничке, я хотел обратить внимание на то, что под ООП обычно понимают то как оно реализовано в некоторых языках программирования, таких как C++, Java или C#. На самом деле это немного другое. Вот собственно и все :)

Анонимный комментирует...
Этот комментарий был удален администратором блога.
kemiisto комментирует...

Да, да, да! И ещё раз да! Старое-доброе "Я придумал термин "объектно-ориентированный", и вот что я вам скажу, я не имел ввиду С++." (с) Алан Кей, OOPSLA '97

В качестве примера можно ещё упомянуть Smalltalk. Собственно ветер дует оттуда. Неплохо изложено тут.

Rapid комментирует...

"Я придумал термин "объектно-ориентированный", и вот что я вам скажу, я не имел ввиду С++."
Но это же как раз и есть то, что отличает C от C++

Knight комментирует...

kemiisto, Smalltalk какой-то совсем уж не известный язык, кто про него кроме вас вообще знает?

Анонимный комментирует...

Дорогой автор, будет очень интересным твоё мнение о критике ООП, в частности вот тут:

http://blogerator.ru/page/oop_why-objects-have-failed

В cамом ли деле у ООП нет будущего?

Макс комментирует...

Автору спасибо за пост!

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

Макс комментирует...

Автору спасибо за пост!

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

kemiisto комментирует...

Да, да, да! И ещё раз да! Старое-доброе "Я придумал термин "объектно-ориентированный", и вот что я вам скажу, я не имел ввиду С++." (с) Алан Кей, OOPSLA '97

В качестве примера можно ещё упомянуть Smalltalk. Собственно ветер дует оттуда. Неплохо изложено тут.

Lazin комментирует...

Имхо вы не видите разницы ОБЬЕКТНЫЙ И ОЬЕКТНО ОРИЕНТИРОВАННЫЙ, а она есть .....На самом деле такого понятия как объектный язык программирования не существует. Некоторые авторы называют объектными - языки, предназначенные для работы с объектами, а именно - VBScript. Но устоявшегося понятия - объектный - не существует.
А ОБЬЕКТНО ОРИЕНТИРОВАННЫЙ это :
инкапсуляция, наследование и полиморфизм.
Это свойства языков программирования, если они соблюдаются, то язык можно считать объектно ориентированным.
Не верно - как пример чистый С ( там возможны обьекты и методы но инкапсуляции фактически нет )Если объекты и методы возможны в Си, то это вовсе не означает, что Си - объектно ориентированный язык.
В общем, объектно ориентированное программирование, это когда мы строим программу из взаимодействующих объектов, причем вовсе не обязательно использовать для этого язык, поддерживающий парадигму ООП. Впрочем и наоборот, на Java или Ruby вполне можно писать в процедурном стиле.