Diskuze: Logika metod a SQL dotazů

PHP PHP Logika metod a SQL dotazů American English version English version

Avatar
Martin Konečný (pavelco1998):

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
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

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
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

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.