Treci la conținutul principal

Depinde de abstracții

Principiul inversiunii dependențelor spune: codul de nivel înalt — logica ta de business — nu ar trebui să depindă de detalii de nivel jos, cum ar fi o anumită bază de date sau un anumit format de fișier. Amândouă ar trebui să depindă de o abstracție: în Go, o interfață.

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


Legat rigid 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 lui

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

Prompt
Scrie un program Go 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 că utilizatorul a fost scris într-un fișier pe disc. Înregistrează un singur utilizator.
Ieșire: program Go și rezultatul capturat

Inversează dependența

Soluția: serviciul cere o interfață Storage în constructorul lui și nu află niciodată pe care dintre stocări a primit-o. Stocarea pe disc și stocarea în memorie implementează amândouă interfața.

Acum săgeata arată dinspre 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. NewUserService(DiskStore{}) sau NewUserService(MemoryStore{}) — codul serviciului nu se schimbă deloc.

Prompt
Inversează dependența în Go: definește o interfață Storage cu o metodă Save, un DiskStore și un MemoryStore care o implementează, și un UserService creat cu NewUserService care acceptă orice Storage. Î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 Go ș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 după. Inversiunea dependențelor este cea care face codul ușor de testat unitar.

Prompt
Arată avantajul Inversiunii Dependențelor la testare, în Go: dă-i lui MemoryStore o evidență a utilizatorilor salvați, transmite-l lui UserService, înregistrează doi utilizatori și verifică dacă stocarea în memorie îi conține pe amândoi, afișând rezultatele verificării ca într-un test mic.
Ieșire: program Go și rezultatul capturat