Vendor Lock In - ce este, cum îl putem evita?

Da. Daca urmezi sistematic acest pattern, miroase deja a un inceput bun de anticorruption layer.

In JS e mai dificil sa vezi layerul, cel putin mie imi e dificil, deoarece e un limbaj prea “hackish”; nu ai interfete de exemplu, pentru a forta contracte de comunicare intre obiecte (in momentul compilarii, cum e in alte limbaje).

Mi-am editat primul raspuns:

Uite un exemplu la scara redusa despre care putem vorbi.

Sa zicem ca folosesti un wrapper pentru PDO in PHP. In mod clasic, ai avea un cod de genul

while($wrapper->fetch()) {
  //do stuff
}

Cu un layer, codul ar fi ceva de genul:

while($productRepository->getNext()) {
 // do stuff
}

Repository ar folosi intern acel wrapper (vendorul), deoarece el intr-adevar aduce momentan multe beneficii, dar nu vrem sa depindem direct de acel vendor.

Citirea o poti face cu consum optim de memorie folosind un generator. Overhead-ul este minim, si daca in viitor vrei sa schimbi vendorul, nu e nevoie sa modifici codul client (care depinde de Repository, nu de vendor direct), ci doar Repository-ul.

Acum introdu cate un Repository (cu o interfata comuna) pentru fiecare entitate cu valoare de business si ai un intreg layer. (Nota: nu e musai sa aiba valoare de business, dar daca urmezi DDD, este sanatos)

Sau cum ar zice Uncle Bob: vendorul e impachetat intr-un plug-in. Ma rog, doar din codul prezentat nu se vede ca poate fi plug-in, dar e usor sa injectezi repository-ul in biblioteca centrala (cea vendor-free si cu business value in ea).

Tangential cu “injectezi”, eu unul prefer injectarea manuala a dependintelor in biblioteca centrala, fara DiC, ci prin constructor. Avantajul e o documentare mai clara a business-ului; i.e. vezi direct din cod “pentru a construi conceptul A, trebuie sa construiesti mai intai conceptele B si C”.

2 Likes