BonBonSlick
@BonBonSlick
Vanilla Full Stack Web Architector

Сколько вообще принципов ООП, не только основных?

Solid? (single responsibility, open-closed, Liskov substitution, interface segregation и dependency inversion)
Вики

Инкапсуляция, полиморфизм, абстракция и наследование? (что везде пишут)

Думаю вторые это как основные, но у них есть некоторые схожости по моему мнению с первым. Вот и возник вопрос, сколько вообще принципов? Или я что то не так понимаю?
  • Вопрос задан
  • 3581 просмотр
Решения вопроса 3
  • qonand
    @qonand
    Software Engineer
    Принципы ООП это инкапсуляция, наследование, полиморфизм и абстракция. Остальные принципы просто выступают в качестве рекомендаций для создания более качественного кода в рамках ООП. Помимо S.O.L.I.D есть еще:
    • LOD
    • Inversion of Control
    • CQS
    • GRASP-паттерны (как по мне это все-таки больше принципы чем паттерны)
    Ответ написан
  • @chaetal
    Не путайте принципы объектно-ориентированного программирования vs. правила хорошого объектного дизайна (читай "эвристики", некоторые наборы практик, которые при некоторых условиях и в каких-то случаях могут привести к более-менее качественной реализации поставленных задач).

    Вопрос был поставлен именно про принципы ООП, так что речь именно о них.

    Начну с того, что вопрос не очень корректен. "Неосновных" принципов можно нагородить много, только зачем? Чем меньше (и проще), тем лучше.

    Общепринятая формула "инкапсуляция, наследование, полиморфизм и абстракция" ("три кита ООП на черепахе-абстракции) — как раз пример того, как простую и мощную идею можно напрочь убить. Такие принципы часто плохо сформулированы, вызывают массу вопросов, плохо применяются на практике и, в конечном итоге, приводят к выводам о "сомнительной пользе от ООП".

    Можно предложить короткую и всеобъемлющую формулу в виде, близком к тому, который был сформулирован автором термина ООП: объекты и сообщения. Объекты — это "закрытые" сущности, которые умеют отвечать на сообщения. Сообщения — это "просьба" объекту что-то сделать; отличается от "обычного" вызова процедуры/функции/метода тем, что объект волен реагировать на полученное сообщение по своему усмотрению, то есть на этапе компиляции вы не можете точно сказать, какой именно код будет выполнен ("позднее связывание"). К этим принципам можно добавить еще самоподобие — все в программной системе является объектом (что призвано сделать систему более простой за счет единообразия).

    При реализации конкретного языка программирования, к этим принципам придется добавить еще какие-то детали: как собственно реализованы объекты (например, являются экземплярами классов), как определяется их поведение (при получении сообщения, объект лезет в свой класс и ищет там соответствующий метод; если метод не найдет, ищем в родительском классе…) и т.д.

    Такое определение может показаться непонятным, но из него можно вывести все необходимое в виде следствий или частных случаев. Относительно вышеупомянутых "трех китов ООП" в упрощенном виде это изложено здесь.

    Короче, вопрос-то сложный ;) Если есть желание на самом деле лучше разобраться в ООП и его принципах, рекомендую почитать The Early History Of Smalltalk. Да и вообще посмотреть на Smalltalk(лучше всего сейчас на Pharo), Self… и, может быть, на Erlang (на уровне процессов).

    А принципы проектирования (практики) выводятся из этой же формулы "объекты + сообщения" на основе практики — это отдельная и, наверное, еще большая тема. Кстати, есть гипотеза, что правильно используя Test-Driven Development, все нужные принципы получатся сами собой.
    Ответ написан
Пригласить эксперта
Ответы на вопрос 1
  • vechnoe
    @vechnoe
    Tornado, Django, Postgres, Asyncio, Clojure
    В ООП сомнительная польза
    www.yegor256.com/2016/08/15/what-is-wrong-object-o...
    www.yegor256.com/2017/03/28/solid.html
    SOLID is a money-making instrument, not an instrument to make code better.


    Ну а если освоить, то Гради Буч. Объектно-ориентированный анализ и проектирование
    Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы