OOP - kam `spravne` dávať konštanty? rubrika: Programování: PHP

4 dark.apostata
položil/-a 6.12. 16:00

Mam triedy (FtpTransport, LocalDirectoryTransport, HttpFileTransport,..) v ktorych potrebujem pouzivat nejake spolocne konstanty.
Tieto triedy budu vzdy implementovat Transportable interface a rozsirovat TransportAbstract triedu takze mam minimalne 3 miesta kam ich mozem dat:

  1. do interface
interface Transportable()
{
    const FILE_DELETE = 1;
    const FILE_RENAME = 2;
 
    public function fetch($action);
}
 
class XYZTransport implements Transportable extends TransportAbstract
{
    public function fetch($action)
    {
        if ($action == Transportable::FILE_DELETE) {
            echo 'delete file';
        }
    }
}
  1. do abstract classy
abstract class TransportAbstract
{
    const FILE_DELETE = 1;
    const FILE_RENAME = 2;
}
 
class XYZTransport implements Transportable extends TransportAbstract
{
    public function fetch($action)
    {
        if ($action == self::FILE_DELETE) {
            echo 'delete file';
        }
    }
}
  1. do uplne samostatnej classy ktora bude obsahovat len konstanty
class FileAction
{
    const FILE_DELETE = 1;
    const FILE_RENAME = 2;
}
 
class XYZTransport implements Transportable extends TransportAbstract
{
    public function fetch($action)
    {
        if ($action == FileAction::FILE_DELETE) {
            echo 'delete file';
        }
    }
}

Jazyk je PHP ale to je snad jedno, ide o princip.

Edit:
Aby vas nemylili konkretnosti lepsi bude takyto vseobecny priklad:
https://pastebin.com/mtD6QDbH

Komentáře

  • Ivan Jaros : vzdy do interfejsu. 12.12. 17:19
odkaz
9 arron
odpověděl/-a 7.12. 9:50

Ahoj,

jak tady tak trochu zaznívá, ono to celé smrdí tím, že to nemáš úplně optimálně navržené...mě by třeba nikdy nenapadlo, že metoda fetch by měla dělat taky ještě něco jiného, než fetch, takže kdyby mi něco smazala (třeba protože nějaký její parametr má nějaký default), tak bych měl chuť autora pověsit do průvanu.

Podle mě Ti tam chybí ještě jedna vrstva (kde se bude volat ->fetch a pak ->delete nebo ->fetch a pak ->rename a ty konstanty patří až do téhle vrstvy) anebo je potřeba se zamyslet nad tím, jestli je to všechno správně pojmenované.

Pro zobrazení všech 10 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.