Sto usando Python e ORM, in particolare SQLAlchmey. Ho un modello ORM che implementa il pattern del data mapping.
Il modello ha un campo state , che può assumere uno dei diversi stati, diciamo NEW , CANCELLED , DONE .
Ho una serie di azioni da eseguire su un modello. L'obiettivo delle azioni è spostare il modello dal suo stato attuale a
uno stato obiettivo. Esempi di azioni sono: cancel , complete .
cancel sposta il modello in stato CANCELLED .
complete sposta il modello in stato DONE .
Queste azioni possono essere eseguite da più moduli del sistema.
Potrei semplicemente assegnare un nuovo stato come model.state = CANCELLED , ma per ogni azione ci sono prerequisiti specifici.
Per esempio. non è possibile spostare il modello nello stato CANCELLED se il suo stato corrente è DONE .
Per esempio. non puoi spostare il modello nello stato DONE prima di una data specifica.
Oltre a questo, ci sono post-azioni da eseguire dopo cambiamenti di stato, cioè se il modello si sposta dallo stato DONE ,
pochi altri campi del modello da aggiornare.
Voglio scegliere un modello di progettazione che meglio si adatta alle mie esigenze. Ho preso in considerazione le seguenti opzioni:
-
Applicare questa funzionalità a livello di modello, ad esempio nelle funzioni di setter. Ad esempio, quando lo stato viene modificato in
CANCELLED, verifica che lo stato corrente non siaDONE. Perché questo non funziona: c'è un livello di applicazione, che può cambiare stato inDONEda qualsiasi stato, o che non richiede la notifica di invio come comportamento predefinito. -
Aggiungi funzioni specifiche al modello. Ad esempio metodo cancel (). Perché questo non funziona: aggiungerli al modello renderebbe il modello troppo pesante. Inoltre, questa logica è soggetta a cambiare frequentemente, mentre la rappresentazione dei dati non lo è, quindi mi piacerebbe mantenere il codice che cambia frequentemente separata.
Sto considerando il modello Proxy. È una buona scelta o ci sono alternative migliori.