Ответ вслух Middle Протоколы, POP и дженерики спрашивают часто обновлено

Протокольно-ориентированное программирование в Swift

Вопрос

Что такое протокольно-ориентированное программирование и как вы его применяете?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Идея POP в том, чтобы строить поведение из протоколов, а не из иерархий классов. Протокол задаёт контракт, расширение даёт реализацию по умолчанию, и подмешать её можно к структуре, enum или даже чужому типу через ретроактивное расширение.

Что должно прозвучать в ответе

  • Протокол описывает контракт, расширение даёт реализацию по умолчанию

  • Работает со структурами и enum, можно комбинировать несколько протоколов

  • Подмена реализации в тестах: зависимость от протокола, а не от класса

  • Подвох: методы только в расширении диспетчеризуются статически

  • Не делать протокол ради протокола: одна реализация без тестов это лишний слой

Что могут спросить следом

  • Чем протокол с реализацией по умолчанию отличается от абстрактного класса?
  • Как протоколы помогают в модульности?

Разбор

Идея POP в том, чтобы строить поведение из протоколов, а не из иерархий классов. Протокол задаёт контракт, расширение даёт реализацию по умолчанию, и подмешать её можно к структуре, enum или даже чужому типу через ретроактивное расширение. Наследование одно и только для классов, а протоколов у типа сколько угодно. В приложении я использую это так: сервисы скрыты за протоколами (UserRepository), view model зависит от протокола, а в тестах подставляется фейк. Помню подвох с диспетчеризацией: если метод объявлен только в расширении, через any P вызовется версия расширения, даже если тип реализовал свою. И не плодить протоколы ради протоколов: если реализация одна и тестов нет, это лишняя абстракция.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.