Zadejte hledaný výraz...

Funkčnost oop, co mi uniká?

Skelet
verified
rating uzivatele
(9 hodnocení)
17. 12. 2011 15:48:33
Ahoj,
vyvýjim model a narazil jsem.
Mám třídy:
  • Base
  • User
  • UserAdress
  • Customer
  • Company
Potřebuju přistupovat pouze k třídám Company a Customer s tím že v případě ukládání dat budou volat ukládání UserAdress, ta bude volat ukládání User. Třídy kopírují tabulky a ty jsou propejené vzdáleným klíčem.
První možnost která mě napadla, respektive jsem ji začal programovat bylo podědění
User extends Base
UserAdress extends Base
Customer extends UserAdress
Company extends UserAdress
V metodě save se vždy volalo parent::save() s tím že save vracela PK aktuálního záznamu. Vše bylo v pořádku než jsem zjistil že potřebuju dědit od dvou předků (Jiný druh tabulek).
Začal jsem tedy přemýšlet a došel k druhé verzi, kde každá třída dědí od Base (V base jsou pouze základní funkce) a v metodě save volají "předky"
např:
class Company extends Base{
public function save($data){
//Zavolá UserAdress(), na ní metodu save()
$this->context->models->userAdress->save($data);
}
}
UserAdress zase zavolá User a další které potřebuje (V případě více PK)
Jak ale zamezit volání User, UserAdress... odjinud než z finálních Customer, Company? Pokud by se volali odjinud, mohlo by dojít k uložení neúplných data. V třídách Customer Company mám transakce, který sdružují všechny "poddotazy".
Napadlo mě vytvořit interface IFullUser pro customer,company a v metodě save si je vyžádat, to mi ale nezajistí odkud se metoda volá, pouze mě přinutí tento parametr předat i přesto že jej nepotřebuji.
17. 12. 2011 15:48:33
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708255
Co zkusit použít interface Saveable? kde si nadefinuješ všechny metody které budou mít objekty uložitelné
17. 12. 2011 16:18:58
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708254
Skelet
verified
rating uzivatele
(9 hodnocení)
17. 12. 2011 16:37:02
Teď tě úplně nechpu, jak mi to zabrání volat metodu user::save() "odkudkoliv"?
17. 12. 2011 16:37:02
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708253
takatom
verified
rating uzivatele
(2 hodnocení)
17. 12. 2011 18:46:40
protected
pravděpodobnější však je chybný objektový návrh
17. 12. 2011 18:46:40
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708252
Skelet
verified
rating uzivatele
(9 hodnocení)
17. 12. 2011 18:58:06
To je dosti pravděpodobné. Jak jsem napsal výše, nelze jednoduše dědit, čili protected neni řešením.
17. 12. 2011 18:58:06
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708251
takatom
verified
rating uzivatele
(2 hodnocení)
18. 12. 2011 16:18:01
Někde zveřejni ten objektový model včetně analýzy, pak mohou být připomínky konkrétní.
18. 12. 2011 16:18:01
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708250
Skelet
verified
rating uzivatele
(9 hodnocení)
19. 12. 2011 07:37:49
Myslím že jsem to popsal dost, aby to bylo konkrétní. Potřebuju veřejně přistupovat k službám objektů Company a Customer, ty budou přistupovat k ostatním třídám (User,
UserAdress). Nelze podědit více předků, takže dědím od Base.
19. 12. 2011 07:37:49
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708249
zaruba
verified
rating uzivatele
19. 12. 2011 21:09:09
Ten návrh je takový dost podivný. Obecně dědí jedna třída proto, aby jsi snížil abstrakci, rozuměj třída která dědí je konkrétnější. Třeba zvíře a od ní dědí pes a od psa třeba ovčák.
Takže Customer by vůbec neměl dědit od UserAddress, protože je to něco uplně jiného.
Správně by jsi tedy měl mít třídu UserAddress a ve třídě Customer by jsi měl proměnnou userAddress, která by odkazovala na objekt UserAddress. Potom při ukládání Customer zavoláš userAddress->save() a následně uložíš i Customer. Tím vyřešíš, že každý zákazník bude mít adresu (můžeš kontrolovat jestli došlo k zápisu a v případě chyby nezapisovat ani zákazníka. A pokud by někdo jiný volal ukládání samotné třídy UserAddress tak ti to nemusí vadit, jelikož se uloží do db a nebude přiřazena žádnému uživateli, což by problém být neměl.
19. 12. 2011 21:09:09
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708248
Skelet
verified
rating uzivatele
(9 hodnocení)
20. 12. 2011 09:18:40
Děkuji za odpověď. To co jsi popsal vlastně mám napsaný, proto nemůžu (nechci) dědit. Jen se mi nelíbí to veřejné přistupování k useradress, nevznikne sice závažná chyba, ale je takové divné ukládat částečná data. S tím že tento návrh nebude využit pouze pro uživatele...
20. 12. 2011 09:18:40
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708247
Může uživatelská adresa existovat nezávisle na uživateli? Pokud ne, zahrňte ji přímo do třídy User.
Pokud nemají vztah 1:1 a chcete z ní mít opravdu vlastní třídu, můžete ji navázat na User takto (naznačeno):
Pokud takové provázání nemá funkční význam, dělá kód zbytečně křehčí.
20. 12. 2011 13:17:26
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708246
Skelet
verified
rating uzivatele
(9 hodnocení)
20. 12. 2011 15:20:08
Může uživatelská adresa existovat nezávisle na uživateli? Nemůže, ale naopak může existovat uživatel bez adresy.
Myslím že jsem hledal tohle: http://sourcemaking.com/design_patterns/builder
Teď si k tou pouze najdu příklady.
Děkuji všem, kteří se snažili pomoci.
20. 12. 2011 15:20:08
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708245
Když může existovat uživatel bez adresy, použijte jako prázdnou adresu Null Pattern - třídu, která splňuje polymorfismus, ale vrací na všechno NULL.
20. 12. 2011 15:25:26
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708244
Skelet
verified
rating uzivatele
(9 hodnocení)
20. 12. 2011 18:09:47
To neni úplně ono. Potřebuju si poskládat třídy z různých částí. Části budou samostatně pracovat s db. Jinak bych mohl jednoduše dědit.
20. 12. 2011 18:09:47
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708243
Znovu jsem si přečetl váš první příspěvek. Nerozumím, jaký máte vlastně problém.
Snažil jsem se vám pomoct s částečnou otázkou, kterou jsem vyčetl z pozdějšího příspěvku.
Pokud potřebujete poradit, formulujte svůj dotaz lépe, nebo s někým zajděte na pivo.
20. 12. 2011 18:46:09
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708242
Skelet
verified
rating uzivatele
(9 hodnocení)
21. 12. 2011 08:55:01
Já velice děkuji za rady. Jak jsem psal, myslím že k tomu už dospěji sám
21. 12. 2011 08:55:01
https://webtrh.cz/diskuse/funkcnost-oop-co-mi-unika#reply708241
Pro odpověď se přihlašte.
Přihlásit