Treci la conținutul principal

Depinde de abstracții

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

„Inversiunea” este direcția săgeții. În loc ca serviciul să indice spre o singură stocare concretă, serviciul indică spre o interfață — iar fiecare stocare indică spre aceeași interfață, din cealaltă parte.


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, una mai rapidă, una falsă pentru teste: fiecare dintre ele înseamnă modificarea serviciului însuși.

Serviciul sudat de stocarea sa

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

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

Inversează dependența

Soluția: serviciul cere o interfață UserStorage în constructorul său și nu află niciodată pe care dintre ele a primit-o. Stocarea pe disc și cea în memorie implementează amândouă interfața.

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

Serviciul acceptă o interfață

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

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

Câștigul: testare fără disc

Pentru că serviciul depinde de abstracție, un test îi poate da o stocare în memorie și poate verifica rezultatul instantaneu — fără fișiere, fără curățenie. Inversiunea dependențelor este cea care face codul ușor de testat unitar.

Prompt
Arată câștigul la testare al Inversiunii dependențelor în TypeScript: dă-i lui MemoryStore un tablou care înregistrează utilizatorii salvați, transmite-l lui UserService, înregistrează doi utilizatori și verifică faptul că stocarea în memorie îi conține pe amândoi, afișând rezultatul verificării și utilizatorii salvați, ca un mic test.
Ieșire: program TypeScript și rezultatul capturat