OO Pattern per rendere disponibili al client più versioni della logica di dominio

1

Sto scrivendo un'applicazione PHP in cui un blocco / modulo di logica di dominio è soggetto a cambiamenti frequenti e significativi nel tempo.

La complicazione è che l'applicazione deve essere in grado di utilizzare non solo l'ultima versione del modulo, ma qualsiasi versione che ha precedentemente utilizzato, in modo che possa riprodurre i risultati dei dati che quella versione avrebbe apportato.

Vorrei usare una facciata e / o adattatori o simili in modo che il codice principale dell'applicazione possa passare tra le diverse versioni del modulo che usa senza troppi problemi.

Come per il modulo, stavo progettando di utilizzare il namespacing per ogni revisione principale (in cui la logica del dominio produce risultati diversi); duplicazione di tutte le classi in quel modulo logico di dominio. Cioè copia e incolla efficacemente l'intera cosa, incluse le classi all'interno del modulo che non sono state modificate.

Questo è un odore pungente del codice e non riesco a pensare a come aggirarlo, per non parlare di un modo semplice, dato che il modulo potrebbe anche subire una ristrutturazione completa.

Qualche idea?

    
posta CL22 01.10.2015 - 14:01
fonte

3 risposte

2

Sembra che tu abbia bisogno del modello di strategia . Fondamentalmente, definisci un'interfaccia che possa essere utilizzata da tutte le istanze della tua logica aziendale, quindi richiama l'istanza appropriata (strategia) della logica. Determinazione di ciò che costituisce l'istanza "corretta" dipende da te, di solito è un attributo nell'intestazione della richiesta, ma potrebbe essere contestuale.

    
risposta data 01.10.2015 - 18:54
fonte
0

Conserva un'API esterna nel tempo. Anche se è scadente, rendilo coerente. Quindi, crea uno stabilimento che accetta una data (o numero di versione) e restituisce l'implementazione appropriata, con la stessa API coerente.

    
risposta data 01.10.2015 - 14:04
fonte
0

Mi chiedo perché vorresti farlo. Se il tuo requisito è quello di visualizzare il risultato della tua precedente logica di dominio, potresti preferire semplicemente archiviare l'output in forma immutabile e visualizzarlo.

Ad esempio, supponiamo che tu stia costruendo un sistema che calcola i prezzi per gli ordini e questi calcoli sono soggetti alle normative governative e, quindi, potrebbero cambiare nel tempo. È molto più semplice archiviare gli ordini precedenti come PDF, ad esempio, piuttosto che ricalcolare i risultati ogni volta. (In effetti, da alcuni punti di vista legale questo potrebbe anche essere un requisito)

Se hai riflettuto a lungo sulla tua implementazione e scopri che hai bisogno di rieseguire la logica, isolala in una libreria separata. Annota i tuoi dati in modo da sapere a quale libreria eseguirli. Crea una facciata in cui è possibile passare i dati e passa da una versione all'altra della libreria. Usando il controllo della versione basta taggare la versione della libreria, creare la libreria, distribuire e andare avanti. Non sarà mai necessario tornare indietro e modificare una versione precedente di una libreria perché è sempre necessario mantenere la vecchia logica. È sufficiente codificare le modifiche sul codice così com'è e utilizzare il controllo del codice sorgente per consultare le versioni precedenti in caso di necessità.

    
risposta data 01.10.2015 - 14:07
fonte

Leggi altre domande sui tag