HTML Diff
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