Dvě stejná rozhraní v konstruktoru – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dvě stejná rozhraní v konstruktoru – PHP – Fórum – Programujte.comDvě stejná rozhraní v konstruktoru – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Facedown0
Newbie
15. 6. 2015   #1
-
0
-

Ahoj,

mám dvě třídy, které mohou ukládat soubory (obrázky) do databáze a také na pevný disk do nějaké složky. Chci tyto třídy použít zároveň a ukládat jak do databáze, tak na pevný disk - třeba jako zálohu, to je už jedno. Přikládám hirearchii objektů:

interface Storage {
    public function store();
}

class DatabaseStorage implements Storage {
    public function store() {
        //...
    }
}

class FileStorage implements Storage {
    public function store() {
        //...
    }
}

Tak, a teď chci tyto dvě třídy použít zároveň, takže jsem si vytvořil novou třídu.

class ChainStorage implements Storage {
    private $databsaeStorage;
    private $fileStorage;

    public function __construct(Storage $databaseStorage, Storage $fileStorage) {
        $this->databaseStorage = $databaseStorage;
        $this->fileStorage = $fileStorage;
    }

    public function store() {
        $this->databaseStorage->store();
        $this->fileStorage->store();
    }
}

Nicméně, tento způsob se mi nelíbí. Omezuje mě v tom, že pokud bych chtěl přidat další "Storage", musel bych přidat parametr a to mě znechucuje.

Taktéž nechci použít žádný setter typu "setStorage" nebo jinou metodu typu "addStorage", protože by se mi "znehodnotilo" rozhraní.

V jiných programovacích jazycích bych si jednoduše vytvořit List<Storage> nebo něco v tom smyslu a to předal konstruktoru a poté to v dané metodě store projel cyklem a byl by pokoj, ale jak to udělat tady?

Dostal se někdo do stejné situace, popřípadě, jak jí řešil, či jak byste ji řešili vy?

Nahlásit jako SPAM
IP: 86.49.47.–
Řešení
Kit+15
Guru
15. 6. 2015   #2
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

#1 Facedown
Použij návrhový vzor Observer. Databázi a úložiště budeš mít jako abonenty. Data pak pošleš vydavateli, který je rozešle všem abonentům v seznamu.

Observer má v PHP i své rozhraní SplObserver, které můžeš implementovat, ale nemusíš.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Facedown0
Newbie
15. 6. 2015   #3
-
0
-

#2 Kit
Díky za radu. Nejprve jsem přemýšlel nad řešením jako Composite, Decorator nebo Iterator, ale tohle se zdá být jako nejlepší řešení. Ještě jednou díky.

Nahlásit jako SPAM
IP: 86.49.47.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

Pretizen konstruktoru — založil BigBear

Inicializace konstruktoru — založil pepa

Tridy: chyba konstruktoru — založil fnenks

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý