Model, fasáda, ORM čistý přístup
- Pavel Kravčík
- Člen | 1196
Mějme model, kde je 10 repositářů. A třeba pět komponent A, B, C, D,
E. Řekněme, že tam není složitější bussiness logika a vše si obslouží
ty komponenty samy (suchý CRUD), co zvládne
$repository->save()
a podobně.
Každá komponenta má 7 závislostí, ale zároveň žádná nemá stejné závislosti jako předchozí. Co je lepší přístup v Nette? Napadlo mě následující.
Místo současného stavu:
class ComponentA
{
public function __construct(repo1, repo2, repo5, repo6, repo7, repo8, repo10)
{}
public function render()
{
$this->repo2()->exec();
}
}
class ComponentB
{
public function __construct(repo1, repo2, repo5, repo6, repo7, repo8, repo10)
{}
public function render()
{
$this->repo8()->exec();
}
}
Udělat následující:
class ModuleModel
{
public function __construct(repo1, repo2, ..., repo10)
public function getRepo1()
{
return $this->repo1;
}
}
class ComponentA
{
public function __construct(ModuleModel)
{}
public function render()
{
$this->ModuleModel->getRepo1()->exec();
}
- Felix
- Nette Core | 1247
Vetsinou kdyz maji moje komponenty vic jak 3 zavislosti na modelove vrstve, tak to vyclenuju do vlastniho mini-modelu (pokud je to fakt unikatni, tzn. skoro nikdy :-)), pripadne do fasade / service vrstvy.
Za me jsou dobre oba pristupy co tu ukazujes, pokud ModuleModule je mysleno jako fasada nad temi repo1…repoN. Pokud by to slouzilo jako linker, pripadne mini-container. Tak uz to hranici se ServiceLocatorem jak popisuje @Barvoj.
- Svaťa Šimara
- Člen | 98
Pokud mám tolik závislostí, zřejmě něco dělám špatně™.
A vskutku, pokud např. formulář obsahuje 7 selectboxů, může se ukázat, že jde po UX stránce nevhodně navržený formulář.
Co se v takových situacích dá dělat – odstínit kontext UI od modelu. A teď bohužel musím hodně abstraktně, protože neznám požadavky…
<?php
interface ModelAdapter {
public function getOptionsA();
public function getOptionsB();
public function saveWholeForm(array $data);
}
?>
Tím zbyde pouze jedna závislost, která dělá pouze use-casy, které potřebujeme. Její implementace už bude mrcha závislá na 7 repozitářích.
Anebo nemusí, takovýto adaptér nemusí být osamocen, mohou být třeba 2. Komponenta bude závislá na 2 adaptérech, a každý z nich „jenom“ na menším počtu repozitářů.
- Svaťa Šimara
- Člen | 98
@Oli Nezbavím, to jsem netvrdil.
Inu ukázka: https://drive.google.com/…bWJaZUU/view?…
- Pavel Kravčík
- Člen | 1196
Díky za tipy.
To je právě to dilema, co zmínil Felix… Pokud by bylo deset modelů nebo deset obsáhlých repositářů. Asi by to měl být minicontainer na určité případy, kdy není potřeba nic dopisovat kromě závislosti repositáře. Tedy předpokládejme, že repositář umí základ CRUD fce (save, getBy, findBy, delete). Pokud by to měla být složitější logika, tak samozřejmě model s vlastním API.
Jasně, že formulář se sedmi závilostmi nemusí být dobře navržen. Je to jen teoretický příklad.