Сеньерские Алерты + Builder

Сеньерские Алерты + Builder

iOSDeviant

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

Тут стоит вспомнить (или узнать) о таком шаблоне проектирования - Builder (строитель).


В чем суть Builer'a?

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

Пример:
Делаем мы мессенджер, где у каждого пользователя есть своя страничка. Но эта страничка не статична и пользователь может выбирать что будет на ней отображаться (будет ли аватарка, блок "О себе", фотоальбом - все это опционально). Соответственно, нужно написать класс, который будет создавать страницу пользователя, собирая её из нужных блоков.


Как делается Builder?

Как правило, использование Builder'a выглядит так:

Т.е. такая цепочка вызовов, в которой мы задаем какие-то параметры и последний метод build, который создает объект.

А теперь заглянем внутрь и посмотрим на реализацию этого паттерна и как делается эта цепочка вызовов:

Итак, мы имеем 4 скрытые переменные - сам userScreen и 3 переменные, на основе которых будет собираться нужный констроллер.
Также есть 3 метода (setNeed...), которые устанавливают значения в эти переменные и главный метод - build(), который собирает UserController, по установленным параметрам.

Для создания такой цепочки вызовов мы каждый раз, при задании конфигурации, возвращаем Builder (return self).

Логика работы проста - задаем какие-то параметры, вызываем build. Builder, используя, заданные параметры собирает нам UserController.


А теперь к алертам!

По сути, мы можем просто применить все тоже самое к созданию алертов, например так:

На, самом деле, на практике этот класс гораздо больше, но тут ограничимся добавлением title, message и actions.

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

Т.е. мы поместили все внутрь самого UIAlertController через extension и теперь можем создавать Алерты так:

Шикарно!
В целом этот паттерн очень крутой и много где его можно применить, главное смотрите, чтобы не было повторяющегося кода и все будет красиво :)

Если есть вопросы, пиши в личку :)

Report Page