Един от принципите на SOLID е инверсията на зависимостите. Има много ресурси с подробно описание на инверсия на зависимости, като например книги и статии. И повечето кандидати на интервю за работа отговарят успешно на въпроса: „Какво е инверсия на зависимости?“. Но когато настъпи реална практика, възниква друг въпрос какво означава инверсията и как да я програмираме?
Зависимост от подробности за изпълнението
Нека направим малко въведение в началото на програмирането. Първите програми, преди изобретяването на полиморфизма и обектно-ориентираното програмиране, изглеждаха така.
Зависимостите бяха насочени в същата посока. Но проблем има и то не един.
- Контролерът зависи от детайлите на изпълнението — методите CalculateFulltimeSalary() и caclculatePartialTimeSalary()
- Не е трудно да се разбере, че при добавяне на нов тип работник ще трябва да редактирате контролера
- Когато добавите отново нов метод към контролера, той расте много бързо и ще стане бъркотия
Следователно програмата е разделена на компоненти, които зависят от хардуер, данни и т.н. Следователно, ако се добави нов принтер например, достатъчно е да се програмира само драйвер, докато модулът, отговарящ за създаването на документ, остава непроменен.
Зависимост от абстракция на клас
Когато бяха въведени обектно-ориентираното програмиране и полиморфизмът, стана възможно да се скрият подробности за изпълнението чрез интерфейс на класа. Ето защо един от най-популярните ресурси е посочването
Модулите от високо ниво не трябва да импортират нищо от модули от ниско ниво. И двете трябва да зависят от абстракции (напр. интерфейси).
Което в крайна сметка доведе до следващата картина, която илюстрира зависимостите на класовете.
Диаграмата също има представяне на значението на инверсията — в даден момент стрелката на зависимостта се обръща.
Що се отнася до полиморфизма и обектно-ориентираното програмиране, тези теми надхвърлят тази статия, така че не са описани там.
Заключение
Да научите и да преминете интервюто за работа не означава солидни познания и задълбочено разбиране на техниките за програмиране. Веднага щом възникне случай на практическа употреба на инверсия на зависимост, веднага, като правило, за начинаещи възниква проблем. И, казано внимателно, толкова е странно, че няма публикации, книги или медии, които да имат кратко и ясно обяснение на петия от принципите на SOLID.
В крайна сметка, използвайки представените знания, програмистът опростява добавянето на нови модули. Това означава, че при добавяне на нов хардуер, входно или изходно устройство например, ще бъде много по-бързо и лесно и най-важното няма да доведе до промени в съществуващата кодова база.