( Nota : non sono sicuro di come inquadrare correttamente la domanda, quindi sentiti libero di modificarlo o commentare come posso migliorarlo.)
Credo che questa domanda, pur coprendo un ambito abbastanza ampio, sia piuttosto limitata ai linguaggi tipizzati staticamente (orientati agli oggetti) (sto usando Java in particolare) per l'implementazione di CQRS e Event Sourcing. Ho progettato eventi relativi a un particolare aggregato come una gerarchia, in quanto sono sottoclassi di una classe genitore. Supponiamo che io abbia un Order
aggregato e che abbia una% base di classe% co_de i cui sottotipi siano eventi specifici come OrderEvent
, OrderPlaced
, QuantityUpdated
, ecc.
Ora, all'interno di questo aggregato OrderCancelled
, ho sovraccaricato i metodi Order
che prendono sottotipi specifici di apply
, come OrderEvent
e apply(OrderCancelled)
. Tuttavia, quando ricostituisce un oggetto apply(QuantityUpdated)
dall'origine evento, quello che ho è un elenco di oggetti la cui interfaccia dichiarata è solo Order
. Sebbene tecnicamente, il sistema sottostante tenga traccia del sottotipo specifico di ciascuno di questi oggetti, non c'è modo nel codice di implicare che io abbia fornito i metodi di OrderEvent
per ogni tipo in particolare. Devo definire un metodo che prende la classe genitore apply
: OrderEvent
.
Esistono schemi esistenti attorno a questo di cui non sono a conoscenza? O è qualcosa come il seguente l'unica opzione (scritta in Java):
void apply(OrderEvent event) {
if (event instanceof OrderPlaced) {
apply((OrderPlaced) event);
}
if (event instanceof QuantityUpdated) {
apply((QuantityUpdated) event);
}
if (event instanceof OrderCancelled) {
apply((OrderCancelled) event);
}
}
Ho preso in considerazione la definizione di un metodo apply(OrderEvent)
nella classe / interfaccia gen di applyTo
che accetta un oggetto OrderEvent
a cui viene applicato il particolare oggetto Order
. Ad esempio:
class OrderPlaced extends OrderEvent {
void applyTo(Order order) {
order.apply(this);
}
}
Questo mi permetterà di definire OrderEvent
in apply(OrderEvent)
class come:
void apply(OrderEvent event) {
event.applyTo(this);
}
Ne risulta un codice più conciso, ma non sono così sicuro della natura quasi circolare dell'approccio.
Qual è lo schema comune utilizzato per questo?