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

Принципы ООП

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

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

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

    ОтветитьУдалить
  2. ИМХО вы не правы тк :

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

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

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

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

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

    ОтветитьУдалить
  4. "Но устоявшегося понятия - объектный - не существует.
    "

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

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

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

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

    ОтветитьУдалить
  6. Этот комментарий был удален администратором блога.

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

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

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

    ОтветитьУдалить
  9. kemiisto, Smalltalk какой-то совсем уж не известный язык, кто про него кроме вас вообще знает?

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

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

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

    ОтветитьУдалить
  11. Автору спасибо за пост!

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

    ОтветитьУдалить
  12. Автору спасибо за пост!

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

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

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

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

    ОтветитьУдалить