Dependency Injection

Programovacie jazyky, rady, poradňa...
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Dependency Injection

Príspevok od používateľa harrison314 »

Zdravím,
mohol by mi dakto vysvetlit Dependency Injection, bez implementacnych detailov, co najjednoduchsie a najabstraktnejsie?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Dependency Injection

Príspevok od používateľa audiotrack »

bez implementačných detailov sa to vysvetliť nedá, ale pokúsim sa ich množstvo minimalizovať. Budem používať syntax jazyka PHP.

Pointa je v udržiavateľnosti kodu. Veľa programátorov píše kod typu:

Kód: Vybrať všetko

class Trieda{

        var $_database = NULL;
 
	public function __construct() {
 
		$registry  = RegistrySingleton::getInstance();
		$this->_database = $registry->database;
 	}
 
}
alebo

Kód: Vybrať všetko

class Trieda{

        var $_database = NULL;
 
	public function __construct() {
 
		global $databaseConnection;
		$this->_database = $database;
 	}
 
}
V prvom prípade sa používa návrhový vzor singleton, v druhom globálna premenná. Oba však robia to isté - vytvoríme si triedu a predáme jej odkaz na spojenie na databázu, lebo v danej triede máme metody ktoré vyžadujú prácu s databázou. Takéto riešenie je však zlé, lebo sme odkázaný na vonkajší kod, ktorý nie je (nemusí byť) v našej réžii. My sme autorom triedy, a ak ju niekto zle implementuje, nebude fungovať. Ak niekto nepoužije globálnu premennú, alebo neimplementuje daný singleton, nebude mu náš kod fungovať. Inak povedané - my ho nútime prerábať jeho hotový kod na používanie singletonu alebo globálnej premennej ak chce použiť našu triedu. To je zlé. V jednom článku o tom bolo pekne napísané, že hierarchia má ísť z hora dole, nie z dola hore. Nemáme my volať čo chceme, ale má nám to program sám ponúknuť. Ako aj herci nežiadajú úlohu, ale režisér im ju ponúka. Takže správne riešenie má byť:

Kód: Vybrať všetko

class Trieda{
 
	private $_databaseConnection;
 
	public function __construct() { }
 
	public function setDatabaseConnection($databaseConnection) {
		$this->_databaseConnection = $databaseConnection;
	}
 
}
a zavolanie

Kód: Vybrať všetko

$objekt = new Trieda();
$objekt->setDatabase($databaseConnection);
Teraz sa už nespoliehaš na globálnu premennú, ani na singleton. Nemáš tam žiadne "skryté" závislosti. Sám programátor určí spojenie, ktoré sa bude používať. Vložil závislosti (dependency injection). V zásade máš dve možnosti ako to použiť.
1) setterom:

Kód: Vybrať všetko

$objekt = new Trieda();
$objekt->setDatabase($databaseConnection);
$objekt->setConfigFile($configFile);
2) parametrom v konštruktore:

Kód: Vybrať všetko

$objekt= new Trieda($databaseConnection, $configFile);
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Dependency Injection

Príspevok od používateľa harrison314 »

audiotrack: Dakujem, strucne, vystizne, pochopitelne.

karmista: obcas clovek pouziva aj veci, ktore nevie ako sa volaju, mat na vsetko rozhranie mi pride prirodzene
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Re: Dependency Injection

Príspevok od používateľa Gregi »

A teraz s pravdou von Audiotrack. Toto si vypotil z hlavy, ci si si i cosi dostudoval? Ak z hlavy, ako si taketo veci moze clovek zapamatat? Ved toho je kvantum. Kolko sa vlastne venujes programovaniu? Ja vobec akosi neviem pochopit obsah tvojho prispevku a viem ze je to vo mne. Kde bude chyba? AKo sa posunut dalej? Ja mozem precitat celu knihu C++, ale ked sa ma o 2 mesiace ktosi syta ako by som toto a toto naprogramoval, urcite by som to z hlavy nepsravil. Bez pomoci pozerat opat do knih. Asi treba prijat tu zlu spravu ... nikdy zo mna dobry programator nebude :nono:
Zaujmy: Pascal, Object pascal (Delphi), Assembler.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Dependency Injection

Príspevok od používateľa audiotrack »

človek si to zapamätá, keď ho to baví a vyštudoval to. A programovaniu sa venujem dlho, tuším niekde v tretiaku na strednej som začal. Aspoň z toho roku som prvý diplom doma našiel :) Takže nejakých 8 rokov cca
awtt
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1234
Registrovaný: 01 nov 2006, 19:37
Bydlisko: San Francisco
Kontaktovať používateľa:

Re: Dependency Injection

Príspevok od používateľa awtt »

Gregi napísal:A teraz s pravdou von Audiotrack. Toto si vypotil z hlavy, ci si si i cosi dostudoval? Ak z hlavy, ako si taketo veci moze clovek zapamatat? Ved toho je kvantum. Kolko sa vlastne venujes programovaniu? Ja vobec akosi neviem pochopit obsah tvojho prispevku a viem ze je to vo mne. Kde bude chyba? AKo sa posunut dalej? Ja mozem precitat celu knihu C++, ale ked sa ma o 2 mesiace ktosi syta ako by som toto a toto naprogramoval, urcite by som to z hlavy nepsravil. Bez pomoci pozerat opat do knih. Asi treba prijat tu zlu spravu ... nikdy zo mna dobry programator nebude :nono:
Zaujmy: Pascal, Object pascal (Delphi), Assembler.
Ked si len precitas knihu a nevenujes sa tomu tak to zabudnes to je jasne.
Ale keby si pracoval ako programator, alebo aspon vo volnom case aj nieco realne programoval tak nemas problem ver mi :)
Ked chces byt programator, tak citanie knih nestaci, daj si nejake fiktyvne ulohy typu naprogramovat pozicovnu knih, guestbook... to ti da viac :)
Napísať odpoveď