Baglylyk sanjymy (DI) düşünmek aňsat däl we ony täze ýa-da bar bolan programmalara ulanmak hasam bulaşyk. Jess Smit size C # we Java programmirleme dillerinde sanjym konteýni bolmazdan garaşlylyk sanjymyny nädip etmelidigini görkezýär. Bu makalada .NET we Java programmalarynda garaşlylyk sanjymyny (DI) nädip durmuşa geçirmelidigini görkezerin. Baglylyk sanjymy düşünjesi ilkinji gezek 2000-nji ýylda, Robert Martin "Dizaýn ýörelgeleri we nagyşlary" (soňra SOLID gysgaldylyşy bilen tanalýar
) makalasyny ýazanda, döredijileriň ünsüni özüne çekdi . SOLID-däki D, soň garaşlylyk sanjymy diýlip tanalýan inversiýa baglylygy (DOI) aňladýar. Asyl we iň giňden ýaýran kesgitleme: garaşlylygyň tersligi, esasy synpyň garaşlylygy dolandyrmagynyň tersligi.
Copy
Martiniň asyl makalasynda bir synpyň aşaky gatlaklara baglylygyny görkezmek üçin aşakdaky kod ulanyldy
WritePrinter
:
void Copy()
{
int c;
while ((c = ReadKeyboard()) != EOF)
WritePrinter(c);
}
Ilkinji aç-açan mesele, parametrleriň sanawyny ýa-da usulyň görnüşlerini üýtgetseňiz
WritePrinter
, şol usula baglylyk bolan ýerlerde täzelenmeleri durmuşa geçirmeli. Bu amal tehniki hyzmatyň çykdajylaryny ýokarlandyrýar we täze ýalňyşlyklaryň çeşmesi bolup durýar.
Anotherene bir mesele: Göçürmek synpy gaýtadan ulanmak üçin dalaşgär däl. Mysal üçin, klawiaturadan girizilen nyşanlary printere derek bir faýla çykarmaly bolsa näme etmeli? Munuň üçin synpy
Copy
aşakdaky ýaly üýtgedip bilersiňiz (C ++ dil sintaksis):
void Copy(outputDevice dev)
{
int c;
while ((c = ReadKeyboard()) != EOF)
if (dev == printer)
WritePrinter(c);
else
WriteDisk(c);
}
Täze garaşlylygyň girizilmegine garamazdan
WriteDisk
, ýagdaý gowulaşmady (has erbetleşdi), sebäbi başga bir ýörelge bozuldy: “programma üpjünçiligi guramalary, ýagny synplar, modullar, funksiýalar we ş.m. giňeltmek üçin açyk bolmaly, ýöne ýapyk üýtgetmek. ” Martin, bu täze şertli bolsa / başga sözler koduň durnuklylygyny we çeýeligini peseldýär diýip düşündirýär. Çözüw, ýazmak we okamak usullary şoňa bagly bolar ýaly garaşlylygy üýtgetmekdir
Copy
. Baglanyşyklary "açmagyň" ýerine, konstruktordan geçýärler. Üýtgedilen kod şuňa meňzeýär:
class Reader
{
public:
virtual int Read() = 0;
};
class Writer
{
public:
virtual void Write(char) = 0;
};
void Copy(Reader& r, Writer& w)
{
int c;
while((c=r.Read()) != EOF)
w.Write(c);
}
Indi
Copy
synp usullaryny dürli usullar bilen aňsatlyk bilen ulanyp bolýar
Reader
we
Writer
. Synpda
Copy
görnüşleriň içki gurluşy barada hiç hili maglumat ýok
Reader
we
Writer
olary dürli amallar bilen gaýtadan ulanmaga mümkinçilik berýär. Thisöne bularyň hemmesi size haýsydyr bir gobbledygook ýaly bolup görünýän bolsa, Java we C # aşakdaky mysallar ýagdaýy aýdyňlaşdyrar.
Java we C # mysal
DI
Baglylyk konteýnersiz garaşlylyk sanjymynyň aňsatlygyny görkezmek üçin, birnäçe ädimde ulanmak üçin özleşdirilip bilinjek ýönekeý mysaldan başlalyň .
HtmlUserPresentation
Usullary diýlende HTML ulanyjy interfeýsini döredýän synpymyz bar diýeliň . Ine ýönekeý mysal:
HtmlUserPresentation htmlUserPresentation = new HtmlUserPresentation();
String table = htmlUserPresentation.createTable(rowTableVals, "Login Error Status");
Bu synp koduny ulanýan islendik taslama, klasa bagly bolar
HtmlUserPresentation
, netijede ýokarda beýan edilen ulanyş we dowamlylyk meselesi ýüze çykar. Bir gowulaşma derrew özüni görkezýär: synpda häzirki bar bolan ähli usullaryň goly bilen interfeýs döretmek
HtmlUserPresentation
. Ine, bu interfeýsiň mysaly:
public interface IHtmlUserPresentation {
String createTable(ArrayList rowVals, String caption);
String createTableRow(String tableCol);
}
Interfeýsi döredenimizden soň,
HtmlUserPresentation
ony ulanmak üçin synpy üýtgedýäris. Görnüşi gyssagly ýerine gaýdyp gelsek
HtmlUserPresentation
, indi esasy görnüşiň ýerine interfeýs görnüşini ulanyp bileris:
IHtmlUserPresentation htmlUserPresentation = new HtmlUserPresentation();
String table = htmlUserPresentation.createTable(rowTableVals, "Login Error Status");
Interfeýs döretmek, beýleki amallary aňsatlyk bilen ulanmaga mümkinçilik berýär
IHtmlUserPresentation
. Mysal üçin, bu görnüşi synap görmek islesek, esasy görnüşini aňsatlyk bilen
HtmlUserPresentation
başga bir görnüş bilen çalşyp bileris
HtmlUserPresentationTest
. Şu wagta çenli edilen üýtgeşmeler kody synamagy, saklamagy we masştablaşdyrmagy aňsatlaşdyrýar, ýöne gaýtadan ulanmak üçin hiç zat etme, sebäbi
HtmlUserPresentation
görnüşi ulanýan ähli synplar henizem barlygyny bilýärler.
IHtmlUserPresentation
Bu gönüden-göni garaşlylygy aýyrmak üçin, interfeýs görnüşini synpyň ýa-da ulanjak usulyň konstruktoryna (ýa-da usul parametrleriniň sanawy) geçirip bilersiňiz :
public UploadFile(IHtmlUserPresentation htmlUserPresentation)
Konstruktor
UploadFile
indi görnüşiň ähli işleýşine elýeterli
IHtmlUserPresentation
, ýöne bu interfeýsi amala aşyrýan synpyň içki gurluşy barada hiç zat bilmeýär. Bu kontekstde, synpyň mysaly döredilende, sanjym görnüşi ýüze çykýar
UploadFile
. Interfeýs görnüşi
IHtmlUserPresentation
dürli amallary dürli synplara ýa-da dürli işlemegi talap edýän usullara geçirmek arkaly gaýtadan ulanylýar.
Netije we materialy berkitmek üçin teklipler
Baglylyk sanjymyny öwrendiňiz we sapaklaryň biri maksat görnüşiniň işleýşine girmek üçin biri derrew başga birine dessine bagly diýilýär. Iki görnüşiň arasyndaky göni garaşlylygy çözmek üçin interfeýs döretmeli. Interfeýs, zerur funksiýanyň mazmunyna baglylykda dürli amallary goşmak mümkinçiligini berýär. Interfeýs görnüşini synp konstruktoryna ýa-da usulyna geçirmek bilen, işlemäge mätäç synp / usul interfeýsi amala aşyrýan görnüş barada jikme-jiklikleri bilmeýär. Şol sebäpli interfeýs görnüşini meňzeş, ýöne birmeňzeş däl häsiýeti talap edýän dürli synplarda gaýtadan ulanyp bolýar.
- Baglylyk sanjymyny synap görmek üçin bir ýa-da birnäçe programmadan koduňyza serediň we köp ulanylýan esasy görnüşi interfeýsine öwürmäge synanyşyň.
- Bu täze interfeýs görnüşini ulanmak we ony ulanjak synp usulynyň konstruktoryndan ýa-da parametr sanawyndan geçirmek üçin bu esasy görnüşi gönüden-göni döredýän synplary üýtgediň.
- Bu interfeýs görnüşini barlamak üçin synag ýerine ýetirişini dörediň. Koduňyz täzeden işledilenden soň,
DI
ýerine ýetirmek has aňsat bolar we programmaňyzyň gaýtadan ulanmak we dowam etdirmek nukdaýnazaryndan has çeýe boljakdygyny görersiňiz.
GO TO FULL VERSION