Что такое Солид? Это… Значение на

Принцип единственной ответственности

Принцип единственной ответственности (SRP) гласит:

У класса должна быть одна и только одна причина для изменения, то есть у класса должна быть только одна работа.

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

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

В случае квадратов необходимо знать длину стороны:

В случае кругов необходимо знать радиус:

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

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

Вот пример с набором из трех фигур:

  • круг радиусом 2
  • квадрат с длиной стороны 5
  • второй квадрат с длиной стороны 6

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

Давайте рассмотрим сценарий, в котором вывод необходимо конвертировать в другой формат, например, JSON.

Вся логика будет обрабатываться классом AreaCalculator. Это нарушит принцип единственной ответственности. Класс AreaCalculator должен отвечать только за вычисление суммы площадей заданных фигур. Он не должен учитывать, что пользователь хочет получить результат в формате JSON или HTML.

Для решения этой проблемы вы можете создать отдельный класс SumCalculatorOutputter и использовать этот новый класс для обработки логики, необходимой для вывода данных пользователю:

Класс SumCalculatorOutputter должен работать следующим образом:

Логика, необходимая для вывода данных пользователю, обрабатывается классом SumCalculatorOutputter.

Это соответствует принципу единственной ответственности.

Видео

Принцип подстановки Барбары Лисков (Liskov Substitution Principle)

Барбара ЛисковДженнет УингПусть φ(x) — доказуемое свойство объекта x типа T. Тогда φ(y) должно быть верным для объектов y типа S, где S — подтип T.удобочитаемой версии
  1. Предварительные условия не могут быть усилены в подтипе.
  2. Постусловия не могут быть ослаблены в подтипе.
  3. Инварианты супертипа могут быть сохранены в подтипе.
Функции, использующие указатели ссылок на базовые классы, должны уметь использовать объекты производных классов, даже не зная об этом.

Принцип подстановки Лисков

Принцип подстановки Лисков гласит:

Пусть q(x) будет доказанным свойством объектов x типа T. Тогда q(y) будет доказанным свойством объектов y типа S, где S является подтипом T.

Это означает, что каждый подкласс или производный класс должен быть заменяемым на базовый класс или родительский класс.

Возьмем класс AreaCalculator из нашего примера и рассмотрим новый класс VolumeCalculator, расширяющий класс AreaCalculator:

Помните, что класс SumCalculatorOutputter выглядит примерно так:

Если мы попробуем выполнить такой пример:

Когда мы вызовем метод HTML для объекта $output2, мы получим сообщение об ошибке E_NOTICE, информирующее нас о преобразовании массива в строку.

Чтобы исправить это, вместо вывода массива из метода sum класса VolumeCalculator мы будем возвращать $summedData:

Значение $summedData может быть дробным числом, двойным числом или целым числом.

Это соответствует принципу подстановки Лисков.

Принцип инверсии зависимостей (DIP)

зависимости внутри системы строятся на основе абстракцийOrderProcessorOrderProcessorMySQLOrderRepositoryConfirmationEmailSenderMailSenderOrderRepositoryOrderProcessorOrderProcessorТеги

Теги