Autor Zpráva
suky
Profil
Omlouvam se za zdvojeny thread, ale v tom minulem (link) se mi nedostalo uspokojujici odpovedi, proto se ptam znovu.

I) Jak lze zrušit objekt ze zasobniku, pokud to tedy lze.
II) Je zadouci i u PHP puzivat navrhovy vzor Crate pri vraceni vice jak jedne polozky z nejake metody?
bukaj
Profil
suky
I) Detailně jsem implementaci PHP nezkoumal, ale pokud vím, vytváří se všechno, tedy včetně objektů, na haldě a používá se reference counting, z čehož plyne, že k opravdovému zrušení objektu (zavolání destruktoru, uvolnění paměti) dojde až tehdy, neukazuje-li na něj nic.

II) Tento návrhový vzor neznám, ale podle toho a pouze podle toho, co jsi psal v prvním vlákně, se mi zdá jako zbytečnost.
suky
Profil
bukaj
I) Co myslis pod tim, kdyz na nic neukazuje?
II) Jeste nez ho uplne zavrhnes, popisu ti ho lepe.

Pokud z metody napriklad returnPositon() potrebuju vratit objekt souradnice X a objekt souradnice Y, nabizi se Crate (Prepravka), ktera vytvori instanci tridy s rozhranim odpovidajicim vracenym objektum, napasuje do ni vracene objekty a celou instanci vrati.
Alternativa v PHP je pole s klici souradnice_X a souradnice_Y a hodnotami prislusnych objektu.
bukaj
Profil
suky
Co myslis pod tim, kdyz na nic neukazuje?
Asi jsem se špatně vyjádřil. Měl jsem na mysli, když čítač referencí dosáhne nuly.

Jeste nez ho uplne zavrhnes
Tak prr, nic takového jako "nepoužívej to," jsem neřekl :) Navíc, podle toho, jak jsi to popsal v prvním vlákně, jsem myslel, že prostě jenom chceš obalit pole objektem, který by se však choval a zvenčí vypadal jako pole. Ten příklad s těmi souřadnicemi je jeden z případů, kdy to smysl může mít, kvůli věčem okolo, jako validaci vstupu, výstupu atd. Ale i to je na pováženou, jestli některých výhod využiješ. Ke všemu v PHP, s jeho typováním...
suky
Profil
bukaj
Co myslis tou validaci vstupu/vystupu?
bukaj
Profil
suky
To mluvím tak šifrovaně? :)

Co myslis tou validaci vstupu/vystupu?
Např. že by u toho bodu mohly být souřadnice x a y pouze v nějakém rozmezí. A pokud by nebyly, konstruktor by kupř. vyhodil výjimku.
suky
Profil
bukaj
No Rudolf Pecinovsky tuto moznost nabizel, ale nedoporucoval ji, objekt by mel slouzit ciste jako prepravka na dalsi objekty. Takovato validace se da provest pred return.
bukaj
Profil
suky
Ono pak hodně závisí na tom, co vlastně dělám. Kdybych dělal nějakou aplikaci, která pracuje s těmi souřadnicemi pořád pracuje (kupř. kreslící program), neváhal bych a klidně takový kontejner udělal. Ale zase se mi zdá zbytečné vytvářet třídu specielně proto, abych mohl z jedné fce vrátit takovouto dvojici čísel. Záleží opravdu čeho chci dosáhnout.
suky
Profil
bukaj
Samozrejme, to byl jenom priklad :D Jde o to vracet vice jak jeden objekt. Napr.

1. Mame objekty Ctverec a Kruh.
2. Parametrem metody vybarvi($i) objektu UpravaGeometrickychTvaru objekty vybarvime.
3. Dalsi metodou vratVybarvene() budeme chtit vratit vsechny objekty, ktere jsme uz vybarvili...
4. Pouzijeme navrhovy vzor Crate (Prepravka).

Vysledkem by tedy bylo, ze pokud ma cenu tento navrhovy vzor pouzit, tak se pouzije.
bukaj
Profil
suky
V tom poslední případě, co jsi uvedl bych to přesně nepoužil. V PHP bych vrátil normálně pole s těmi objekty (return array($prvni_objekt, $druhy_objekt...);). Nač to komplikovat a vytvářet nějakou přepravku?
suky
Profil
bukaj
Ve kterym pripade bys to tedy pouzil, zda bys to tedy pouzil? V knize bylo popsano, ze jeji vyhoda je v preddefinovanem rozhrani...
bukaj
Profil
suky
Ve kterym pripade bys to tedy pouzil, zda bys to tedy pouzil?
V PHP a při programování webových aplikací jsem žádný příklad využití nevymyslel. Ale v grafických aplikacích to v některých případech má smysl. Kupř. již ten zmíněný bod. Nebo takové geometrické tvary. Ty vlastně taky jako takové toho moc nedělají, jenom mají settry a gettry (pomyšlení, že by se sami i kreslily mi zavání přílišnou závislostí na implemntaci), které nastavují jejich hodnoty, a proto by se taky daly považovat jen za přepravku. Prostě tento návrhový vzor bych nepoužíval pro případy, kdy chci vrátit víc objektů jednoho druhu, ale pro případy, kdy vracím jednotný objekt, který má nějaké vlastnosti, ke kterým potřebuji přistupovat, ale jako takový toho vlastně moc nedělá.

V knize bylo popsano, ze jeji vyhoda je v preddefinovanem rozhrani...
Ano, to je pravda. Ale teď si vezmi ten příklad s vracením více vybarvených geometrických tvarů. Buď můžeš vytvořit přepravku, nebo vrátit pole. Řekněme, že vytvoříš přepravku. Jelikož počet vybarvených objektů nemusíš předem znát, vytvoříš metodu current(), která vrací prvek, nad kterým je teď ukazatel, metodu next(), která posune ukazatel a pak vrátí, zbývá-li nějaký prvek, ten nad kterým je ukazatel, jinak null, a metodu reset(), která posune ukazatel na začátek pole.

Pokud se podíváš do PHP manuálu, tak přesně tyto fce jsou tam popsány pro práci s polem. Vytvořením přepravky bys akorát duplikoval (možná i trochu abstrakoval) funkcionalitu, kterou již poskytuje pole. Ale k čemu? V přepravce můžeš použít type hinting, který zajistí, že se ti do přepravky nedostane nic jiného, než co chceš. Ale zase tím ztratíš na rychlosti.
suky
Profil
bukaj
pro případy, kdy vracím jednotný objekt, který má nějaké vlastnosti, ke kterým potřebuji přistupovat, ale jako takový toho vlastně moc nedělá.
Ale v popisu navrhoveho vzoru je popsano, ze jeho ucel spociva v tom, ze ma opravdu prepravovat, stejne jako v poli, jen objekty.

Ano, to je pravda. Ale teď si vezmi ten příklad s vracením více vybarvených geometrických tvarů. Buď můžeš vytvořit přepravku, nebo vrátit pole. Řekněme, že vytvoříš přepravku. Jelikož počet vybarvených objektů nemusíš předem znát, vytvoříš metodu current(), která vrací prvek, nad kterým je teď ukazatel, metodu next(), která posune ukazatel a pak vrátí, zbývá-li nějaký prvek, ten nad kterým je ukazatel, jinak null, a metodu reset(), která posune ukazatel na začátek pole.
Tohle co popisujes mi zavani rozhranim ArrayAccess, ale porad si myslim, ze si nerozimime :D

Pokusim se ti dat jeste lepsi priklad :D i kdyz uz fakt nevim, co ze sebe vymacknu :D

Predstav si prepravku v realnem svete, ve ktere mas formy presne na tri objekty, tzn, treba takova aktovka a jeji kapsy na:

- penal
- soubor knih a sesitu
- lahev s pitim

Takove by bylo rozhrani teto prepravky. Metoda, ktera by napriklad vracela obsah aktovky by sahla po tride prepravky, ktera by implementovala vyse zminene rozhrani a vratila by ho i s objekty (napr. cerveny penal, soubor knih a sesitu na uterni skolni den, lahev s pitim znacky Coca Cola).

De facto je to stejne jako s polem, ale pokud vratime pole, musime znat klice, pokud vratime prepravku, musime znat rozhrani a do prepravky uz nic vic nenacpeme. Jak si psal:
že se ti do přepravky nedostane nic jiného, než co chceš

Da se rict, ze pokud pouzijeme prepravku, musime nejdrive zjistit, co chceme vratit, pak vytvorime rozhrani, ktere nasledne implementujeme do prepravky a muzeme pracovat na obou stranach s timto rozhranim. V pripade pole "rozhrani" (klice) definujeme v metode. Co je rychlejsi?
suky
Profil
bukaj
Jelikož počet vybarvených objektů nemusíš předem znát
Ano, spatne jsem uvedl priklad, museli bychom uvazovat nejake stabilni rozhrani...
bukaj
Profil
suky
Ale v popisu navrhoveho vzoru je popsano, ze jeho ucel spociva v tom, ze ma opravdu prepravovat, stejne jako v poli, jen objekty.
A taky, že ty případy, které jsem popsal, taky jenom objekty přepravují a definují rozhraní, jak k těm přepravovaným objektům přistupovat.

Pokusim se ti dat jeste lepsi priklad :D
Ano, příklad to byl pěkný. Z reálného života. A už asi vím, proč se nemůžeme shodnout.

Myslím, že tady jde o to, že jeden myslí něco a druhý to chápe jinak :) Zatímco ty jsi myslel přepravku ve smyslu vytvoření nového složeného datového typu (něco jako v Céčku struct), že? Já to pořád chápal tak, že chceš akorát udělat objekt, který obalí pole proměnné délky. Což podpořil ten příklad s vybarvováním.
suky
Profil
bukaj
V Cecku jsem zatim nic nezkousel, takze neznam ani struct. Ano, myslel jsem vytvorit novy objekt slouzici jen k rozebrani objektu, ktere obsahuje, nekde jinde, kde si o metodu zazadame. Jaky je tedy tvuj zaverecny nazor?
BetaCam
Profil
suky

Je zadouci i u PHP puzivat navrhovy vzor Crate pri vraceni vice jak jedne polozky z nejake metody?

Toto je filozofická otázka na kterou se nedá jednoznačně odpovědět. Žádoucí je používat tento vzor pokud ti přináší v nějaké konkrétní situaci nějaké výhody. DP nejsou žádné dogma proto jejich použití vždy záleží na konkrétní situaci a názoru programátora na přínos daného vzoru v této situaci.
suky
Profil
BetaCam
Nj, to je mi jasne, ale v knize jsou priklady uvedeny u Javy, u ktere nevim, jak pole funguji. Dal bys mi pls naky priklad, ve kterem bys tento navrhovy vzor pouzil?
BetaCam
Profil
suky

Predstav si prepravku v realnem svete, ve ktere mas formy presne na tri objekty, tzn, treba takova aktovka a jeji kapsy na:
- penal
- soubor knih a sesitu
- lahev s pitim


No nevím, ale tohle mi taky nepřijde zrovna jako dobrý příklad. Problém u tohoto příkladu je v tom, že každá aktovka je jiná. Některá bude mít jak ty uvádíš 3 kapsy, ale některá jich bude mít třeba 20. V podstatě by si pak musel definovat pro každý jednotlivý typ aktovky vlastní specializovanou přepravku.
suky
Profil
BetaCam
Taky ze takhle to Rudolf Pecinovsky v knize popisoval...
BetaCam
Profil
suky
Taky ze takhle to Rudolf Pecinovsky v knize popisoval...

No je pravda je již je to nějaký pátek co sem jeho knihu četl, ale pokud si dobře pamatuji tak on to tam popisoval na specializované a obecné definici přepravky. Pokud bych vzal tu tvojí aktovku tak by to mohlo vypadat např.:

Přepravka se bude jmenovat aktovka a její položky budou definovány například :

item (String penal, String ucebnice, String piti)

či přepravka novinky s položkami třeba takhle :

item (String name, String text, String autor)

máš tedy přepravku na aktovky a novinky pokud je budeš používat každou pro svůj účel tak je to v pořádku.

Položky přepravek aktovka a novinky mají "stejnou" definici takže by si klidně mohl používat přepravku aktovka i pro novinky, ale to je chyba protože přepravka by měla být specializovaná a měla by se používat jen k tomu účelu ke kterému byla vytvořena.

Jinak osobně bych Přepravky použil tam kde přepravované objekty mají jasně a pevně danou strukturu.

Ale neber tohle doslova, protože Přepravky nejsou moje hoby a ať vzpomínám jak vzpomínám nemůžu si vybavit jestli sem je někdy v PHP "úmyslně" použil. :)
suky
Profil
BetaCam, bukaj
OK. Diky moc chlapi.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0