Treci la conținutul principal

Depinde de abstracțiuni

Principiul inversării dependențelor spune: codul de nivel înalt — logica de business — nu trebuie să depindă de detalii de nivel scăzut, cum ar fi o anumită bază de date sau un anumit format de fișier. Ambele trebuie să depindă de o abstracțiune: în Python, un protocol.

„Inversarea” se referă la direcția săgeții. În loc ca serviciul să indice spre o stocare concretă, serviciul indică spre un protocol — iar fiecare stocare indică spre același protocol din partea cealaltă.


Legat direct de detalii

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

Serviciul sudat de stocarea sa

UserService își construiește singur propriul DiskStore în interior. Logica de nivel înalt pentru înregistrare depinde acum de un detaliu de nivel scăzut — fișierul de pe disc.

Prompt
Scrie un program Python care arată o încălcare a principiului 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 utilizator.
Ieșire: program Python complet

Inversează dependența

Soluția: serviciul cere un protocol Storage în constructorul său și nu află niciodată ce stocare a primit. Atât stocarea pe disc, cât și stocarea în memorie implementează protocolul.

Acum săgeata indică din ambele părți spre abstracțiune — iar înlocuirea stocării este o modificare de o singură linie în locul unde este creat serviciul, nu în interiorul lui.

Serviciul acceptă un protocol

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

Prompt
Inversează dependența în Python: definește un protocol Storage cu o metodă save, un DiskStore și un MemoryStore care îl implementează și un UserService al cărui constructor acceptă orice Storage. Înregistrează un utilizator prin stocarea pe disc și unul prin stocarea în memorie, pentru a arăta înlocuirea fără a modifica serviciul.
Ieșire: program Python complet
The service accepts a protocol

Câștigul: testare fără disc

Deoarece serviciul depinde de abstracțiune, un test îi poate da o stocare în 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ă câștigul inversării dependențelor la testare în Python: oferă-i lui MemoryStore o listă de utilizatori salvați, transmite-l lui UserService, înregistrează doi utilizatori și verifică faptul că stocarea în memorie îi conține pe amândoi, afișând rezultatele verificării ca într-un mic test.
Ieșire: program Python complet