Dependency Inversion Principle
принцип инверсии зависимости
принцип инверсии зависимости
Код, реализующий высокоуровневую политику, не должен зависеть от кода, реализующего низкоуровневые детали.
Зависимости должны быть направлены на абстракции, а не на реализации.
Абстракции стабильны.
Реализации нестабильны.
Строить зависимости необходимо на основе стабильных компонентов. Стройте зависимости от абстракций. Не стройте их от реализаций.
Связи должны строиться на основе абстракций. Если вы вызываете какой-то сервис (например, автовайрите его), Вы должны вызывать его интерфейс, а не реализацию.
— Не ссылайтесь на изменчивые конкретные классы
— Не наследуйте изменчивые конкретные классы
— Не переопределяйте конкретные методы
Это методы часто сами зависят от других классов. Переопределяя такие методы, вы фактически наследуете эти зависимости.
Не стройте зависимостей от всего, что может измениться.
Вместо этого, реализуйте абстрактный метод в интерфейсе и переопределите его.
Всё, что уже имеет реализацию, не должно быть переопределено.
Исключения
Можно строить зависимости от класса, если он предельно стабилен.
Пример исключения
класс String.
Вероятность изменения чего-либо в String всё-таки очень мала.
В случае со стабильным классом String, мы можем себе позволить вызывать его напрямую.
низкий уровень классы с простыми операциями
высокий уровень зависит от низкого уровня классов (бизнес — логика), но при ввода интерфейса между уровнями происходит инверсия зависимости т.е. низкий уровень зависит от высокого уровня
Зависимости должны быть направлены на абстракции, а не на реализации.
Абстракции стабильны.
Реализации нестабильны.
Строить зависимости необходимо на основе стабильных компонентов. Стройте зависимости от абстракций. Не стройте их от реализаций.
Связи должны строиться на основе абстракций. Если вы вызываете какой-то сервис (например, автовайрите его), Вы должны вызывать его интерфейс, а не реализацию.
— Не ссылайтесь на изменчивые конкретные классы
— Не наследуйте изменчивые конкретные классы
— Не переопределяйте конкретные методы
Это методы часто сами зависят от других классов. Переопределяя такие методы, вы фактически наследуете эти зависимости.
Не стройте зависимостей от всего, что может измениться.
Вместо этого, реализуйте абстрактный метод в интерфейсе и переопределите его.
Всё, что уже имеет реализацию, не должно быть переопределено.
Исключения
Можно строить зависимости от класса, если он предельно стабилен.
Пример исключения
класс String.
Вероятность изменения чего-либо в String всё-таки очень мала.
В случае со стабильным классом String, мы можем себе позволить вызывать его напрямую.
низкий уровень классы с простыми операциями
высокий уровень зависит от низкого уровня классов (бизнес — логика), но при ввода интерфейса между уровнями происходит инверсия зависимости т.е. низкий уровень зависит от высокого уровня