předávání dat mezi modelem a aplikací

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
BigCharlie
Člen | 283
+
0
-

Ahoj,

snažím se trochu si pohrát se svou miniaplikací v Nette a při refactoringu jsem narazil na následující problém. Hledám cosi jako Best practice pro způsob přenášení dat mezi modelem a zbytkem aplikace. Hledal jsem i tady na fóru, kde jsem dohledal jedno nosné téma.

O co mi jde – model by měl pospojovat a zapouzdřit všechny logicky související záležitosti (alespoň tak jsem to pochopil). Navenek by měl poskytovat pouze pevná rozhraní. Když se podívám do examples v distribuci Nette nebo do výše uvedeného topicu, data pro přidání či pro úpravy se předávají v asociativním poli. Nevynáším tím logiku modelu z modelu ven? Chápu jednoduchost a eleganci, ale není to zároveň problém? Chápu to u jednoduché aplikace, ale použijete totéž u něčeho většího, kde očekáváte větší robustnost?

Pokud udělám pevné rozhraní, představuji si to u jedné funkce nějak takhle (vycházím z původního topicu, pomiňte reálnost příkladu):

function editBanner($id, $name, $filename)
{
		$args = array(
			'id' => $id,
			'name' => $name,
			'filename' => $filename,
		);
        return dibi::query('UPDATE [Banners] SET', $args);
}

Rozhraní je pevně dané. Ale přibyla práce (volání metody z aplikace je „nabobtnalé“, opětovná práce s parametry, obzvlášť v případě větších tabulek). Může někdo objasnit výhody? Nebo odkázat na dobrý článek s příklady, který to objasní? Hledal jsem po internetu, ale marně. Nebo spíš blbě :-(

V tom vlákně phx zmiňuje mezivrstvu, která vrací objekty – nebyl by, prosím, k dispozici příklad, z kterého bych to pochopil?

A nemáte někdo v rukávu nějaké další Best practicies, týkající se předání dat, které by stály za úvahu? Ono by se to jistě šiklo i do připravované kuchařky Nette.

phx
Člen | 651
+
0
-

Osobne jsem tuto cestu davno zavrhl.

  • slabsi vykon
  • zbytecna prace s objekty navic
  • slozitejsi udrzba

Sice to melo par vyhod, napr v budoucnosti pri zmenach v DB, ale za par let jsem tyto vyhody moc nevyuzil takze jsem tento navrh opustil.

Nedavno David publikoval DataSource, ktery mi prijde idelani (v soucasnosti pouzivam). Mam objekt (nazveme je X) ktery dedi od meho objektu Model (vpodstate vylepseny ArrayObject). V nem jsou metody na insert, update, delete a kompletni praci s daty. Nacitani z DB je reseno pomoci statickych metod, ktere vraceji MyDataSource (podedeny a vylepseny DataSource). Onen MyDataSource vraci pri nacteni radek, ktery je reprezentovany objektem X.

Toto reseni se mi zda idealni. Vykon supr:) Je to lazy. A Vytvoreni noveho objekut pro praci s dalsimi daty je jen otazka 1 objektu s onim verejnym rozhranim. A ne jako jsem to mel driv (DBModel = data v objektu, DBService = metody pro praci s databazi)

Pokud je zajem mohu ukazat obe dve metody.

xificurk
Člen | 121
+
0
-

phx napsal(a):

Toto reseni se mi zda idealni. Vykon supr:) Je to lazy.

Sice je to lazy, ale ty subselecty v DataSource by mohly být docela dobrým zabijákem pro databázi. Jako každou věc, i DataSource je potřeba používat s rozmyslem, někdy se hodí, někdy ne.

phx
Člen | 651
+
0
-

Myslis jako select sloupecku z dotazu? No zatim jsem s tim vykonove nemel problem. Pokud nekdy bude tak se proste ten konkretni dotaz priohne bez DataSource.

Otazka zni jak si to databaze zpracovava. Zda je inteligentni a onen select zohledni pri vybirani suselectu:)

BigCharlie
Člen | 283
+
0
-

Pokud je zajem mohu ukazat obe dve metody.

Minimálně já bych zájem měl.

Tomik
Nette Evangelist | 485
+
0
-

phx napsal(a):

Pokud je zajem mohu ukazat obe dve metody.

Člověk se vždycky rád inspiruje.. :)

Honza Kuchař
Člen | 1662
+
0
-

phx napsal(a):

Pokud je zajem mohu ukazat obe dve metody.

Taky se rád inspiruju. :)

Editoval honzakuchar (26. 4. 2009 17:44)

phx
Člen | 651
+
0
-

Takze jsme pro vas pripravil nefunkcni zdrojaky pro praci s tabulkou account.

Jsou tam 2 varianty:

OLD

  • models – datove obejkty z reprezentujici tabulku (pohled) v DB
    • tables – jednotlive tabulky dediti od DBModel, dokaze se naplnit z asoc. pole, ma definovane atribury a do jsem pripradne dodelaval gettry pro ruzne formaty atributu.
  • services – slozby pro komunikaci s DB prostrednictvim DB objektu
    • base – zakladni tridy (predkove) s obecnou zakladni funkcnosti, insert, update, delete, select, …
    • SAccount – sprava tabulky account, uklada, nacita, upravuje data v DB, data se predavaji ve forme objektu (viz adresar models)
  • – pomalé (hodně rezije okolo)
  • – mnoho souboru kolem 1 tabulky, slozite vytvareni
  • – bez podpory vice PK
  • + podpora zmeny nazvu v DB (zmena transformArray)

NEW

  • models
    • Account – datovy objekt BEZ urcenych parametru, pouze urcene PK, umi se ulozit/upravit do DB, ma metody pro ziskani MyDataSource dane tabulky
    • Model – predek s obecnymi metodami
    • MyDataSource – upraveny DS s tim, ze muze vracet misto DibiRow objekt, ktery urcim (potomek Model)
  • + podpora vice PK (neni dokonceno)
  • + lazy
  • + malo kodu → mala rezije
  • + libi se mi:)
BigCharlie
Člen | 283
+
0
-

Díky, rád se mrknu a myslím, že to platí i pro ostatní.