Principiul inversării dependențelor

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În programarea orientată pe obiecte , principiul inversării dependențelor (sau dependență [1] ; în engleză dependency inversion principi , prescurtat în DIP ) este o tehnică de decuplare a modulelor software, care constă în răsturnarea practicii tradiționale conform căreia modulele înalte - nivelul depinde de cele de nivel scăzut. [1] [2] Principiul a fost formulat pentru prima dată de Robert C. Martin , care l-a rezumat după cum urmează: [3] [4]

Modulele de nivel înalt nu trebuie să depindă de cele de nivel scăzut. Ambele trebuie să depindă de abstracții ;
Abstracțiile nu trebuie să depindă de detalii; detaliile depind de abstracții .

Principiul de inversare a dependenței este unul dintre cele cinci principii SOLID ale programării orientate pe obiecte . În prezentarea principiului, Martin l-a descris ca o generalizare a aplicării combinate a altor două principii SOLID, principiul deschis / închis și principiul substituției Liskov . [3]

Inversarea dependențelor este un concept legat, dar nu în întregime suprapus, de cel al inversării controlului .

Descriere

În practica convențională de programare, componentele software sunt organizate într-o ierarhie de abstractizare care coincide cu o ierarhie de utilizare și definește o structură de dependență corespunzătoare. Cu alte cuvinte, componentele de nivel înalt își îndeplinesc funcțiile utilizând componente de nivel inferior, prin interfețele expuse de acestea din urmă, iar acest lucru implică în mod normal o dependență a componentelor de nivel înalt de cele de nivel inferior. Această dependență poate fi materializată, de exemplu, într-o dependență de compilare : pentru a compila sursa unui modul de nivel înalt, trebuie să faceți referire la modulele de nivel scăzut pe care le folosește componenta de nivel înalt și la care, prin urmare, în mod normal se referă în sursa proprie. [1]

Principiul inversării dependenței este destinat să împiedice dependențele să reproducă ierarhia de utilizare și abstractizare în acest mod. În loc să se refere direct la interfețele componentelor de nivel scăzut, componentele de nivel înalt se referă doar la abstracții ale modului în care acele componente funcționează. Componentele de nivel scăzut se referă la aceleași abstracții. Referința este diferită în cele două cazuri: o componentă de nivel înalt folosește anumite abstracții, în timp ce o componentă de nivel scăzut le implementează . Ambele relații se pot materializa în dependențe de compilare, în sensul că atât compilarea componentelor de nivel înalt, cât și cea a componentelor de nivel scăzut se face cu referire la abstracțiile utilizate ca „lipici”; cu toate acestea, nu există dependență de construcție față de componentele de la nivel înalt la cel de nivel scăzut. Deoarece definiția abstracțiilor „utilizate” de o componentă de nivel înalt depinde conceptual de acea componentă și, prin urmare, aparține de obicei aceluiași „context” (de exemplu, pachet sau spațiu de nume ), dependența componentei de nivel scăzut de abstractizare este de fapt, o dependență de la componenta de nivel scăzut la cea de nivel înalt, de unde ideea că dependența este „inversată” față de cea tradițională. [1]

Scopul inversării dependenței poate fi atins cu o varietate de metode, bazate în principal pe conceptul de interfață sau clasă abstractă . [1] [3] Printre cele mai comune tehnici care vă permit să aplicați inversiunea dependenței putem menționa modelele de proiectare Observer , Adapter , Factory Method și Abstract Factory , [1] și injectarea dependenței .

Notă

  1. ^ a b c d e f Stefano Sandolo, Principiul inversiunii dependenței Arhivat 30 octombrie 2014 la Internet Archive .
  2. ^ Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates, Mike Hendrickson, Mike Loukides (2004), Head First Design Patterns . O'Reilly, ISBN 978-0-596-00712-6
  3. ^ a b c Robert Martin, Principiul inversiunii dependenței
  4. ^ Robert Martin, Metricele calității proiectării orientate pe obiecte: o analiză a dependențelor

Elemente conexe