Istanzia la classe corretta in base a qualche input

6

Sto tentando di capire in che modo " cambia come odore di codice " quando il percorso del codice corretto è determinato da alcuni dati osservabili.

Il mio oggetto Webapp imposta un oggetto "host" interno in base al nome host della richiesta corrente. Ogni sottoclasse di Host corrisponde a un possibile hostname e configurazione dell'applicazione: WwwHost, ApiHost, ecc. Qual è un modo OOP per una sottoclasse host di accettare la responsabilità di uno specifico nome host e per Webapp ottenere un'istanza della sottoclasse appropriata?

Attualmente, il controllo hostname e l'istanza Host sono presenti nell'oggetto Webapp. Potrei spostare il test in un metodo statico all'interno delle sottoclassi di Host, ma avrei comunque bisogno di elencare esplicitamente tali sottoclassi in Webapp, a meno che non mi ristrutturassi ulteriormente. Sembra che qualsiasi soluzione richieda l'aggiunta di nuove sottoclassi a qualche elenco centralizzato.

    
posta Annika Backstrom 22.06.2012 - 15:24
fonte

3 risposte

4

Per l'esempio che descrivi, non penso che tu stia sperimentando un odore di codice.

Typically, similar switch statements are scattered throughout a program. If you add or 
remove a clause in one switch, you often have to find and repair the others too. 

Gli switch non sono intrinsecamente cattivi, il che è persino menzionato nell'articolo che hai collegato. La duplicazione delle istruzioni switch è sbagliata. Idem con if / else-if blocks. Viola i principi di DRY.

Se hai un singolo punto in cui l'istruzione switch richiama l'istanza corretta, allora sembra che il tuo codice sia OK. Dai un'occhiata al Pattern di fabbrica per ulteriori informazioni sul tuo caso.

    
risposta data 22.06.2012 - 16:18
fonte
2

Per mantenere un "codice ben scritto" dovresti pensare all'applicazione del modello di fabbrica.

The factory method pattern is an object-oriented design pattern to implement the concept of factories. Like other creational patterns, it deals with the problem of creating objects (products) without specifying the exact class of object that will be created. The essence of the Factory method Pattern is to "Define an interface for creating an object, but let the classes that implement the interface decide which class to instantiate. The Factory method lets a class defer instantiation to subclasses

WikiPedia

Ecco un'implementazione in PHP

    
risposta data 22.06.2012 - 16:27
fonte
0

Devi semplicemente creare istanze della sottoclasse desiderata di Host:

class Host
{
    private $name;
    private $type; //the name of the specific host type

    private function __construct($name, $type)
    {
        $this->name = $name;
        $this->type = $type;
    }

    public static function getInstance($name)
    {
        return new self($name, get_called_class());
    }
}

class wwwHost extends Host
{ 
    //code specific to the wwwHost class 
}

class apiHost extends Host
{ 
    //code specific to the apiHost class
}

$myWwwHost = wwwHost::getInstance('aWwwHostName');
$myapiHost = apiHost::getInstance('anApiHostName');
    
risposta data 26.06.2012 - 23:58
fonte

Leggi altre domande sui tag