Come mantenere visibili i parametri della classe mentre si utilizza il passaggio di argomenti generici

1

Dopo aver scritto alcune classi in cui l'inizializzazione della classe richiede più opzioni, invece di scrivere diversi parametri in costruttori o setter, ho iniziato a passare un array associativo di parametri, che ho chiamato $options , dove, ad esempio:

$options = {'productLine' = $productLine, 'modelNumber' => $modelNumber, ... };

La mia preoccupazione è che l'utilizzo di tale struttura possa portare a conseguenze indesiderabili.

Considera il seguente codice, dove leggendo le variabili private, sai praticamente che cosa questa classe ha bisogno di operare da sola:

class Generator
{
    private $productLine;
    private $modelNumber;
    private $motorPresent; 
    //... 5 similar lines

    function __construct($options)
    {            
        $productLine = $options['productLine'];
        $modelNumber= $options['modelNumber'];
        $motorPresent= $options['motorPresent'];
        //... 5 similar lines
    }
}

Ora, considera questo codice, dove leggendo le variabili private, non sai veramente cosa gli viene passato, a parte alcuni "parametri".

class Generator
{
    private $options;

    function __construct($options)
    {
        $this->options = $options;
    }
}

Non è immediatamente chiaro quali parametri vengono passati dalla sorgente: devi conoscere la matrice $options effettiva per sapere cosa viene passato. Per sapere cosa sta succedendo devi leggere il codice, e questo richiede tempo. I test possono essere utilizzati per passare alcuni parametri di esempio, ma non dipenderei dai test come la vera risposta.

La mia domanda è:

  • c'è un modo per mantenere semplici i compiti (come nel mio secondo codice, il codice nel costruttore rimane uguale se ci sono 10 parametri o 20), e tuttavia mantenere la firma della classe immediatamente evidente?

La mia risposta attuale sarebbe scrivere codice come nel mio primo esempio, elaborando su quale variabile viene assegnato cosa, ma sento che il primo modo è inutilmente prolisso e non mi piace, perché introduce il passaggio di variabili extra, quando le variabili sono già in $ options, usa invece $ options ['var_name'] invece.

Un altro modo è usare i commenti, ma non è molto buono dato che i commenti non vengono sempre mantenuti così come il codice stesso.

    
posta Dennis 09.10.2014 - 19:11
fonte

1 risposta

0

Una possibile risposta è verificare che tutte le condizioni operative siano state impostate correttamente come:

function __construct($options)
{
    //check that everything is set properly
    if (!isset($options['productLine'])) 
        throw new \InvalidArgumentException("We need to know Product Line");
    if (!isset($options['modelNumber'])) 
        throw new \InvalidArgumentException("We need to know Model Number");
}
    
risposta data 09.10.2014 - 19:17
fonte

Leggi altre domande sui tag