JavaRush /Блоги Java /Random-TG /Роҳи осони ворид кардани вобастагӣ

Роҳи осони ворид кардани вобастагӣ

Дар гурӯҳ нашр шудааст
Тазриқи вобастагӣ (DI) барои фаҳмидани мафҳуми осон нест ва татбиқи он ба барномаҳои нав ё мавҷуда боз ҳам печидатар аст. Ҷесс Смит ба шумо нишон медиҳад, ки чӣ гуна тазриқи вобастагӣ бидуни контейнери тазриқӣ бо забонҳои барномасозии C# ва Java анҷом дода мешавад. Роҳи оддии тазриқи вобастагӣ - 1Дар ин мақола, ман ба шумо нишон медиҳам, ки чӣ гуна тазриқи вобастагӣ (DI) дар барномаҳои .NET ва Java амалӣ карда шавад. Мафҳуми тазриқи вобастагӣ бори аввал дар соли 2000, вақте ки Роберт Мартин мақолаи "Принсипҳои тарҳрезӣ ва намунаҳо" (баъдтар бо ихтисороти SOLID маълум аст ) навишт, ба таваҷҷӯҳи таҳиягарон омад. D дар SOLID ба Dependency of Inversion (DOI) дахл дорад, ки баъдтар ҳамчун тазриқи вобастагӣ маълум шуд. Таърифи аслӣ ва маъмултарин: инversionи вобастагӣ ин инversionи тарзи идоракунии вобастагӣ мебошад. Мақолаи аслии Мартин рамзи зеринро истифода бурдааст, то вобастагии синфро Copyаз синфи поёнтар нишон диҳад WritePrinter:
void Copy()
	{
	 int c;
	 while ((c = ReadKeyboard()) != EOF)
		WritePrinter(c);
	}
Мушкилоти аввалини возеҳ ин аст, ки агар шумо рӯйхати параметрҳо ё намудҳои усулро тағир диҳед WritePrinter, шумо бояд дар ҳама ҷое, ки вобастагӣ аз ин усул вуҷуд дорад, навсозӣ кунед. Ин раванд хароҷоти нигоҳубинро зиёд мекунад ва манбаи эҳтимолии хатогиҳои нав мебошад.
Ба хондан дар бораи Java таваҷҷӯҳ доред? Ба гурӯҳи Java Developer ҳамроҳ шавед !
Мушкилоти дигар: синфи нусхабардорӣ дигар номзади эҳтимолӣ барои истифодаи дубора нест. Масалан, агар ба шумо лозим меояд, ки ҳарфҳои аз клавиатура воридшударо ба файл ба ҷои чопгар бароваред? Барои ин, шумо метавонед синфро Copyба таври зерин тағир диҳед (синтаксиси забони C++):
void Copy(outputDevice dev)
	{
	int c;
	while ((c = ReadKeyboard()) != EOF)
		if (dev == printer)
			WritePrinter(c);
		else
			WriteDisk(c);
	}
Сарфи назар аз ҷорӣ намудани вобастагии нав WriteDisk, вазъият беҳтар нашуд (балки бадтар шуд), зеро принсипи дигар вайрон карда шуд: «субъектҳои нармафзор, яъне синфҳо, модулҳо, функсияҳо ва ғайра бояд барои васеъшавӣ кушода бошанд, аммо барои васеъшавӣ баста бошанд. тағйирот." Мартин мефаҳмонад, ки ин изҳороти нави шартӣ, агар/else устуворӣ ва чандирии codeро коҳиш медиҳад. Ҳалли ин табдил додани вобастагӣ аст, то усулҳои навиштан ва хондан аз Copy. Ба ҷои вобастагии "popping" онҳо аз конструктор гузаронида мешаванд. Рамзи тағирёфта чунин менамояд:
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);
	}
Акнун синфро Copyбо татбиқи гуногуни усулҳои синф Readerва Writer. Синф дар бораи сохтори дохorи намудҳо ва , Copyмаълумоте надорад, ки имкон медиҳад дубора истифода бурдани онҳо бо татбиқи гуногун. Аммо агар ин ҳама ба назари шумо як навъ ғоибона ба назар расад, шояд мисолҳои зерин дар Java ва C# вазъро равшан кунанд. ReaderWriter

Намуна дар Java ва C #

Барои нишон додани осонии тазриқи вобастагӣ бе контейнери вобастагӣ, биёед бо як мисоли оддие оғоз кунем, ки онро барои истифода DIбо чанд қадам танзим кардан мумкин аст. Фарз мекунем, ки мо синфе дорем HtmlUserPresentation, ки ҳангоми даъват кардани методҳои он интерфейси корбари HTML тавлид мекунад. Инак як мисоли оддӣ:
HtmlUserPresentation htmlUserPresentation = new HtmlUserPresentation();
String table = htmlUserPresentation.createTable(rowTableVals, "Login Error Status");
Ҳар як лоиҳае, ки ин рамзи синфро истифода мебарад, аз синф вобастагӣ дорад HtmlUserPresentation, ки дар натиҷа масъалаҳои қобor истифода ва нигоҳдорӣ дар боло тавсиф мешаванд. Такмил дарҳол худро пешниҳод мекунад: эҷод кардани интерфейс бо имзои ҳама усулҳои дар синф мавҷудбуда HtmlUserPresentation. Ин аст як мисоли ин интерфейс:
public interface IHtmlUserPresentation {
	String createTable(ArrayList rowVals, String caption);
	String createTableRow(String tableCol);
	// Оставшиеся сигнатуры
}
Пас аз сохтани интерфейс, мо синфро HtmlUserPresentationбарои истифодаи он тағир медиҳем. Бозгашт ба инстансияи навъи HtmlUserPresentation, мо акнун метавонем ба ҷои навъи асосӣ навъи интерфейсро истифода барем:
IHtmlUserPresentation htmlUserPresentation = new HtmlUserPresentation();
String table = htmlUserPresentation.createTable(rowTableVals, "Login Error Status");
Эҷоди интерфейс ба мо имкон медиҳад, ки дигар татбиқи IHtmlUserPresentation. Масалан, агар мо ин намудро санҷидан хоҳем, мо метавонем ба осонӣ навъи асосиро HtmlUserPresentationбо навъи дигаре бо номи HtmlUserPresentationTest. Тағиротҳое, ки то имрӯз ворид карда шудаанд, санҷиш, нигоҳдорӣ ва миқёси codeро осонтар мекунанд, аммо барои истифодаи дубора ҳеҷ коре намекунанд, зеро ҳама HtmlUserPresentationсинфҳои истифодакунандаи ин навъи он ҳанӯз ҳам аз мавҷудияти он огоҳанд. Барои бартараф кардани ин вобастагии мустақим, шумо метавонед як намуди интерфейсро IHtmlUserPresentationба конструктор (ё рӯйхати параметрҳои усул) -и синф ё усуле, ки онро истифода мебарад, гузаронед:
public UploadFile(IHtmlUserPresentation htmlUserPresentation)
Конструктор UploadFileҳоло ба тамоми функсияҳои навъи дастрасӣ дорад IHtmlUserPresentation, аммо дар бораи сохтори дохorи синф, ки ин интерфейсро амалӣ мекунад, чизе намедонад. Дар ин замина, тазриқи навъи ҳангоми сохтани як намунаи синф ба амал меояд UploadFile. Навъи интерфейс IHtmlUserPresentationтавассути интиқоли татбиқҳои гуногун ба синфҳо ё усулҳои гуногун, ки функсияҳои гуногунро талаб мекунанд, дубора истифодашаванда мегардад.

Хулоса ва тавсияҳо оид ба ҷамъбасти мавод

Шумо дар бораи тазриқи вобастагӣ фаҳмидед ва гуфта мешавад, ки синфҳо мустақиман аз ҳамдигар вобастаанд, вақте ки яке аз онҳо дигареро барои ба даст овардани дастрасӣ ба функсияи навъи мақсаднок эҷод мекунад. Барои ҷудо кардани вобастагии мустақим байни ин ду намуд, шумо бояд интерфейс эҷод кунед. Интерфейс ба намуд имкон медиҳад, ки татбиқи гуногунро вобаста ба контексти функсияҳои зарурӣ дохил кунад. Бо додани навъи интерфейс ба созандаи синф ё метод, синф/усуле, ки ба функсионалӣ ниёз дорад, ҳеҷ тафсилотро дар бораи навъи татбиқкунандаи интерфейс намедонад. Аз ин сабаб, як намуди интерфейсро дар синфҳои гуногун, ки рафтори шабеҳ, вале якхела нест, дубора истифода бурдан мумкин аст.
  • Барои озмудани тазриқи вобастагӣ, codeи худро аз як ё якчанд барномаҳо бубинед ва кӯшиш кунед, ки як навъи пойгоҳи хеле истифодашавандаро ба интерфейс табдил диҳед.

  • Синфҳоеро, ки мустақиман ин навъи асосиро эҷод мекунанд, иваз кунед, то ин навъи интерфейсро истифода баред ва онро тавассути конструктор ё рӯйхати параметрҳои усули синф, ки онро истифода мебарад, гузаронед.

  • Барои санҷидани ин намуди интерфейс як амали санҷиш эҷод кунед. Вақте ки рамзи шумо рефакторизатсия карда мешавад, DIтатбиқи он осонтар мешавад ва шумо хоҳед дид, ки барномаи шумо дар робита ба истифодаи такрорӣ ва нигоҳдорӣ то чӣ андоза чандиртар мешавад.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION