Programátor na HPP
Zobrazují se odpovědi 1 až 17 z 17

Funkčnost oop, co mi uniká?

  1. Skelet Hodnocení: 8 (100%) Skelet je na dobré cestě
    1
    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ř:
    PHP kód:
    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.
    Naposledy upravil Skelet : 17.12.2011 v 16:13

  2. Co se právě děje na Webtrhu?
  3. Kontras Hodnocení: 6 (100%) Kontras je na dobré cestě
    2
    Co zkusit použít interface Saveable? kde si nadefinuješ všechny metody které budou mít objekty uložitelné

  4. Skelet Hodnocení: 8 (100%) Skelet je na dobré cestě
    3
    Teď tě úplně nechpu, jak mi to zabrání volat metodu user::save() "odkudkoliv"?

  5. takatom Hodnocení: 2 (100%) takatom je na dobré cestě
    4
    protected
    pravděpodobnější však je chybný objektový návrh

  6. Skelet Hodnocení: 8 (100%) Skelet je na dobré cestě
    5
    To je dosti pravděpodobné. Jak jsem napsal výše, nelze jednoduše dědit, čili protected neni řešením.

  7. takatom Hodnocení: 2 (100%) takatom je na dobré cestě
    6
    Někde zveřejni ten objektový model včetně analýzy, pak mohou být připomínky konkrétní.

  8. Skelet Hodnocení: 8 (100%) Skelet je na dobré cestě
    7
    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.

  9. 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.

  10. Skelet Hodnocení: 8 (100%) Skelet je na dobré cestě
    9
    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...

  11. 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):

    Kód:
    class UserAddress {
        protected $user;
    
        public function __construct($user User) {
            $this->user = $user;
        }
    }
    
    class User {
        protected $address;
        
        public function address() {
            if(empty($this->address)) {
                $this->createAddress();
            }
            return $this->address;
        }
        
        protected function createAddress() {
            $this->address = new UserAddress($this);
        }
    }
    Pokud takové provázání nemá funkční význam, dělá kód zbytečně křehčí.

  12. Skelet Hodnocení: 8 (100%) Skelet je na dobré cestě
    11
    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.

  13. 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.

  14. Skelet Hodnocení: 8 (100%) Skelet je na dobré cestě
    13
    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.

  15. 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.

  16. Skelet Hodnocení: 8 (100%) Skelet je na dobré cestě
    15
    Já velice děkuji za rady. Jak jsem psal, myslím že k tomu už dospěji sám

  17. Ahoj, nevím jestli tomu dobře rozumím, ale zákazníkem bude asi i organizace, takže bych udělal ze zákazníka abstraktní třídu od které by dědily Organizace a Jedinec.
    A abstrakce Zákazník by obsahovala společné vlastnosti jako email, adresa, telefon. A jednotlivec a organizace vzájemné "reference" nebo jak to nazvat.

  18. Skelet Hodnocení: 8 (100%) Skelet je na dobré cestě
    17
    Ano, takto to lze, ale pouze v tomto příkladě.

Hostujeme u Server powered by TELE3