progettazione di classi con obiettivi simili ma nucleo decisionale ampiamente diverso

0

Sono perplesso su come modellare questa situazione. Supponiamo che tu abbia un algoritmo che opera in un ciclo. Ad ogni ciclo, deve essere eseguita una procedura P , il cui ruolo è modificare un dato di input I in un dato di output O , tale che O = P(I) .

In realtà, ci sono diversi sapori di P , ad esempio P1 , P2 , P3 e così via. La scelta di quale P eseguire è dipendente dall'utente, ma tutti P hanno la stessa finalità, producono O da I .

Questo chiamato bene per una classe base PBase con un metodo PBase::apply , con reimplementazioni specifiche di P1::apply(I) , P2::apply(I) e P3::apply(I) . La classe P effettiva viene istanziata in un metodo factory e il ciclo rimane semplice.

Ora, ho un caso di P4 che segue lo stesso principio, ma questa volta ha bisogno di dati aggiuntivi dal ciclo (come l'iterazione corrente e il valore medio di O durante le precedenti iterazioni).

Come cambieresti per questo caso?

    
posta Stefano Borini 15.02.2011 - 13:48
fonte

3 risposte

6

Vorrei aggiungere un singolo parametro "contesto" al metodo; il contesto può contenere l'iterazione del ciclo e qualsiasi altro dato necessario e può essere esteso (aggiungendo dati aggiuntivi) senza interrompere l'API.

Le strategie a cui non interessa il contesto non la usano - ed è solo un singolo riferimento extra sulla firma, non 16 argomenti.

    
risposta data 15.02.2011 - 14:41
fonte
1

Vorrei semplicemente aggiungere un'iterazione vuotaBegin (CurrentO, Index) a PBase, quindi eseguire l'override in P4. Il ragionamento principale (assumendo uno scenario un po 'più complesso del tuo caso di esempio) sarebbe quello di evitare che il disordine si applichi con argomenti non necessari e di evitare di cambiare le sottoclassi di PBase esistenti.

Se in seguito hai bisogno di qualcosa di più della sola O e dell'Indice, utilizzando lo stesso approccio con metodi come setAverageO, setLoopIndex ti permetterà di raccogliere solo ciò che è necessario in sottoclassi di PBase specifiche.

    
risposta data 15.02.2011 - 14:04
fonte
1

C'è qualche ragione per cui passare l'iterazione corrente a P1 , P2 e P3 sembrerebbe 'sbagliato'? Se questi parametri sarebbero rilevanti , ma semplicemente non sono necessari, li passerei semplicemente, in modo che altre implementazioni possano utilizzarli.

Se l'iterazione corrente è qualcosa che non è affatto correlato a P1 , P2 e P3 ma solo a P4 , dovresti probabilmente usare un design diverso, dove il ciclo è a conoscenza di diverse P. P che non necessitano di consapevolezza iterativa e P che ne hanno bisogno.

Immagino che il primo progetto che semplicemente passa i parametri di iterazione sia OK.

AGGIORNAMENTO relativo al commento:

Se hai bisogno di parametri che non sono specifici per l'iterazione e può essere interamente definito all'interno di un tipo specifico (o sottotipo astratto) di P , assicurati di farlo.

    
risposta data 15.02.2011 - 13:58
fonte

Leggi altre domande sui tag