Принципы SOLID на примерах в Swift

Принцип открытости закрыт

ТВЕРДЫЙ Swift

В первой части мы описали, что такое принципы SOLID и что они пытаются решить, объяснив первый принцип, единоличная ответственность.



В этой части мы исследуем следующий принцип:

Принцип открытого-закрытого был определен Бертраном Мейером в 1988 году. Он сказал:

«Программные объекты должны быть открыты для расширения, но закрыты для модификации».

Эту концепцию следует расширить и применить к любым другим модулям, классам или функциям. Это не так просто, как кажется.

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

Итак, каждый раз, когда нам нужно изменить существующий код, в игру вступает принцип открытого-закрытого.

Бертран Мейер предложил использовать наследование для достижения этого принципа, но Роберт К. Мартин и другие пересмотрели его, чтобы использовать полиморфную форму.

Я предпочитаю использовать современный подход с использованием композиции, интерфейсов (протоколов), внедрения зависимостей и шаблонов проектирования (в качестве декоратора).

Давайте посмотрим на следующий пример:

У нас есть калькулятор инвестиций в производстве с предыдущим кодом, следуя предыдущей практике (единоличная ответственность). Мы выделили доходность инвестиций в класс с именемInvestmentManager.

Но затем нам потребовалось добавить новый вид инвестиций. Мы должны изменить InvestmentManager:

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

Мы нарушаем принцип открытого-закрытого, потому что он не закрыт для изменения и не открыт для расширения. Каждый раз, когда появляется новый тип инвестиций, мы должны изменять этот класс. Мы должны этого избежать.

Чтобы решить эту проблему, мы унаследуем от интерфейса (протокола) Investment и добавим новый инвестиционный класс, используя шаблон декоратора (мы также можем справиться с этим с помощью наследования).

Каждое новое вложение будет реализовывать этот протокол, и InvestmentManager будет следовать принципу «открыт-закрыт», полагаясь на эту абстракцию.

Мы внесли изменения в InvestmentManager, разрешив закрывать его для модификации и открывать для расширения.

Если нам нужно добавить новый Investment Class, InvestmentManager не нужно будет менять, потому что он открыт для расширения через интерфейс Investment.

Одна интересная вещь - это AdvancedInvestment. Используя шаблон декоратора, мы можем реализовать новый способ инвестирования, используя базовые свойства из GeneralInvestment и реализуя протокол Investment.

Заключение

Мы использовали принцип «открыт-закрыт», что упростило сопровождение и расширение нашего кода. Иногда, когда мы пишем код, мы не видим необходимости создавать абстракции, но тогда, вероятно, нам это понадобится.

Надеюсь, вам понравилась эта статья, и она была вам полезна. Спасибо за прочтение.

Следующая глава



использованная литература