Treci la conținutul principal

Depinde de abstracții

Principiul inversării dependențelor spune: codul de nivel înalt — logica de business — nu trebuie să depindă de detalii de nivel jos, cum ar fi o bază de date anume sau un format de fișier. Ambele trebuie să depindă de o abstracție: în PHP, o interfață.

„Inversarea” este direcția săgeții. În loc ca serviciul să indice un depozit concret, serviciul indică o interfață — iar fiecare depozit indică aceeași interfață din partea cealaltă.


Sudat la detalii

Acest serviciu de utilizatori creează și folosește direct un DiskStore concret. Funcționează — dar serviciul este sudat la un singur depozit. Un alt depozit, un depozit mai rapid, un depozit fals pentru teste: fiecare dintre ele înseamnă modificarea serviciului însuși.

Serviciul sudat la depozitul său

UserService își construiește în interior propriul DiskStore. Logica de înregistrare, de nivel înalt, depinde acum de un detaliu de nivel jos — fișierul de pe disc.

Prompt
Scrie un script PHP care arată o încălcare a Inversării dependențelor: un UserService a cărui metodă register folosește un DiskStore concret creat în interiorul serviciului, afișând că utilizatorul a fost scris într-un fișier pe disc. Înregistrează un singur utilizator.
Ieșire: script PHP

Inversează dependența

Soluția: serviciul cere o interfață Storage în constructorul său și nu află niciodată pe care a primit-o. Depozitul de pe disc și depozitul din memorie implementează amândouă interfața.

Acum săgeata indică din ambele părți spre abstracție — iar schimbarea depozitului este o modificare de o linie în locul unde se creează serviciul, nu în interiorul lui.

Serviciul acceptă o interfață

Aceeași logică de înregistrare, două depozite diferite. new UserService(new DiskStore()) sau new UserService(new MemoryStore()) — codul serviciului nu se schimbă niciodată.

Prompt
Inversează dependența în PHP: definește o interfață Storage cu o metodă save, un DiskStore și un MemoryStore care o implementează, și un UserService al cărui constructor acceptă orice Storage. Înregistrează un utilizator prin depozitul de pe disc și unul prin depozitul din memorie, ca să arăți schimbarea fără a modifica serviciul.
Ieșire: script PHP
The service accepts an interface

Câștigul: testare fără disc

Pentru că serviciul depinde de abstracție, un test îi poate transmite un depozit din memorie și poate verifica rezultatul instantaneu — fără fișiere, fără curățenie. Inversarea dependențelor este ceea ce face codul ușor de testat unitar.

Prompt
Arată avantajul Inversării dependențelor la testare în PHP: dă lui MemoryStore o evidență a utilizatorilor salvați, transmite-l lui UserService, înregistrează doi utilizatori și verifică dacă depozitul din memorie îi conține pe amândoi, afișând rezultatul verificării ca într-un test mic.
Ieșire: script PHP