Pull to refresh

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

Reading time2 min
Views13K

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

Ссылки

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

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

  3. SOLID

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

Tags:
Hubs:
Total votes 18: ↑2 and ↓16-14
Comments13

Articles