Одним из принципов SOLID является инверсия зависимостей. В литературе по программированию и в интернете масса источников с детальным описанием этого принципа. И большинство кандидатов на собеседовании успешно отвечают на вопрос: "Что такое инверсия зависимости?". Но при практической реализации мгновенно возникает другой вопрос, а в чем же собственно заключается инверсия и как она программируется? Далее будет рассмотрен данный принцип более подробно.
Зависимость от деталей реализации
Сделаем небольшое отступление к истокам программирования. Самые первые программы, до появления полиморфизма и объектно-ориентированного подхода, выглядели примерно следующим образом.
Зависимости были направлены в одном направлении. Но возникает проблема, и не одна.
Controller зависит от деталей реализации - методов calculateFulltimeSalary() и caclculatePartialTimeSalary()
Нетрудно догадаться, что при добавлении нового типа работника нужно будет редактировать Controller
При добавлении очередного метода в Controller он быстро разрастется до гигантских размеров
Поэтому в программе стали оделять те части, которые зависят от аппаратуры, данных, и т.п. Таким образом, скажем, при появлении нового принтера, достаточно было запрограммировать его управление (драйвер), а логика по подготовке документа для печати оставалась неизменной.
Зависимость от абстракции класса
С появлением объектно-ориентированного подхода и полиморфизма стало возможным скрывать реализацию метода посредством интерфейса. Именно поэтому в одном из самых популярных источников сказано
Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
Что в итоге привело примерно к следующей картине, на которой изображены зависимости между классами программы.
На схеме также отражена суть инверсии - в какой-то момент времени стрелка зависимости становится направлена в обратном направлении.
Что касается полиморфизма и объектно-ориентированного программирования, то эти темы выходят за рамки данной статьи и обсуждаться не будут.
Заключение
Выучить наизусть фразу из любого источника по программированию и успешно пройти собеседование еще не означает наличие знания и понимания техники программирования. Как только возникает практическая потребность в использовании какого-либо способа программирования, то тут же, как правило, у новичков, возникают сложности. Также, мягко говоря, удивляет наличие огромного количества статей, медиаресурсов и книг, которые не могут в краткой и ясной форме объяснить суть пятого из принципов SOLID).
В итоге, воспользовавшись знаниями, описанными в статье, программист упроститдобавление новых программных модулей. А это означает, что добавление нового компонента в систему, будь то устройство ввода или вывода и т.п., будет намного быстрее, легче, а самое главное - не повлечет за собой изменение существующей кодовой базы.