Найти тему
Nikolay Matveychuk

Уменьшение сложности кода, шаблоны проектирования

Оглавление

Одной из основных проблем в программировании является постепенное усложнение кода, из-за чего он становится со временем неподдерживаемым и его приходится долго рефакторить или вообще выбрасывать и писать по новой. В этой статье я расскажу простые методы как понизить сложность кода. Все примеры в этой статье я буду демонстрировать на php7.3, так как это основной язык моей работы.

Откуда возникает сложность

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

Шаблон "Декоратор"

Представим себе такую ситуацию, что у нас есть объект Часы, который умеет работать с местным временем, каким-то конкретным часовым поясом? но нам вдруг работать с разными часовыми поясами. Что же делать в этом случае? - использовать шаблон "декоратор".

Данный шаблон позволяет расширять/модифицировать поведение объекта, а если точнее, то создавать новый объект с расширенной/модифицированной функциональностью первого без наследования. Реализуется это через передачу старого объекта в конструктор нового и вызовом методов первого в методах второго. Обязательное условие этого шаблона: второй объект обязан реализовать интерфейс первого в полной мере. Итак для примера с часами это выглядело бы приблизительно так:

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

Шаблон "Мост"

Этот шаблон очень похож по реализации на декоратор, но только он используется не для расширения объекта, а для создания объекта с множественностью реализаций. Чтобы было понятнее снова же рассмотрим на примере часов. Допустим нам понадобилось синхронизировать время в нашем объекте часов разными способами: через специальное API по сети, запросом на usb порт, в который подключены реальные часы, через ввод с клавиатуры и т.д.

Разумеется можно было бы начать включать все эти реализации в объект часов, но это породило бы сложности, и с каждым новым методом добавление нового и поддержка старых становилась бы всё сложнее и сложнее. Вот для этого случая и используется мост. Работает точно так же, как и декоратор: в конструктор объекта одним из параметров передаётся объект реализации, также можно предусмотреть смену реализации. В отличии от декоратора, тут основной объект не обязан реализовать тот же интерфейс, что и объект реализации, однако все объекты реализации обязаны реализовать один и тот же интерфейс. Итак к коду, как это выглядит на практике:

Как видно из кода, мы можем легко менять реализацию синхронизации часов (задания времени) при этом не трогая реализацию самих часов.

Шаблон "Фабрика"

Этот шаблон используется для создания разных объектов с одним и тем же интерфейсом в зависимости от входных параметров. Часто используется, например, с шаблоном Мост, выбирая какую реализацию тут следует применить. Шаблон очень простой, потому сразу перейдём к примеру, и вместо смены по очереди всех трёх реализаций, как сделано выше в коде, предложим пользователю самостоятельно выбрать какую он хочет использовать:

Шаблон "Абстрактная фабрика"

По сути это та же самая фабрика, но реализована немного иначе. Для реализации этой фабрики объектам создаётся абстрактный потомок, от которого они все наследуются, и который предоставляет статический метод-фабрику (в объектно-ориентированном коде чаще используется именно он)

Другие шаблоны

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

Подписывайтесь, если Вам понравилась статья, ставьте лайки и комментируйте

Следующая статья