JavaRush /Java Blog /Random-TK /Baglylyklary sanjymyň aňsat usuly

Baglylyklary sanjymyň aňsat usuly

Toparda çap edildi
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. Baglylyk sanjymynyň ýönekeý usuly - 1Bu 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. CopyMartiniň 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.
Java hakda okamak isleýärsiňizmi? Java Developer toparyna goşulyň !
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 Copyaş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 Copysynp usullaryny dürli usullar bilen aňsatlyk bilen ulanyp bolýar Readerwe Writer. Synpda Copygörnüşleriň içki gurluşy barada hiç hili maglumat ýok Readerwe Writerolary 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

DIBaglylyk konteýnersiz garaşlylyk sanjymynyň aňsatlygyny görkezmek üçin, birnäçe ädimde ulanmak üçin özleşdirilip bilinjek ýönekeý mysaldan başlalyň . HtmlUserPresentationUsullary 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ň, HtmlUserPresentationony 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 HtmlUserPresentationbaş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 HtmlUserPresentationgörnüşi ulanýan ähli synplar henizem barlygyny bilýärler. IHtmlUserPresentationBu 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 UploadFileindi 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 IHtmlUserPresentationdü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.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION