Come faccio a decidere se creare un tipo di dati di input / output come array o classe?

2

Ho qualche input che invio a una libreria computazionale, che elabora l'input e produce un output.

Domanda : quali considerazioni prendo in considerazione per aiutarmi a decidere se il tipo di dati di output debba essere un array o un oggetto? Allo stesso modo lo stesso può valere per un oggetto Input che viene inserito nella libreria.

Matrice di esempio:

    $t = array();
    $t['number_of_shells'] = 3;
    $t['shell_length'] = 2.51;
    $t['pipe_model'] = 2.38;

Classe di esempio

    $t = OutputObject();
    $t->setNumberOfShells(3);
    $t->setShellLength(2.51);
    $t->setPipeModel(2.38);

Dove verrà utilizzato

Nel mio caso immediato, questa struttura verrà utilizzata per accumulare alcuni dati da varie fonti (libreria computazionale, database, input pass-through) e quindi passati al livello View , dove verrà inserito in placehodlers del modello di visualizzazione.

Più in generale

Da dove lo vedo, gli array sono più facili da creare, più facili da mantenere, poiché nel mio caso tutto ciò di cui ho bisogno è fondamentalmente valori. Gli oggetti sono più robusti in quanto codificano i valori disponibili in proprietà e c'è meno possibilità di fare errori di battitura. Ma aggiungono anche un sovraccarico.

Userò la struttura dati come un tipo di ritorno della libreria computazionale, e successivamente la userò per i dati da alimentare al mio livello View o alla mia suite Unit Test.

    
posta Dennis 03.03.2016 - 17:24
fonte

2 risposte

2

Dalla mia vecchia esperienza con PHP, un buon design è tale che, anche se PHP ti permette di farlo, non devi annotare nulla con l'annotazione @var per ottenere il completamento del codice su una variabile o lo fai non è necessario aprire una definizione di un metodo per scoprire quali indici sono accessibili.

Please note, the following suggestions are standards we hold where I work and are not generally applied.

Restituisce una matrice solo se si restituisce il tipo di dati scalari

Se un servizio (una classe) restituisce un array di elementi che viene numerato con il numero per default (0, 1, ... n) o indicizzato da id passati ad esso e restituisce solo un tipo di dati, è di solito non è necessario restituire un oggetto, perché sai molto bene cosa ci sarà nell'array.

I tipi di dati scalari come stringhe, doppi (float), ints e l'array non devono essere nidificati.

Se vuoi restituire strutture più complesse come gli array associativi con indici personalizzati, gli oggetti sono la strada da percorrere.

Molti IDE moderni ti consentiranno di eseguire iterazioni su una raccolta di classi personalizzate e se un metodo (che popola la variabile su cui vuoi scorrere) deve essere annotato con @return CustomClass[] ti suggerirà metodi per il soggetto singolo in un'unica iterazione ciclo, metodi membro, che CustomClass offre.

Se devi andare fino al ritorno di matrici multidimensionali di oggetti, puoi (e se non vuoi anteporre nulla all'annotazione @var che devi praticamente) implementare l'interfaccia Iterator . Facendo così anche quando si annidano più foreach es, si dovrebbe comunque avere il codice di completamento disponibile.

    
risposta data 03.03.2016 - 18:56
fonte
1

In un linguaggio non tipizzato come PHP, le matrici e le classi associative si comportano in modo molto simile per quanto riguarda la memorizzazione dei dati. Tuttavia, c'è una grande differenza.

Le matrici richiedono stringhe o numeri interi per fare riferimento ai "campi", mentre le classi hanno membri di dati effettivi.

Se si digita in modo errato un tasto dell'array, esso non recupera in modo silenzioso nulla o memorizza i dati in una posizione che non farà riferimento ad altro codice. Se si configura un membro dati o il nome di una funzione, viene visualizzato un errore.

Utilizzare una classe per questo è molto più sicuro.

    
risposta data 03.03.2016 - 17:29
fonte

Leggi altre domande sui tag