ugrás a tartalomhoz

Introducing the Flyweight Pattern with PHP 5

Török Gábor · 2007. Feb. 27. (K), 16.14
Teljesítmény javítás a flyweight minta alkalmazasával
 
1

elég értelmetlen

Hodicska Gergely · 2007. Feb. 27. (K), 18.26
A cikk fő tanulsága számomra az volt, hogy a cikk szinvonala, és az őt tartalmazó weboldalon található reklámok száma fordítottan arányos. Az egy dolog, hogy a példa teljesen értelmetlen, de az egész koncpeció nem teljesen tiszta számomra: ha megoldom, hogy x valamit egy x-nél kevesebb számú valami kezeljen, akkor miért ne 1 legyen az x-nél kisebb szám? És akkor a teljesen alap Singleton/Factory mintánál vagyunk.


Üdv,
Felhő
2

kiegészítés

Hodicska Gergely · 2007. Feb. 28. (Sze), 02.40
Kíváncsiságból rákerestem erre a mintára. A lényege nagyjából az lenne, hogy ha egy program számára különböző helyeken szükség lenne ugyanarra az objektumra, akkor erőforrást takaríthat meg akko, ha nem minden esetben hoz létre egy példányt, hanem a különböző helyeken az egyszer létrehozott objektum referenciát használja.

A tipikusan emlegetett példa felhasználók és a hozzájuk tartozó termékek esete. Meg lehet ezt úgy is csinálni, hogy minden felhasználó minden egyes terméke egy külön objektum (ha egy termék 3 emberhez is tartozik, akkor 3 példány létezik belőle), de azt is megtehetjük, hogy a termékekből csak egy példányt hozunk létre (egy poolban tároljuk őket), és a felhasználóknak csak egy referenciákat tartalmazó listájuk van.

A cikkből kb. az jött le erre az estre vonatkozóan, hogy nem 100 termék objektumot hozunk létre, hanem csak 20-at, és ezzel oldjuk meg a dolgot. Közben nem csak valamennyivel kevesebb objektum jön létre, hanem típusonként 1. A cikkbeli példa azért volt szar, mert nyilván azonos nevű input elemeket nem szeretnék létrehozni egy űrlapon belül, viszont ha 100 text input van egy fomron, akkor kénytelen vagyok az ő példája alapján 100 objektumot létrehozni, tehát semmit sem nyerek a minta használatával.

Ha viszont úgy gondolunk rá, mint típusonként egy példány, akkor már tényleg van értelme, és akár már itt a weblaboron is találkozhattunk a minta használatával. Ha megnézzük a Dao cikket, akkor a DaoFactory osztály pont ezt valósítja meg.

Ezenkívül PHP4 esetén bárhol hasznos lehet, ahol csak azért példányosítunk egy objektumot, mert itt még nincs osztály szintű változó (persze lehetne "emulálni" statikus metódusok használatával, de se túl szép). Egy példa ha már fomr kezelést említette a cikk: input elemek ellenőrzése. Legyenek különböző típusú Rule osztályaink (integer, email stb.). Mindegyikhez tartozhatnak saját hibaüzenetek. Ezeket nem tudjuk statikus tagváltozókba tenni, ezért dönthetünk amellett, hogy a konstruktorban adjuk értékül őket a $errMsg változónak, így az ellenőrzés használatához létre kell hozzuk az adott Rule-t. Viszont az ellenőrzés maga az adott Rule típus esetén általános, ezért ha több mezőhöz is hozzá van rendelve mondjuk a notEmpty ellenőrzés, akkor felesleges minden esetben egy példányt létrehozni, hanem elég csak egyszer, és ezt használjuk fel újra meg újra.


Üdv,
Felhő