SOLID. Что значит D
Настало время обсудить последний крайний из принципов SOLID – Dependency Inversion Principle, он же DIP, он же принцип инверсии зависимостей. В качестве примера рассмотрим постройку дома и увидим, как все пройдет в зависимости от того, используем ли мы принцип или игнорируем его. Спойлер: лучше использовать!
Что такое DIP
Принцип инверсии зависимостей состоит из двух основных постулатов:
- Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Если приглядеться, то можно заметить, что оба постулата говорят примерно об одном и том же 🙂
Давайте разберем этот Dependency Inversion Principle на конкретном примере и посмотрим, что случится, если им пренебречь. А затем посмотрим, что произойдет, если принципом инверсии зависимостей все-таки воспользоваться.
Пример – пренебрежение DIP
Представьте, что вы строите загородный дом на заказ. Вы еще не выслушали требования и пожелания заказчиков по проекту, но уже съездили в Леруа Мерлен и закупили там:
- Обои и клей для них
- Доски
- Гвозди
- Шурупы
Вы купили все это, потому что уже строили в прошлом загородные дома, и, как правило, они строились из дерева. Отсюда доски, гвозди и шурупы. А внутри вы решили отделать все обоями и заблаговременно запаслись клеевым раствором.
Вы пренебрегли принципом инверсии зависимостей и сразу же перешли к деталям. Тем самым компонентам, из которых будет построен весь большой дом.
И тут заказчики говорят вам: «Мы хотим дом из газобетонных блоков, а ремонт в стиле лофт. Хотим, чтобы внутри все было отделано декоративным кирпичом».
Вам в голову закрадывается мысль, что, вероятно, вы поторопились. Но вы лишь отмахиваетесь от нее и добавляете в заказ газобетонные блоки и декоративный кирпич. При всем этом, цемент вы решили не покупать, потому что у вас уже есть шурупы – не пропадать же добру! К тому же, у вас есть много клея, помните?
В итоге вы строите дом из газобетона, как заказчик и хотел. Только вот блоки скреплены между собой не специальной смесью, а клеем для обоев и шурупами. Вроде и выглядит как было задумано, но вот по качеству есть небольшие просадки.
Далее переходим к ремонту. У вас еще осталось немного клея для обоев, и именно на него вы сажаете декоративный кирпич на стены. Тут вроде бы тоже все выглядит как задумывалось, с одним лишь «но»: клей для обоев не удержит кирпич, и спустя недолгое время он начнет отваливаться. Так же и ваш проект начнет разваливаться на части.
У вас еще остались доски – надо же их куда-то потратить? Часть вы крепите к стенам на гвозди – чем не лофт? Хотя на самом деле это уже скандинавский стиль, но это уже детали. Другую часть досок вы кладете на пол и ничем не крепите. В итоге доски тоже начнут отваливаться и съезжать.
Вывод – вроде бы дом стоит и даже внешне похож на то, что изначально хотелось. Но такой дом не простоит долго. Так же и ваш проект начнет трещать по швам со временем.
Разработчики, которые пренебрегают принципом инверсии зависимостей, выглядят так:
Следование DIP
Если же вы решите сделать все как следует, то вы сначала выслушаете требования к проекту, и только затем приобретете необходимые компоненты.
В результате газобетонные блоки будут скреплены специальной смесью, а декоративный кирпич в стиле лофт будет посажен на особый клей. Обои и гвозди вам в принципе будут не нужны, поэтому и тратить на них дополнительные деньги нет никакого смысла.
Построенный вами дом дом будет не просто выглядеть как планировалось, он будет еще и качественным. Такой дом не начнет разваливаться даже спустя продолжительное время, и в нем будет приятно жить.
Разработчики, которые следуют DIP, выглядят так:
Вывод
Умные дядьки не зря придумали принципы написания хорошего кода. Не игнорируйте SOLID, и DIP в частности. Будьте молодцом, и в будущем это вам отзовется.
Понравилось? Подписывайтесь на меня в соцсетях!
Предыдущие статьи из цикла SOLID:
S: https://baddev.ru/solid-srp/
O: https://baddev.ru/solid-ocp/
L: https://baddev.ru/solid-lsp/
I: https://baddev.ru/solid-isp/