Паттерны
Опишите принципы SOLID и внедрение зависимостей (Dependency Injection, DI).
Принципы SOLID:
-
Принцип единственной ответственности (Single Responsibility Principle, SRP)
: Каждый класс должен быть ответственен только за одну часть функциональности программы.
-
Принцип открытости/закрытости (Open/Closed Principle, OCP) : Программные сущности должны быть открыты для расширения, но закрыты для модификации.
-
Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP)
: Объекты в программе могут быть заменены их наследниками без изменения свойств программы.
-
Принцип разделения интерфейса (Interface Segregation Principle, ISP)
: Клиенты не должны зависеть от интерфейсов, которые они не используют.
-
Принцип инверсии зависимостей (Dependency Inversion Principle, DIP)
: Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба типа модулей должны зависеть от абстракций.
Внедрение зависимостей (Dependency Injection, DI) - это методика программирования, которая способствует реализации принципа инверсии зависимостей. Она заключается в том, что зависимости модуля внедряются извне, а не создаются внутри самого модуля. Это делает код более гибким, позволяя легко заменять зависимости и тестировать модули.
Каковы различия между взаимодействием классов через композицию, агрегацию и зависимость?
Взаимодействие классов через композицию, агрегацию и зависимость отличаются по степени “связности” объектов:
-
Композиция: Это отношение “часть-целое”, где один объект (часть) является неотъемлемой частью другого объекта (целого). Когда целый объект уничтожается, все его части также уничтожаются. Например, автомобиль состоит из двигателя, колес и других частей. Если автомобиль уничтожается, то и его части также должны быть уничтожены.
-
Агрегация: Это отношение “содержание-содержащее”, где один объект (содержащее) содержит другой объект (содержание), но содержание может существовать независимо от содержащего. Например, у автомобиля могут быть колеса, которые могут использоваться и в других транспортных средствах.
-
Зависимость: Это отношение, когда один объект использует функциональность другого объекта, но не является его частью и не владеет им. Зависимость проявляется в том, что объект может вызывать методы или использовать свойства другого объекта. Например, класс, который использует сервис для выполнения определенной задачи, зависит от этого сервиса.
Какие паттерны проектирования вы чаще всего используете?
Примеры паттернов для обсуждения. Выберите те, которые использовали, и объясните решённую ими задачу.
-
Model-View-Controller
(MVC): Для разделения приложения на три компонента: модель (данные), представление (отображение данных) и контроллер (логика управления данными и представлением). -
Model-View-ViewModel
(MVVM): Для разделения приложения на три компонента: модель (данные), представление (отображение данных) и модель представления (логика управления данными и их преобразование для представления). -
Dependency Injection
(DI): Для управления зависимостями между компонентами приложения и обеспечения легкости тестирования и поддержки. -
Repository Pattern: Для абстрагирования доступа к данным и предоставления единого интерфейса для работы с различными источниками данных.
-
Singleton Pattern: Для гарантирования того, что класс имеет только один экземпляр и предоставления глобальной точки доступа к этому экземпляру.
Какой дизайн-паттерн вы чаще всего используете в своих проектах и почему?
Если вы использовали MVVM, объясните, как ViewModel готовила данные и обрабатывала действия, а View отображала состояние. Приведите пример того, что стало проще тестировать, и назовите недостатки решения. Если в вашем проекте был другой паттерн, расскажите о нём.
Что такое паттерн Singleton и где его уместно использовать?
Паттерн Singleton гарантирует, что у класса есть
только один экземпляр, и предоставляет глобальную точку доступа к этому
экземпляру. Это уместно использовать в случаях, когда требуется единственный
экземпляр класса для управления общим ресурсом или настройками:
-
Менеджеры ресурсов: Например, менеджер сетевых запросов или менеджер баз данных.
-
Настройки приложения: Класс, управляющий настройками приложения.
Однако, использование Singleton может затруднить тестирование из-за его глобальной доступности и скрытого состояния, поэтому его следует использовать с осторожностью и обеспечивать, чтобы его использование было оправданным в конкретном контексте.