Hogy kell ezt a legjobban csinálni?
Sziasztok!
kényes témát fogok érinteni, ilyen szereplők jönnek elő a történetben, mint globális változók, singletonok..
szóval van egy alkalmazás, egy-egy funkció viszonylag sok egyéb 'réteget' használ, ezen rétegeket egy-egy osztály valósítja meg, amiknek a példányosítása elég költséges lehet.
tehát mondjuk vannak ilyeneim:
-adatbázis > DB()
-elérési utak > Path()
-config értékek > Config()
-belépett júzer > Auth()
stb..
-tehát ha van egy függvényem ami adatbázist piszkál, nem szeretném benne példányosítani a DB osztályomat, mert nem szeretném hogy ismét kapcsolódjon ahhoz az adatbázishoz, amit nemrég egy másik függvény használt
-ha szükségem van egy elérési útra ugyanolyan jó lesz nekem a húsz függvénnyel előbb példányosított Path osztályban kiszámolt elérési út.
-ha tudni szeretném hogy éles vagy tesztrendszerben vagyok-é, akkor jó nekem ha ugyanazt az értéket kapom vissza, amit másnak már visszaadtak
-ha tudni szeretném, hogy be van-e lépve a júzer, ... stb
itt ugye nyilván egy oldal generálásáról van szó.
nem szeretném ezeket az objektumokat paraméterekben dobálni, biztosan nem tartoznak oda.
eddig azt csináltam, hogy példányosítottam egy osztályt a global névtérben vagy hol, aztán ha kellett valahol, akkor global $_DB, aztán jónapot. engem a $_GET változó léte sem zavar, így hát ez sem bántja a szemem nagyon.
de azért érzem, hogy nem szép ez így, ki tudja mi van a változók mögött.. stb. hogyan lehet ezt szépen megoldani úgy, hogy ne legyen izzadtságszaga?
Singleton? annyian fikázzák, hogy nem merek belevágni anélkül, hogy más lehetőségnek ne néznék utána.
Singletonnál ugye annyi lenne, hogy global $_DB; helyett írok annyit, hogy $_DB=DB::getInstance(); és a meglévő kódom már futna is.. a gáz ezzel az, hogy egyrészt többet kell gépelnem :))) na jó ez vicc, másrészt, ha ugyanezt az osztályt fel akarnám használni egy másik adatbáziskapcsolat kezelésére párhuzamosan, akkor bukó van.
oké meg lehet oldani, hogy ne az osztályom döntsön arról, hogy ő most mi
http://phpgoodness.wordpress.com/2010/07/21/singleton-and-multiton-with-a-different-approach/
megéri??
tehát ki hogyan csinálja, csinálná? olyan egységek kialakítása a feladat, amiknek van egy költségesen előállított állapotuk (meglévő adatbáziselérés, abszolut elérési utak listája, szerverfüggő konfig értékek, júzer paraméterek), ezeket széles körben használjuk, de az állapotukat igazából nem változtatjuk (egy lekérdezés nem vált adatbázis kapcsolatot, ahogy az elérési utak sem változnak, stb..)
hogy lehet mindezt egyszerűen és szépen csinálni?
köszönöm
■ kényes témát fogok érinteni, ilyen szereplők jönnek elő a történetben, mint globális változók, singletonok..
szóval van egy alkalmazás, egy-egy funkció viszonylag sok egyéb 'réteget' használ, ezen rétegeket egy-egy osztály valósítja meg, amiknek a példányosítása elég költséges lehet.
tehát mondjuk vannak ilyeneim:
-adatbázis > DB()
-elérési utak > Path()
-config értékek > Config()
-belépett júzer > Auth()
stb..
-tehát ha van egy függvényem ami adatbázist piszkál, nem szeretném benne példányosítani a DB osztályomat, mert nem szeretném hogy ismét kapcsolódjon ahhoz az adatbázishoz, amit nemrég egy másik függvény használt
-ha szükségem van egy elérési útra ugyanolyan jó lesz nekem a húsz függvénnyel előbb példányosított Path osztályban kiszámolt elérési út.
-ha tudni szeretném hogy éles vagy tesztrendszerben vagyok-é, akkor jó nekem ha ugyanazt az értéket kapom vissza, amit másnak már visszaadtak
-ha tudni szeretném, hogy be van-e lépve a júzer, ... stb
itt ugye nyilván egy oldal generálásáról van szó.
nem szeretném ezeket az objektumokat paraméterekben dobálni, biztosan nem tartoznak oda.
eddig azt csináltam, hogy példányosítottam egy osztályt a global névtérben vagy hol, aztán ha kellett valahol, akkor global $_DB, aztán jónapot. engem a $_GET változó léte sem zavar, így hát ez sem bántja a szemem nagyon.
de azért érzem, hogy nem szép ez így, ki tudja mi van a változók mögött.. stb. hogyan lehet ezt szépen megoldani úgy, hogy ne legyen izzadtságszaga?
Singleton? annyian fikázzák, hogy nem merek belevágni anélkül, hogy más lehetőségnek ne néznék utána.
Singletonnál ugye annyi lenne, hogy global $_DB; helyett írok annyit, hogy $_DB=DB::getInstance(); és a meglévő kódom már futna is.. a gáz ezzel az, hogy egyrészt többet kell gépelnem :))) na jó ez vicc, másrészt, ha ugyanezt az osztályt fel akarnám használni egy másik adatbáziskapcsolat kezelésére párhuzamosan, akkor bukó van.
oké meg lehet oldani, hogy ne az osztályom döntsön arról, hogy ő most mi
http://phpgoodness.wordpress.com/2010/07/21/singleton-and-multiton-with-a-different-approach/
megéri??
tehát ki hogyan csinálja, csinálná? olyan egységek kialakítása a feladat, amiknek van egy költségesen előállított állapotuk (meglévő adatbáziselérés, abszolut elérési utak listája, szerverfüggő konfig értékek, júzer paraméterek), ezeket széles körben használjuk, de az állapotukat igazából nem változtatjuk (egy lekérdezés nem vált adatbázis kapcsolatot, ahogy az elérési utak sem változnak, stb..)
hogy lehet mindezt egyszerűen és szépen csinálni?
köszönöm
Yii féle megoldás
http://yiiframework.com/doc/api/1.1/CApplicationComponent
A leszármazottaknál láthatod még az egyéb alkalmazási területeket is.
A komponensek tulajdonságai config fájlokból állíthatóak, használatban meg kb. így néz ki:
Szerintem nem kell félni a singletontól
Szerintem úgy a legjobb, ha
pl:
Dependency Injection Container
A service container úgy működik mint egy registry, és tárolhatsz benne "sima" objektumot illetve singleton-t is (shared object)
mindenképp érdemes elolvasni! :)
Statikus osztályok.
A config osztályomnak pl van egy get metódusa, ami kb igy néz ki:
Ugyan ez igaz az összes kiszolgáló osztályra is, db-re, session-re mindenre.
Ráadásul igy a php autoload mehanizumusát is jó lehet használni, és tényleg csak azok a komponensek kerülnek betöltésre, amik szükségesek.