Принципы SOLID на примерах в Swift
Принцип открытости закрыт
ТВЕРДЫЙ Swift
В первой части мы описали, что такое принципы SOLID и что они пытаются решить, объяснив первый принцип, единоличная ответственность.
В этой части мы исследуем следующий принцип:
Принцип открытого-закрытого был определен Бертраном Мейером в 1988 году. Он сказал:
«Программные объекты должны быть открыты для расширения, но закрыты для модификации».
Эту концепцию следует расширить и применить к любым другим модулям, классам или функциям. Это не так просто, как кажется.
Как разработчики, у нас всегда есть новые требования, некоторые из которых связаны с изменением или расширением существующих функций и бизнес-логики, поэтому нам нужно найти способ поддерживать код в хорошей форме, пока мы добавляем или изменяем код.
Итак, каждый раз, когда нам нужно изменить существующий код, в игру вступает принцип открытого-закрытого.
Бертран Мейер предложил использовать наследование для достижения этого принципа, но Роберт К. Мартин и другие пересмотрели его, чтобы использовать полиморфную форму.
Я предпочитаю использовать современный подход с использованием композиции, интерфейсов (протоколов), внедрения зависимостей и шаблонов проектирования (в качестве декоратора).
Давайте посмотрим на следующий пример:
У нас есть калькулятор инвестиций в производстве с предыдущим кодом, следуя предыдущей практике (единоличная ответственность). Мы выделили доходность инвестиций в класс с именемInvestmentManager
.
Но затем нам потребовалось добавить новый вид инвестиций. Мы должны изменить InvestmentManager
:
Этот код уже начинает пахнуть. Если у нас будет новый способ инвестирования, мы будем менять InvestmentManager
снова и снова.
Мы нарушаем принцип открытого-закрытого, потому что он не закрыт для изменения и не открыт для расширения. Каждый раз, когда появляется новый тип инвестиций, мы должны изменять этот класс. Мы должны этого избежать.
Чтобы решить эту проблему, мы унаследуем от интерфейса (протокола) Investment
и добавим новый инвестиционный класс, используя шаблон декоратора (мы также можем справиться с этим с помощью наследования).
Каждое новое вложение будет реализовывать этот протокол, и InvestmentManager
будет следовать принципу «открыт-закрыт», полагаясь на эту абстракцию.
Мы внесли изменения в InvestmentManager
, разрешив закрывать его для модификации и открывать для расширения.
Если нам нужно добавить новый Investment
Class
, InvestmentManager
не нужно будет менять, потому что он открыт для расширения через интерфейс Investment
.
Одна интересная вещь - это AdvancedInvestment
. Используя шаблон декоратора, мы можем реализовать новый способ инвестирования, используя базовые свойства из GeneralInvestment
и реализуя протокол Investment
.
Заключение
Мы использовали принцип «открыт-закрыт», что упростило сопровождение и расширение нашего кода. Иногда, когда мы пишем код, мы не видим необходимости создавать абстракции, но тогда, вероятно, нам это понадобится.
Надеюсь, вам понравилась эта статья, и она была вам полезна. Спасибо за прочтение.