Как стать автором
Обновить

Инверсия зависимостей (dependency inversion principle)

Время на прочтение2 мин
Количество просмотров12K

Одним из принципов SOLID является инверсия зависимостей. В литературе по программированию и в интернете масса источников с детальным описанием этого принципа. И большинство кандидатов на собеседовании успешно отвечают на вопрос: "Что такое инверсия зависимости?". Но при практической реализации мгновенно возникает другой вопрос, а в чем же собственно заключается инверсия и как она программируется? Далее будет рассмотрен данный принцип более подробно.

Зависимость от деталей реализации

Сделаем небольшое отступление к истокам программирования. Самые первые программы, до появления полиморфизма и объектно-ориентированного подхода, выглядели примерно следующим образом.

Зависимости были направлены в одном направлении. Но возникает проблема, и не одна.

  1. Controller зависит от деталей реализации - методов calculateFulltimeSalary() и caclculatePartialTimeSalary()

  2. Нетрудно догадаться, что при добавлении нового типа работника нужно будет редактировать Controller

  3. При добавлении очередного метода в Controller он быстро разрастется до гигантских размеров

Поэтому в программе стали оделять те части, которые зависят от аппаратуры, данных, и т.п. Таким образом, скажем, при появлении нового принтера, достаточно было запрограммировать его управление (драйвер), а логика по подготовке документа для печати оставалась неизменной.

Зависимость от абстракции класса

С появлением объектно-ориентированного подхода и полиморфизма стало возможным скрывать реализацию метода посредством интерфейса. Именно поэтому в одном из самых популярных источников сказано

Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.

Что в итоге привело примерно к следующей картине, на которой изображены зависимости между классами программы.

На схеме также отражена суть инверсии - в какой-то момент времени стрелка зависимости становится направлена в обратном направлении.

Что касается полиморфизма и объектно-ориентированного программирования, то эти темы выходят за рамки данной статьи и обсуждаться не будут.

Заключение

Выучить наизусть фразу из любого источника по программированию и успешно пройти собеседование еще не означает наличие знания и понимания техники программирования. Как только возникает практическая потребность в использовании какого-либо способа программирования, то тут же, как правило, у новичков, возникают сложности. Также, мягко говоря, удивляет наличие огромного количества статей, медиаресурсов и книг, которые не могут в краткой и ясной форме объяснить суть пятого из принципов SOLID).

В итоге, воспользовавшись знаниями, описанными в статье, программист упроститдобавление новых программных модулей. А это означает, что добавление нового компонента в систему, будь то устройство ввода или вывода и т.п., будет намного быстрее, легче, а самое главное - не повлечет за собой изменение существующей кодовой базы.

Ссылки

  1. Оригинал статьи

  2. Принцип инверсии зависимостей

  3. SOLID

  4. Подробное руководство по инверсии зависимостей. Часть 1

Теги:
Хабы:
Всего голосов 18: ↑2 и ↓16-14
Комментарии13

Публикации

Истории

Работа

QT разработчик
12 вакансий
Программист C++
144 вакансии

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань