Metodo di fabbrica astratto e polimorfismo

6

Essendo un programmatore PHP negli ultimi due anni, sto appena iniziando a entrare in stili di programmazione avanzati e usando schemi polimorfici. Stavo guardando un video sul polimorfismo l'altro giorno, e il tizio che ha tenuto la conferenza ha detto che, se possibile, dovresti sbarazzarti delle dichiarazioni di if nel tuo codice, e che un interruttore è quasi sempre un segno che il polimorfismo è necessario . A questo punto sono stato molto ispirato e sono partito subito per provare questi nuovi concetti, così ho deciso di creare un piccolo modulo di memorizzazione nella cache usando un metodo di fabbrica. Ovviamente la prima cosa che devo fare è creare un interruttore per decidere quale codifica del file scegliere. DANG!

class Main {
    public static function methodA($parameter='')
    {
        switch ($parameter)
        {
            case 'a':
                $object = new \name\space\object1();
                break;

            case 'b':
                $object = new \name\space\object2();
                break;

            case 'c':
                $object = new \name\space\object3();
                break;

            default:
                $object = new \name\space\object1();
        }

        return (sekretInterface $object);
    }
}

A questo punto non sono veramente sicuro di cosa fare. Per quanto posso dire, devo usare uno schema diverso e avere metodi separati per ogni istanza di oggetto, o accettare che sia necessario un interruttore per "passare" tra di loro. Cosa ne pensate?

    
posta Scotty C. 29.11.2012 - 17:25
fonte

1 risposta

1

switch e if sono generalmente richiesti per le primitive (che $parameter è), sebbene PHP ti permetta di creare nomi di classi e metodi di chiamata da variabili, così puoi farla franca con un po 'di magia.

Ad esempio puoi fare questo:

public static function methodA($parameter = '') {
   $class = '\name\space\object' . $parameter;
   return new $class;
}

Questo ovviamente richiede che $parameter e i nomi di classe esistenti siano tutti denominati in modo appropriato, e non tiene conto del caso predefinito.

L'altra alternativa richiede che $parameter sia un oggetto. È possibile rimuovere l'interruttore, ma non riduce la verbosità (anche se è polimorfico). Un modo possibile:

public static function methodA(EncodingType $parameter = null) {
   return new $parameter->getObject();
}

... che restituirebbe la stringa dell'oggetto richiesta.

Devo notare che il principio di evitare condizionali nella contemplazione dell'uso del polimorfismo è grande, soprattutto in teoria - ma se provi a eliminare tutti i condizionali nel tuo codice puoi ucciderti a metà e finire a scrivere codice inutilmente complicato. Potrebbe anche essere un segnale per ripensare il tuo design.

Dirò che un punto comune in cui trovi i condizionali è nei metodi di fabbrica, che è quello che sembra il tuo esempio.

    
risposta data 30.11.2012 - 00:59
fonte

Leggi altre domande sui tag