Quindi ho un framework generico con un concetto di oggetti figlio e genitore, gli oggetti non devono essere dello stesso tipo e posso aggiungere o rimuovere uno di essi. L'aggiunta di chiamate si aggiunge a tutti i bambini e informa i genitori, inversa per la rimozione.
il concetto di Parent è abbastanza generico da consentire un loop tra le classi. A può essere un genitore di B che è un genitore di C che è un genitore di A. Questo funziona ancora, dal momento che contrassegno un oggetto come aggiunto o rimosso come primo passo nella classe astratta; quindi anche se una dipendenza circolare chiama Aggiungi una seconda volta sullo stesso oggetto, la seconda volta attraverso l'add ritornerà senza fare nulla (perché il booleano aggiunto è già impostato) e interrompiamo la nostra ricorsione.
Se si verificano alcune eccezioni impreviste, desidero ripristinare il mio stato su ciò che era prima che si verificasse l'eccezione. Lo stavo facendo con la gestione delle eccezioni, se rilevo una connessione run time rimuovo gli oggetti che ho aggiunto e aggiorno i genitori prima di lanciare l'eccezione. È qui che la mia logica può fallire. A partire da ora ho ripristinato il metodo AddObject chiamando removeObject e viceversa. Se il mio stato in qualche modo finisse in uno stato veramente bizzarro, potrei continuare a lanciare eccezioni, aggiungere lanci e chiamate rimuovere, togliere tiri e chiamate add, ecc ecc. Penso che questo abbia ancora una possibilità di ricorsione infinita; anche se, ammettiamolo, qualcosa dovrebbe già essere incasinato nel mio stato perché accada.
C'è un modo più semplice per eseguire la mia logica di rollback per evitare questo potenziale? In un punto come questo, dovrei dire che il mio stato dovrebbe essere una volta che recupero comunque?