Протокольно-ориентированное программирование в Swift
Вопрос
Что такое протокольно-ориентированное программирование и как вы его применяете?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Протокол описывает контракт, расширение даёт реализацию по умолчанию
Работает со структурами и enum, можно комбинировать несколько протоколов
Подмена реализации в тестах: зависимость от протокола, а не от класса
Подвох: методы только в расширении диспетчеризуются статически
Не делать протокол ради протокола: одна реализация без тестов это лишний слой
Что могут спросить следом
- Чем протокол с реализацией по умолчанию отличается от абстрактного класса?
- Как протоколы помогают в модульности?
Разбор
Идея POP в том, чтобы строить поведение из протоколов, а не из иерархий классов. Протокол задаёт контракт, расширение даёт реализацию по умолчанию, и подмешать её можно к структуре, enum или даже чужому типу через ретроактивное расширение. Наследование одно и только для классов, а протоколов у типа сколько угодно. В приложении я использую это так: сервисы скрыты за протоколами (UserRepository), view model зависит от протокола, а в тестах подставляется фейк. Помню подвох с диспетчеризацией: если метод объявлен только в расширении, через any P вызовется версия расширения, даже если тип реализовал свою. И не плодить протоколы ради протоколов: если реализация одна и тестов нет, это лишняя абстракция.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Разница между some и any в Swift
Следующий вопрос
some и any: opaque и existential типы
Термины по теме
Ещё по теме «Протоколы, POP и дженерики»
- Протокол делегата и weak
- Протокол с associatedtype как тип параметра
- Условное соответствие протоколу
- Метод из расширения протокола: какая реализация вызовется
- Ограничение дженерика Comparable
- Как ускорить вызов методов класса
- Что такое associatedtype
- Виды диспетчеризации в Swift