Sto lavorando a un edificio che sto chiamando un Process Wizard Builder in PHP. Sono interessato a utilizzare modelli di design stabiliti, laddove applicabile, ma la mia esperienza nell'architettura di un sistema come questo che utilizza schemi di progettazione è limitata.
Ecco il succo del sistema:
Ci sono molti diversi wizard di processo che devono essere costruiti (10+). Un processo guidato è definito come una serie di passaggi necessari per creare o aggiornare un'entità nel sistema. Il numero di passaggi per un processo guidato può variare. L'ordine di passaggio deve essere modificabile. I passaggi possono essere riutilizzati attraverso procedure guidate di processo. Le funzionalità di passaggio devono poter essere sovrascritte per procedura guidata. Ogni passaggio ha un obiettivo specifico: raccolta di informazioni, caricamento di documenti, creazione di fatture, ecc. . Ogni passaggio può anche avere chiamate AJAX per recuperare dati aggiuntivi e ogni chiamata AJAX potrebbe dover gestire le risposte in modo diverso per ogni procedura guidata.
In inglese semplice il flusso generale sarebbe sempre:
- Scegli e avvia una procedura guidata del processo
- Lavora attraverso i passaggi interattivi definiti per quella procedura guidata.
- Fornisci infine nuovi compiti / dati per gli utenti.
Ecco alcuni pseudo-codice di ciò che intendo per design flessibile:
class ProcessA
{
Runs Step1, Step3, Step4;
$step_order = [1, 3, 4]; // Order can be anything
}
class ProcessB
{
Runs Step1, Step2, Step3, Step5;
$step_order = [1, 3, 2, 5]; // Order can be anything
// Override one of the steps;
function Step2()
{
// Different step2 code.
}
}
Al momento sto facendo questo senza alcun modello di costituzione. Sto usando una classe genitore astratta, tratti, chiamate di metodi dinamici cancellate dai nomi dei passaggi e una matrice di ordine dei passi. Funziona, ma non posso fare a meno di pensare che potrebbe esserci un approccio migliore o più atteso. Mi chiedo se ci sia una combinazione di modelli di design che potrebbe essere una scelta migliore per qualcosa di simile.
Credo che la risposta potrebbe essere una combinazione di Builder, Factory e Decorator. La mia esperienza nell'implementazione di modelli di progettazione è limitata, quindi i pensieri di chi ha più esperienza sarebbe fantastico.
Ulteriori informazioni fornite in risposta a un commento: Dove il mio approccio si sente debole è quando si cerca di "arrotolare" i dati in un unico posto. Ad esempio, ogni fase ha il proprio set di funzioni javascript e chiamate ajax. Queste funzioni dovrebbero vivere nel proprio file .js. Comunque, come meglio posso dire quando uso un tratto, non puoi fare qualcosa come aggiungere dati a una proprietà di classe per ogni tratto. Ad esempio Step1Trait vuole aggiungere Step1.js ad un array, Step2Trait vuole aggiungere Step2.js, ecc. ma questo non è possibile. Il lavoro che potrei fare è di avere un metodo sulla classe astratta che recuperi tutte le proprietà che seguono una convenzione di denominazione e le aggregano in una matrice. Tuttavia, questa funzionalità sembra più vicina a ciò che farebbe un Pattern Decorator.
Un altro luogo in cui il mio approccio non funziona sta nel personalizzare il codice javascript di ogni passaggio in base al particolare processo che sto utilizzando. Alcuni processi potrebbero richiedere ulteriori convalide o ulteriori chiamate ajax oltre a quanto potrebbe essere il valore predefinito di una fase. Il mio attuale pensiero per risolvere questo è usare un caller di funzioni personalizzate in javascript che sia a conoscenza di un modello di denominazione, simile a quello che ho fatto nel codice PHP. Ancora una volta, questo sembra qualcosa che un pattern Decorator potrebbe gestire in modo più elegante.