Services – extendes od jiné services
- MartinitCZ
- Člen | 580
Ahoj. Řešim takové dilema, které už jste asi někdo řešil. Z tohoto důvodu bych se rád poradil.
Máme komponentu CommentComponent, které předáváme pomocí
setteru CommentsService (podobné example od Honzy
Tvrdíka).
CommentsService obsahuje dotazy pro výpis komentářů.
Pak tu ještě máme SettingServices (tzv. Base), pomocí níž se
dostanete k nastavením webu, jako je například funkce:
public function isGravatarEnable()
{
return (boolean) //.... dotaz na db ,který vrátí hodnotou 1 nebo 0;
}
Problém však nastane, když potřebuji hodnotu fuknce ->settingServices->isGravatarEnable() v CommentComponent.
Napadá mě několik řešení:
- Service SettingServices bude extendovat CommentsService.
- Duplikace kodu. Tedy funkce isGravatarEnable() bude jak v SettingServices, tak i v CommentsService, případně i další service.
- Do komponenty CommentComponent předám CommentsService a i SettingServices.
- Pokud vás napadá jiná možnost, tak sem sní.
Která možnost vám osobně přijde nejlepší?
Je 1. možnost vůbec správná?
Editoval martinit (26. 10. 2012 19:50)
- MartinitCZ
- Člen | 580
Nox napsal(a):
Pokud potřebuješ dvě služby, tak předej dvě služby … tak bych hlasoval za 3
Tomu jsem se chtěl vyhnout. Já z té druhá service (SettingsService) potřebuji právě jen jednu fukci.
Nox napsal(a):
Jednička by byla správně jenom pokud by SettingsService byl speciální případ CommentsService
To není, takže je to špatně.
Díky za odpovědi :)
Editoval martinit (26. 10. 2012 19:49)
- MartinitCZ
- Člen | 580
@**Nox**: To by taky šlo, ale v tomto případě je to zrovna jen jedna funkce, ale jindy můžou být 2,3 … Takže nejspíš přesunu funkci isGravatarEnable() z SettingsService do CommentsService a v případě, že bude potřeba např. v UserComponent, která využívá UserServices, tak jí tam nakopíruji také.
Sice budu mít duplikáty kodu, ale zase nebudu mít mnoho setterů. Osobně mi to přijde jako zlatá střední cesta.
- Nox
- Člen | 378
Tak buď předáš 2–3 parametry nebo předáš 2 služby
Ale jestli to fakt chceš mít v jednom, tak tam aspoň nekopíruj ty metody, ale dej jim SettingsService jako závislost a dej tam delegování ala
<?php
public function isGravatarEnable(){ return $this->settingsService->isGravatarEnable(); }
?>