Un buon modo per rappresentare un oggetto con più stati interconnessi?

2

Voglio programmare un'applicazione di bilancio semplice. Nella mia domanda, il budget è diviso in periodi di budget (mesi per impostazione predefinita, ma può essere periodi bisettimanali o settimanali). In ogni periodo c'è un elenco di categorie di spesa.

L'utente può eseguire azioni diverse su una categoria, ad esempio registrare una spesa, allocare budget, creare una nuova categoria, chiudere una categoria esistente, ecc. Quindi ogni categoria dovrebbe avere uno stato diverso per ciascun periodo, ma le modifiche per lo stato particolare di un periodo specifico dovrebbe influenzare lo stato di categoria del periodo consecutivo (qualsiasi variazione di spesa / budget in gennaio dovrebbe cambiare lo stato di una categoria in febbraio). Quindi ogni periodo dovrebbe avere uno stato specifico di categoria che gli appartiene e su cui può operare, ma la categoria stessa dovrebbe essere in grado di vedere le modifiche apportate ed eseguire cambiamenti in altri stati.

Inizialmente pensavo di implementare una categoria come elenco dei suoi stati, ma il mio istinto mi diceva che non è un buon progetto. Mi piacerebbe davvero sentire se ci fosse un design migliore che potremmo usare qui.

    
posta Yegor Yegorov 23.11.2018 - 13:16
fonte

2 risposte

2

Da un punto di vista di alto livello, sembra che tu stia cercando il modello di osservatore. Puoi trasformare i tuoi Stati in observables e le tue categorie in observers (assumendo che tu abbia astrazioni per i tuoi Stati e Categorie). In questo modo, ogni volta che crei una nuova categoria, puoi farlo osservare gli stati già esistenti, in modo che quando si aggiornano, possono avvisare anche i loro osservatori di farlo.

    
risposta data 23.11.2018 - 16:39
fonte
1

Secondo la tua descrizione:

  • Budget è scomposto in Period che ha diversi Category
  • L'esperienza utente è Category centric e lo stesso Category è utilizzato su più Period .

Ciò significa che esiste un'associazione molti a molti tra Period e Category . In un RDBMS, generalmente lo mapperai con una tabella di associazione . È possibile aggiungere proprietà aggiuntive a tale associazione utilizzando un classe di associazione . Nel mapping RDBMS, queste proprietà sarebbero quindi colonne aggiuntive della tabella di associazione.

E questo è esattamente quello che vuoi: avere un'associazione tra Period e Category e una classe di associazione (chiamiamola CategoryPeriod ) che rappresenta lo stato che corrisponde al verificarsi di tale associazione (ad esempio Category "Affitto" per Period 2018-11 ha budget_amount di $ 500). Lo stato di CategoryPeriod è lo stato che stai cercando.

Ora, indovinate: avere questi stati come una lista in Category non è l'ideale, a meno che non sia ordinato. Preferirei optare per un map<Period> . Se scegli un design DDD, potresti anche fare in modo che CategoryRepository implementi un metodo per ottenere uno CategoryPeriod specifico o un set di più elementi per lo stesso Category .

Ora per l'impatto di un aggiornamento di CategoryRepository per il periodo n, il più semplice è implementare questa operazione tramite la radice aggregata di categoria e attivare l'aggiornamento di tutti gli articoli per i periodi successivi nella stessa categoria.

    
risposta data 23.11.2018 - 22:26
fonte

Leggi altre domande sui tag