Многие вещи, которые мы привыкли причислять к ООП, такие как классы и наследование, это лишь средства моделирования предметной области средствами языка программирования, не более. Теперь по порядку.
Инкапсуляция.
В программе, состоящей из объектов обменивающихся сообщениями, этот принцип выполняется автоматически. Единственное, что может один объект сделать с другим - послать ему сообщение. Другой объект, отреагировав на это сообщение, может изменить свое состояние. Непосредственно изменять состояние друг друга, в нашей гипотетической true OOP системе, объекты не могут. Следовательно, инкапсуляция, лишь средство, с помощью которого принципы ООП реализуются в том или ином языке программирования.
Наследование.
Всего лишь позволяет моделировать отношения между сущностями, не между самими объектами.
Полиморфизм.
Обычно его понимают как subtype полиморфизм - использование объекта производного класса, вместо объекта базового класса. Для нашей true OOP системы это не актуально, так как любому объекту, можно послать любое сообщение. Это актуально для тех языков программирования, в которых передача сообщения объекту реализована как вызов виртуального метода этого объекта.
В качестве примера true OOP системы программирования, можно привести совсем не ООП(по крайней мере в головах mainstream программистов) язык программирования - Erlang. Его процессы - классические объекты, конечно у процесса нет класса, свойств, методов, процессы не наследуются, и так далее. Но, erlang программа - это множество обменивающихся сообщениями процессов/объектов. Получив сообщение, процесс может изменить свое состояние - сделать что-нибудь. Поэтому, erlang - не менее объектно ориентированный, чем Java или Python :)
P.S.
Этим постом я не пытаюсь сказать, что использовать mainstream языки программирования - плохо и что всем нужно срочно переходить на Erlang. Просто мысли вслух :)
14 комментариев:
Этим заявлением сложно удивить человека пишущим на том же С#.
Хотя конечно дельфятники найдут много нового.
ИМХО вы не правы тк :
"На самом деле ООП, это парадигма программирования, согласно которой программа состоит из объектов, обменивающихся сообщениями. Объекты могут обладать состоянием, единственный способ изменить состояние объекта - послать ему сообщение, в ответ на которое, объект может изменить собственное состояние." - это парадигма ОБЬЕКТНОГО языка но НЕ ОБЬЕКТНО ОРИЕНТИРОВАННОГО.
А ОБЬЕКТНО ОРИЕНТИРОВАННЫЙ это :
инкапсуляция, наследование и полиморфизм.
Еще :
"
инкапсуляция ....
В программе, состоящей из объектов обменивающихся сообщениями, этот принцип выполняется автоматически.
"
Не верно - как пример чистый С ( там возможны обьекты и методы но инкапсуляции фактически нет )
Имхо вы не видите разницы ОБЬЕКТНЫЙ И ОЬЕКТНО ОРИЕНТИРОВАННЫЙ, а она есть .....
Имхо вы не видите разницы ОБЬЕКТНЫЙ И ОЬЕКТНО ОРИЕНТИРОВАННЫЙ, а она есть .....На самом деле такого понятия как объектный язык программирования не существует. Некоторые авторы называют объектными - языки, предназначенные для работы с объектами, а именно - VBScript. Но устоявшегося понятия - объектный - не существует.
А ОБЬЕКТНО ОРИЕНТИРОВАННЫЙ это :
инкапсуляция, наследование и полиморфизм.Это свойства языков программирования, если они соблюдаются, то язык можно считать объектно ориентированным.
Не верно - как пример чистый С ( там возможны обьекты и методы но инкапсуляции фактически нет )Если объекты и методы возможны в Си, то это вовсе не означает, что Си - объектно ориентированный язык.
В общем, объектно ориентированное программирование, это когда мы строим программу из взаимодействующих объектов, причем вовсе не обязательно использовать для этого язык, поддерживающий парадигму ООП. Впрочем и наоборот, на Java или Ruby вполне можно писать в процедурном стиле.
"Но устоявшегося понятия - объектный - не существует.
"
Возможно. Но Вы то поняли о чем я :)
В любой ООП литературе вначале описывают "3-х китов, на которых все стоит" и отрицать это, а тем более сводить ООП к обмену сообщениями это как-то ....
Может я запутанно написал свой коммент, но все фактически что я хотел сказать это : не только ООП-языки поддерживают обмен сообщений объектами , соответственно судить по этому о принадлежности к ООП нельзя.
"Если объекты и методы возможны в Си, то это вовсе не означает, что Си - объектно ориентированный язык. "
Именно об этом я и говорю. Си в каком то смысле Объектный язык, есть объекты , возможны сообщения - но инкапсуляции нету и нет ООП.
Этой записью в своем дорогом дневничке, я хотел обратить внимание на то, что под ООП обычно понимают то как оно реализовано в некоторых языках программирования, таких как C++, Java или C#. На самом деле это немного другое. Вот собственно и все :)
Да, да, да! И ещё раз да! Старое-доброе "Я придумал термин "объектно-ориентированный", и вот что я вам скажу, я не имел ввиду С++." (с) Алан Кей, OOPSLA '97
В качестве примера можно ещё упомянуть Smalltalk. Собственно ветер дует оттуда. Неплохо изложено тут.
"Я придумал термин "объектно-ориентированный", и вот что я вам скажу, я не имел ввиду С++."
Но это же как раз и есть то, что отличает C от C++
kemiisto, Smalltalk какой-то совсем уж не известный язык, кто про него кроме вас вообще знает?
Дорогой автор, будет очень интересным твоё мнение о критике ООП, в частности вот тут:
http://blogerator.ru/page/oop_why-objects-have-failed
В cамом ли деле у ООП нет будущего?
Автору спасибо за пост!
Объекты могут обладать состоянием, единственный способ изменить состояние объекта - послать ему сообщение ...
'В начале обучения' основам программирования ничего не понятно (к чему утверждение? что с этим делать?), а к тому времени как начинаешь чувствовать что такое ООП мозги уже настроены на упомянутых 3-х китов :) Наверное именно по этому многие помнят про инкапсуляцию и наследование но забывают об объектах и сообщениях.
Автору спасибо за пост!
Объекты могут обладать состоянием, единственный способ изменить состояние объекта - послать ему сообщение ...
'В начале обучения' основам программирования ничего не понятно (к чему утверждение? что с этим делать?), а к тому времени как начинаешь чувствовать что такое ООП мозги уже настроены на упомянутых 3-х китов :) Наверное именно по этому многие помнят про инкапсуляцию и наследование но забывают об объектах и сообщениях.
Да, да, да! И ещё раз да! Старое-доброе "Я придумал термин "объектно-ориентированный", и вот что я вам скажу, я не имел ввиду С++." (с) Алан Кей, OOPSLA '97
В качестве примера можно ещё упомянуть Smalltalk. Собственно ветер дует оттуда. Неплохо изложено тут.
Имхо вы не видите разницы ОБЬЕКТНЫЙ И ОЬЕКТНО ОРИЕНТИРОВАННЫЙ, а она есть .....На самом деле такого понятия как объектный язык программирования не существует. Некоторые авторы называют объектными - языки, предназначенные для работы с объектами, а именно - VBScript. Но устоявшегося понятия - объектный - не существует.
А ОБЬЕКТНО ОРИЕНТИРОВАННЫЙ это :
инкапсуляция, наследование и полиморфизм.Это свойства языков программирования, если они соблюдаются, то язык можно считать объектно ориентированным.
Не верно - как пример чистый С ( там возможны обьекты и методы но инкапсуляции фактически нет )Если объекты и методы возможны в Си, то это вовсе не означает, что Си - объектно ориентированный язык.
В общем, объектно ориентированное программирование, это когда мы строим программу из взаимодействующих объектов, причем вовсе не обязательно использовать для этого язык, поддерживающий парадигму ООП. Впрочем и наоборот, на Java или Ruby вполне можно писать в процедурном стиле.
Отправить комментарий