Что такое нарушения принципов ООП?

Попалась довольно старая статья от зептолаб с разбором их конкурса. Там они очень ругали за "Грубые ошибки в коде. Они чаще всего связаны с нарушением принципов ООП".
Что под этим может пониматься?
Пытался нагуглить статьи в тему. Но "базовых принципов" и солида на первых страницах нет
  • Вопрос задан
  • 4330 просмотров
Пригласить эксперта
Ответы на вопрос 7
SamDark
@SamDark
Yii2 core team
Скорее всего имеются ввиду инкапсуляция, наследование и полиморфизм. Они самые базовые.
Ответ написан
mr_T
@mr_T
Web-разработчик
3 заветных слова: наследование, инкапсуляция, полиморфизм. По ним можно много нагуглить.
Элементарный пример нарушения принципа инкапсуляции - объявление public поля класса. Нужно все поля делать private, а доступ к ним организовывать через методы доступа типа get..., set... или как-то более прозрачно, если позволяет язык (__get, __set в php, свойства в C#). По наследованию и полиморфизму накосячить уже сложнее, так как этого не позволит синтаксис скорее всего. Хотя кто знает, какие у человека есть скрытые возможности...
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Нарушение инкапсуляции. Наружу (т.е. public) торчат какие-то данные, которые можно изменить, и объект уходит в противоречивое состояние.

Инверсия абстракции. Простые вещи, которые, вероятно, понадобятся потомкам, недоступны даже через protected.

Нарушение принципа Лисков (ломаная абстракция). Для отца вы сделали некое предположение, которое неверно для сыновей. Классический пример — прямоугольник и квадрат — предполагается, что отец может произвольно масштабироваться, что неверно для сына.

Класс вместо интерфейса. Если можно, родителя делайте классом без данных с двумя видами функций: public virtual = 0, и protected/public не-virtual (т.н. интерфейс с утилитами). Наследоваться от нескольких классов с данными очень некузяво (а во многих языках вообще невозможно).

Всемогущий родитель. Слишком много функциональности придумали родительскому классу.

В общем, покажите интерфейсы (protected/public, без точных реализаций) ваших классов, и погоняем, что там неверного.
Ответ написан
Комментировать
@mamkaololosha
Gang of Four, SOLID и прочие фабрики-синглтоны-обзерверы. Видимо зептолабам не понравилось, как авторы их намешали в коде.
Ответ написан
Комментировать
@raiboon Автор вопроса
Все обрывки фраз понабросали...
В общем, пока что увидел:
  • Использование copy-paste вместо наследования-полиморфизма
  • Неиспользование инкапсуляции - отсутсвие геттеров-сеттеров, игнорирование модификаторов доступа к свойствам
  • Применение паттернов не к месту


Я правильно вас понял, господа? Есть что еще добавить?
Ответ написан
Комментировать
donkaban
@donkaban
Умею рисовать тени
https://ru.wikipedia.org/wiki/SOLID_(объектно-ориентированное_программирование)
Ответ написан
Комментировать
@potan
Функциональный программист
Основное нарушение в чужем коде, которое очень мешало мне мешало когда я программировал на ОО-языках - игнорирование принципа подстановки Лисков.
То есть код, корректно работающий с объектом базового класса, должен так же корректно работать с отъуктом класса-наследника.
Пример нарушения - SSL-сокет в библиотеке Qt унаследован от простого сокета, но для корректного завершения соединения требует других плясок с бубном.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы