JavaRush /Blog Jawa /Random-JV /Cara sing gampang kanggo nyuntikake dependensi

Cara sing gampang kanggo nyuntikake dependensi

Diterbitake ing grup
Injeksi ketergantungan (DI) dudu konsep sing gampang dimangerteni, lan nglamar ing aplikasi anyar utawa sing wis ana malah luwih mbingungake. Jess Smith nuduhake sampeyan carane nggawe injeksi dependensi tanpa wadhah injeksi ing C # lan basa pemrograman Java. Cara prasaja injeksi dependensi - 1Ing artikel iki, aku bakal nuduhake sampeyan carane ngleksanakake injeksi dependensi (DI) ing aplikasi .NET lan Java. Konsep injeksi dependensi pisanan ditemokake dening para pangembang ing taun 2000, nalika Robert Martin nulis artikel "Prinsip lan Pola Desain" (banjur dikenal kanthi akronim SOLID ). D ing SOLID nuduhake Dependency of Inversion (DOI), sing banjur dikenal minangka injeksi dependensi. Définisi asli lan paling umum: inversi dependensi minangka inversi saka cara kelas dasar ngatur dependensi. Artikel asli Martin nggunakake kode ing ngisor iki kanggo nggambarake ketergantungan kelas Copying kelas tingkat ngisor WritePrinter:
void Copy()
	{
	 int c;
	 while ((c = ReadKeyboard()) != EOF)
		WritePrinter(c);
	}
Masalah pisanan sing jelas yaiku yen sampeyan ngganti dhaptar parameter utawa jinis metode WritePrinter, sampeyan kudu ngetrapake nganyari ing ngendi wae ana ketergantungan ing metode kasebut. Proses iki nambah biaya pangopènan lan minangka sumber potensial kesalahan anyar.
Kepengin maca babagan basa Jawa? Gabung karo grup Java Developer !
Masalah liyane: kelas Salin ora dadi calon sing bisa digunakake maneh. Contone, apa yen sampeyan kudu output karakter sing dilebokake saka keyboard menyang file tinimbang menyang printer? Kanggo nindakake iki, sampeyan bisa ngowahi kelas Copykaya ing ngisor iki (sintaks basa C++):
void Copy(outputDevice dev)
	{
	int c;
	while ((c = ReadKeyboard()) != EOF)
		if (dev == printer)
			WritePrinter(c);
		else
			WriteDisk(c);
	}
Senadyan introduksi saka dependensi anyar WriteDisk, kahanan ora nambah (nanging luwih elek) amarga prinsip liyane dilanggar: "entitas piranti lunak, yaiku, kelas, modul, fungsi, lan liya-liyane, kudu mbukak kanggo extension, nanging ditutup kanggo modifikasi.” Martin nerangake yen pernyataan kondisional anyar iki nyuda stabilitas lan keluwesan kode kasebut. Solusi kasebut yaiku ngowahi dependensi supaya cara nulis lan maca gumantung saka file Copy. Tinimbang "popping" dependensi, padha liwati liwat konstruktor. Kode sing diowahi katon kaya iki:
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);
	}
Saiki kelas Copybisa gampang digunakake maneh karo implementasine beda saka cara kelas Readerlan Writer. Kelas Copyora duwe informasi babagan struktur internal saka jinis Readerlan Writer, supaya bisa digunakake maneh karo implementasine beda. Nanging yen kabeh iki misale jek kaya sawetara jenis gobbledygook kanggo sampeyan, mbok menawa conto ing ngisor iki ing Jawa lan C # bakal njlentrehake kahanan.

Tuladha ing Jawa lan C#

Kanggo nggambarake gampang injeksi dependensi tanpa wadhah dependensi, ayo miwiti nganggo conto prasaja sing bisa disesuaikan kanggo nggunakake DImung sawetara langkah. Ayo kita duwe kelas HtmlUserPresentationsing, nalika metode kasebut diarani, ngasilake antarmuka pangguna HTML. Punika conto prasaja:
HtmlUserPresentation htmlUserPresentation = new HtmlUserPresentation();
String table = htmlUserPresentation.createTable(rowTableVals, "Login Error Status");
Sembarang proyek sing nggunakake kode kelas iki bakal duwe katergantungan ing kelas HtmlUserPresentation, sing nyebabake masalah migunani lan maintainability sing kasebut ing ndhuwur. Perbaikan langsung menehi saran dhewe: nggawe antarmuka kanthi tandha kabeh cara sing saiki kasedhiya ing kelas HtmlUserPresentation. Punika conto antarmuka iki:
public interface IHtmlUserPresentation {
	String createTable(ArrayList rowVals, String caption);
	String createTableRow(String tableCol);
	// Оставшиеся сигнатуры
}
Sawise nggawe antarmuka, kita ngowahi kelas HtmlUserPresentationkanggo nggunakake. Bali menyang instantiating type HtmlUserPresentation, saiki kita bisa nggunakake jinis antarmuka tinimbang jinis dhasar:
IHtmlUserPresentation htmlUserPresentation = new HtmlUserPresentation();
String table = htmlUserPresentation.createTable(rowTableVals, "Login Error Status");
Nggawe antarmuka ngidini kita gampang nggunakake implementasi liyane saka IHtmlUserPresentation. Contone, yen kita pengin nyoba jinis iki, kita bisa kanthi gampang ngganti jinis dhasar HtmlUserPresentationkaro jinis liyane sing diarani HtmlUserPresentationTest. Owah-owahan sing ditindakake nganti saiki nggawe kode luwih gampang kanggo nyoba, njaga, lan skala, nanging ora nindakake apa-apa kanggo digunakake maneh amarga kabeh HtmlUserPresentationkelas sing nggunakake jinis kasebut isih ngerti babagan orane. Kanggo mbusak ketergantungan langsung iki, sampeyan bisa ngirim jinis antarmuka IHtmlUserPresentationmenyang konstruktor (utawa dhaptar parameter metode) saka kelas utawa cara sing bakal digunakake:
public UploadFile(IHtmlUserPresentation htmlUserPresentation)
Konstruktor UploadFilesaiki nduweni akses menyang kabeh fungsi saka jinis IHtmlUserPresentation, nanging ora ngerti apa-apa bab struktur internal kelas sing ngleksanakake antarmuka iki. Ing konteks iki, injeksi jinis kedadeyan nalika conto kelas digawe UploadFile. Jinis antarmuka IHtmlUserPresentationbisa digunakake maneh kanthi ngirim implementasi sing beda menyang kelas utawa metode sing beda-beda sing mbutuhake fungsi sing beda.

Kesimpulan lan rekomendasi kanggo nggabungake materi

Sampeyan sinau babagan injeksi ketergantungan lan kelas kasebut diarani langsung gumantung ing siji liyane nalika salah sijine instantiate liyane kanggo entuk akses menyang fungsi saka jinis target. Kanggo decouple ketergantungan langsung antarane rong jinis, sampeyan kudu nggawe antarmuka. Antarmuka menehi jinis kemampuan kanggo nyakup implementasi sing beda-beda, gumantung saka konteks fungsi sing dibutuhake. Kanthi ngliwati jinis antarmuka menyang konstruktor utawa metode kelas, kelas / metode sing mbutuhake fungsi kasebut ora ngerti rincian babagan jinis sing ngetrapake antarmuka. Amarga iki, jinis antarmuka bisa digunakake maneh ing macem-macem kelas sing mbutuhake prilaku sing padha, nanging ora padha.
  • Kanggo eksprimen karo injeksi dependensi, deleng kode sampeyan saka siji utawa luwih aplikasi lan coba ngowahi jinis basis sing akeh digunakake dadi antarmuka.

  • Ngganti kelas sing langsung instantiate jinis dhasar iki kanggo nggunakake jinis antarmuka anyar iki lan pass liwat dhaftar konstruktor utawa parameter saka cara kelas sing bakal nggunakake.

  • Nggawe implementasi test kanggo nyoba jinis antarmuka iki. Sawise kode refactored, DIiku bakal dadi luwih gampang kanggo ngleksanakake, lan sampeyan bakal sok dong mirsani carane luwih fleksibel aplikasi dadi ing syarat-syarat nggunakake maneh lan maintainability.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION