Delegate proxy

Паттерн delegate является одним из самых широко используемых в Cocoa и применяется буквально повсеместно. Многие делегаты, например, UIApplicationDelegate, объявляют внутри себя большое количество методов. И если реализовывать их в одном классе, то класс становится огромным, тяжело читаемым и плохо тестируемым. Так как мы не можем определить больше одного делегата, ситуация кажется безвыходной.

На самом деле нет

Решить эту проблему поможет класс NSProxу, который сможет разнести вызовы методов делегата на несколько разных классов.

Всё, что для этого требуется — создать наследник NSProxy, в котором будут реализованы необходимые методы передачи управления: methodSignatureForSelector: и forwardInvocation(_:)

При инициализации этого класса в него можно передать массив из классов, частично реализующих протокол UIApplicaitonDelegate, в котором прокси и будет искать подходящую реализацию.

Такой подход позволит сделать классы, реализующие UIApplicationDelegate, ответственными только за одну область, повысить читаемость кода и облегчить его тестирование. Соблюдение «S» из SOLID – всегда хорошо.

Но у этого подхода есть и недостатки: нужно думать о том, у какого именно класса вызовется тот или иной метод делегата, и быть аккуратными с методами, которые возвращают значения, чтобы быть уверенным, какое именно значение вернёт NSProxy.

Есть вопросы? Пишите в комментариях!