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 inDONE
da 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.