0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: nsproxу, delegate proxy, uiapplicationdelegate, methodsignatureforselector:, forwardinvocation(_:), cocoa, делегаты, наследник nsproxy</p>
1
<p>Теги: nsproxу, delegate proxy, uiapplicationdelegate, methodsignatureforselector:, forwardinvocation(_:), cocoa, делегаты, наследник nsproxy</p>
2
<p>Паттерн delegate является одним из самых широко используемых в Cocoa и применяется буквально повсеместно. Многие делегаты, например,<strong>UIApplicationDelegate</strong>, объявляют внутри себя большое количество методов. И если реализовывать их в одном классе, то класс становится огромным, тяжело читаемым и плохо тестируемым. Так как мы не можем определить больше одного делегата, ситуация кажется безвыходной.</p>
2
<p>Паттерн delegate является одним из самых широко используемых в Cocoa и применяется буквально повсеместно. Многие делегаты, например,<strong>UIApplicationDelegate</strong>, объявляют внутри себя большое количество методов. И если реализовывать их в одном классе, то класс становится огромным, тяжело читаемым и плохо тестируемым. Так как мы не можем определить больше одного делегата, ситуация кажется безвыходной.</p>
3
<h2>На самом деле нет</h2>
3
<h2>На самом деле нет</h2>
4
<p>Решить эту проблему поможет класс<a>NSProxу</a>, который сможет разнести вызовы методов делегата на несколько разных классов.</p>
4
<p>Решить эту проблему поможет класс<a>NSProxу</a>, который сможет разнести вызовы методов делегата на несколько разных классов.</p>
5
<p>Всё, что для этого требуется - создать наследник NSProxy, в котором будут реализованы необходимые методы передачи управления: methodSignatureForSelector: и forwardInvocation(_:)</p>
5
<p>Всё, что для этого требуется - создать наследник NSProxy, в котором будут реализованы необходимые методы передачи управления: methodSignatureForSelector: и forwardInvocation(_:)</p>
6
<p>При инициализации этого класса в него можно передать массив из классов, частично реализующих протокол<strong>UIApplicaitonDelegate</strong>, в котором прокси и будет искать подходящую реализацию.</p>
6
<p>При инициализации этого класса в него можно передать массив из классов, частично реализующих протокол<strong>UIApplicaitonDelegate</strong>, в котором прокси и будет искать подходящую реализацию.</p>
7
<p>Такой подход позволит сделать классы, реализующие<strong>UIApplicationDelegate</strong>, ответственными только за одну область, повысить читаемость кода и облегчить его тестирование. Соблюдение "S" из SOLID - всегда хорошо.</p>
7
<p>Такой подход позволит сделать классы, реализующие<strong>UIApplicationDelegate</strong>, ответственными только за одну область, повысить читаемость кода и облегчить его тестирование. Соблюдение "S" из SOLID - всегда хорошо.</p>
8
<p>Но у этого подхода есть и недостатки: нужно думать о том, у какого именно класса вызовется тот или иной метод делегата, и быть аккуратными с методами, которые возвращают значения, чтобы быть уверенным, какое именно значение вернёт NSProxy.</p>
8
<p>Но у этого подхода есть и недостатки: нужно думать о том, у какого именно класса вызовется тот или иной метод делегата, и быть аккуратными с методами, которые возвращают значения, чтобы быть уверенным, какое именно значение вернёт NSProxy.</p>
9
<p><em>Есть вопросы? Пишите в комментариях!</em></p>
9
<p><em>Есть вопросы? Пишите в комментариях!</em></p>
10
10