Как используются принципы SOLID, в частности буквы O и I?
Что проверяют
Умеете ли вы показать принципы на своём коде, а не пересказать определения из книги. Следом обычно просят пример из Android-проекта и спрашивают, где вы сознательно нарушили OCP.
Как отвечать
Open/Closed: новое поведение добавляется новым кодом, а не правкой проверенного старого. Типичные места в Android:
- список с разными ячейками: вместо
when (viewType)на двадцать веток в одномRecyclerView.Adapterкаждый тип ячейки живёт в своём делегате, и новая карточка это новый класс плюс регистрация; - аналитика и логирование: экран зависит от интерфейса
AnalyticsTracker, а реализации под разные SDK подключаются через DI (Hilt, Koin). Новый провайдер не требует трогать экраны; - стратегии: способы оплаты, форматтеры, правила валидации за одним интерфейсом.
Сильный ход: сказать, что sealed class с исчерпывающим when сознательно идёт против OCP. Для закрытого набора состояний экрана (Loading, Content, Error) это плюс: компилятор заставит обработать новый вариант везде.
Interface Segregation: клиент не должен зависеть от методов, которыми не пользуется. Лучшие примеры есть в самом SDK:
TextWatcher: три метода, а нужен обычно толькоafterTextChanged. Отсюда расширениеdoAfterTextChangedиз core-ktx;Animator.AnimatorListener: четыре метода, поэтому появилсяAnimatorListenerAdapterс пустыми реализациями;- репозитории: вместо одного
UserRepositoryна тридцать методов отдельныеUserReaderиUserWriter, и экрану профиля не нужно знать про удаление аккаунта.
Для интерфейса с одним методом в Kotlin есть fun interface, его можно передавать лямбдой.
Где спотыкаются
Понимают OCP как «никогда не менять класс». Исправление багов и рефакторинг никто не запрещал, принцип про расширение поведения.
Плодят интерфейс на каждый класс «на будущее». Интерфейс с единственной реализацией и без фейков в тестах только добавляет прыжков по коду.
Лечат толстый интерфейс методами по умолчанию в Kotlin. Реализовывать станет проще, но клиент по-прежнему зависит от лишних методов, и принцип нарушен так же, как раньше.