Нарушает ли Context принципы SOLID и почему
Что проверяют
Не знание определений SOLID, а умение критиковать фреймворк по делу. Хороший ответ показывает, что кандидат видит в Context инженерный компромисс, понимает, чем за него платят в реальном коде (утечки, непроверяемые классы), и знает, как ограничить его распространение по слоям.
Как отвечать
Начните с признания: да, Context это классический божественный объект. Через него идут ресурсы, темы, файлы, настройки, системные сервисы и запуск активностей. Принцип единственной ответственности он нарушает по определению, а принцип разделения интерфейсов ещё нагляднее: классу нужен один getString, а он получает доступ ко всей платформе.
Дальше про подстановку Лисков. Формально Activity, Service и Application это один тип, но взаимозаменяемы они не всегда: диалог, построенный на контексте приложения, падает на отсутствии токена окна, а тема и оформление у контекста приложения свои. Один тип, разные контракты, и компилятор об этом не предупреждает.
Про принцип открытости закрытости ответ мягче: расширять поведение можно, не трогая исходники, через ContextWrapper, это готовый декоратор, на нём же построен ContextThemeWrapper.
Заканчивайте практикой: во внутренние слои Context не пускают, вместо него передают узкий интерфейс вроде провайдера ресурсов. Тогда модель тестируется без эмулятора.
Где спотыкаются
Заучивают список из пяти принципов и объявляют нарушенными все сразу. Про открытость закрытости это уже неверно: ContextWrapper существует именно для расширения без изменения, и интервьюер, который это знает, дальше слушает с недоверием.
Обсуждают теорию и не называют главную практическую цену. Ссылка на контекст активности, сохранённая в синглтоне, статическом поле или во вьюмодели, держит в памяти всю активность вместе с иерархией вью. Правило простое: долгоживущим объектам контекст приложения, диалогам и разметке контекст активности.
Предлагают вместо решения наследника вьюмодели, которому контекст передан в конструктор, и считают вопрос закрытым. Зависимость никуда не делась, тест по-прежнему требует платформы. Развязка начинается там, где домен видит свой интерфейс, а реализация с контекстом живёт в слое данных.