Scelta di un modello per la logica del dominio sopra il modello ORM

1

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:

  1. 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 sia DONE . Perché questo non funziona: c'è un livello di applicazione, che può cambiare stato in DONE da qualsiasi stato, o che non richiede la notifica di invio come comportamento predefinito.

  2. 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.

    
posta schatten 12.11.2014 - 10:16
fonte

0 risposte

Leggi altre domande sui tag