Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Logika metod a SQL dotazů

Aktivity
Avatar
Martin Konečný (pavelco1998):21.2.2013 12:03

Ahoj,

zajímal by mě váš názor na jednu věc.
Dejme tomu, že máme například nějakou hru, kde si můžeme postavit jakýsi "supply depot", který nám umožní nakoupit další jednotky. Každý supply depot by přidal možnost kupovat o 10 jednotek navíc.
Aby se ušetřilo posílání dotazů, napsalo by se něco ve smyslu

$obj->buildSupplyDepot();

V té metodě by byl asi takový SQL příkaz

$this->db->exec("
  UPDATE `tabulka`
  SET `supply_depot` = `supply_depot` + 1, `supply` = `supply` + 10
  WHERE user_id = ...
");

Nebylo by logičtější napsat to takto?

$obj->buildSupplyDepot();
$obj->addSupply(10);

Kde metoda "buildSupplyDepot" by nedělala nic jiného, než postavila budovu, a metoda "addSupply" by přidala zmíněných 10 bodů.

Druhý způsob provede 2 databázové příkazy, čili to bude o něco náročnější, ale na druhou stranu mi to přijde jako vhodnější řešení, co se týká reality.

Pozn.: Bylo to první, co mě napadlo, tudíž teď nechci řešit, proč jsou sloupce supply_depot a supply, tak to, prosím, berte tak, jako by to bylo správně. :-)

Pozn. 2: Vlákno bez názvu (pod tímto) je to samé, zapomněl jsem napsat název. Za to se omlouvám a zároveň bych chtěl poprosit správce, zda by nemohli přidat kontrolu.

Odpovědět
21.2.2013 12:03
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:21.2.2013 12:48

Záleží na tom, zda mají nějaký smysl tyto operace v samostatném provedení. Postavit budovu bez navyšování bodů nebo navyšování bodů bez budovy. Podle mne to smysl nemá, proto by to mělo být v jedné transakci. Nejlépe jedním databázovým dotazem. Pokud si uděláš takovou mezivrstvu, která si ten dotaz nejprve poskládá z komponent a pak ho teprve provede, uděláš tak něco ve stylu ORM.

Osobně bych to udělal asi takto:

$obj->buildSupplyDepot(10);

nebo třeba takto:

$depot = new SupplyDepot(10);

Samozřejmě záleží na celkové kompozici aplikace.

Nahoru Odpovědět
21.2.2013 12:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:21.2.2013 14:12

Pokud bys chtěl vazbu na realitu, tak bys mohl vytvořit jen

$obj->buildSupplyDepot();

a trigger v databázi by se sám postaral o navýšení produktivity.

Nahoru Odpovědět
21.2.2013 14:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.