utilizzando la presenza di un valore per controllare il flusso?

3

Ho la seguente situazione. Ho un metodo factory che restituisce una matrice. Questa matrice può essere calcolata su due livelli di precisione: livello1 e livello2. Per calcolare la matrice, ho bisogno di passare un po 'di informazioni al metodo factory, e questa informazione è ben confezionata in un altro oggetto Info. Le informazioni vengono passate al metodo factory e la matrice viene restituita.

Le informazioni contengono dettagli necessari per entrambi i livelli di accuratezza. un insieme di questi dettagli sono usati solo dal livello1. Se è necessario il livello 2, le informazioni devono contenere dati aggiuntivi che vengono utilizzati per valutare l'accuratezza del livello 2.

Ho due strategie per eseguire la decisione:

  1. Ho passato l'oggetto Info al metodo factory. Se trova le informazioni per level2, calcola la precisione di livello 2. Se trova solo informazioni per level1, calcola level1.
  2. si passa al metodo factory sia i dati info che il livello di accuratezza richiesto, quindi si utilizzano solo i contenuti info utili per il livello appropriato. Potrebbe esserci un caso in cui è richiesto level2, ma Info non contiene alcuna informazione di livello2. In tal caso il programma genererà un'eccezione.

Quale opzione considereresti migliore?

    
posta Stefano Borini 06.06.2011 - 17:33
fonte

4 risposte

3

Vorrei andare con la seconda opzione. Penso che dipenda dalla funzione di chiamata decidere quale livello vuole e anche se quel livello è appropriato (è responsabilità del chiamante assicurarsi che se richiede level2, la richiesta possa essere soddisfatta con l'oggetto Info che fornisce).

Qualche pseudo-codice di come lo scriverei:

if /*there's enough data in Info for level2*/ then
    matrix := MatrixFactory(Info, level2);
else
    raise NotEnoughInfoForLevel2Exception;
    /*
    of maybe you could do 
    matrix := MatrixFactory(Info, level1)
    or something else to handle this problem
    */
end
    
risposta data 06.06.2011 - 17:38
fonte
2

Sicuramente # 2, perché espone il comportamento al chiamante piuttosto che nascondere dettagli importanti.

    
risposta data 06.06.2011 - 17:39
fonte
1

Penso che la seconda opzione sia più votata a una soluzione orientata agli oggetti come la tua (è necessaria molta meno elaborazione) e le eccezioni dovrebbero aumentare quando ti aspettavi qualcosa che non hai ricevuto.

Inoltre, se vedi questo tipo di situazione (livello1, leva2, livelloX) un modello di strategia potrebbe anche aiutarti a migliorare il tuo codice.

    
risposta data 06.06.2011 - 17:39
fonte
0

Dipende se i due tipi di matrice sono completamente compatibili all'esterno o meno. Se lo sono, l'omissione del parametro aggiuntivo potrebbe essere giustificata, ma se non sono intercambiabili a tutti gli effetti, andrei con l'opzione 2.

    
risposta data 06.06.2011 - 17:58
fonte

Leggi altre domande sui tag