Добавил:
выбрасываю тут свой мусор, надеюсь, что он кому-то может пригодится... Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP-KONEChNYJ.docx
Скачиваний:
20
Добавлен:
03.12.2023
Размер:
7.72 Mб
Скачать

40. Принцип открытости/закрытости (ocp) и его соответствие шаблонам полиморфизм и защита от изменений.

Данный принцип гласит — "программные сущности должны быть открыты для расширения, но закрыты для модификации". На более простых словах это можно описать так — все классы, функции и т.д. должны проектироваться так, чтобы для изменения их поведения, нам не нужно было изменять их исходный код.

Принцип OCP означает, что программные сущности должны быть:

  • открыты для расширения: означает, что поведение сущности может быть расширено, путём создания новых типов сущностей.

  • закрыты для изменения: в результате расширения поведения сущности, не должны вносится изменения в код, которые эти сущности использует.

Изменять существующий код – плохо, есть риск допустить ошибки в уже написанном коде. Модификация кода должна происходить другими способами.

В течение 1990-х принцип открытости/закрытости стал де-факто переопределён для применения с абстрактными интерфейсами, реализации которых могут быть изменены, и могут быть созданы множественные реализации и полиморфно замещены одна на другую.

41. Формулировка и назначение принципа подстановки Liskov (lsv).

Принцип гласит — «Объекты в программе могут быть заменены их наследниками без изменения свойств программы». Своими словами я бы это сказал так — при использовании наследника класса результат выполнения кода должен быть предсказуем и не изменять свойств метод.

  • Предусловия не могут быть усилены в подклассе.

  • Постусловия не могут быть ослаблены в подклассе.

Предусловия – это то, что должно быть выполнено вызывающей стороной перед вызовом метода, постусловия – это то, что, гарантируется вызываемым методом.

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

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

42. Назначение и структура принципа разделения интерфейсов (isp).

Данный принцип гласит, что «Много специализированных интерфейсов лучше, чем один универсальный»

Соблюдение этого принципа необходимо для того, чтобы классы-клиенты использующий/реализующий интерфейс знали только о тех методах, которые они используют, что ведёт к уменьшению количества неиспользуемого кода.

Следование этому принципу помогает системе оставаться гибкой при внесении изменений в логику работы и пригодной для рефакторинга.

Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более маленькие и специфические, чтобы клиенты маленьких интерфейсов знали только о методах, которые необходимы им в работе. В итоге, при изменении метода интерфейса не должны меняться клиенты, которые этот метод не используют.

43. Назначение и структура принципа инверсии зависимостей (dip).

Принцип инверсии зависимостей (Dependency Inversion Principle) служит для создания слабосвязанных сущностей, которые легко тестировать, модифицировать и обновлять. Этот принцип можно сформулировать следующим образом:

  • Модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те и другие должны зависеть от абстракций.

  • Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

«DIP выражается простым эвристическим правилом: «Зависеть надо от абстракций». Оно гласит, что не должно быть зависимостей от конкретных классов; все связи в программе должны вести на абстрактный класс или интерфейс.

  • Не должно быть переменных, в которых хранятся ссылки на конкретные классы.

  • Не должно быть классов, производных от конкретных классов.

  • Не должно быть методов, переопределяющих метод, реализованный в одном из базовых классов

Соседние файлы в предмете Объектно-ориентированное программирование