Considerate questo dominio applicazione semplificata:Immutabilità e riferimenti condivisi: come conciliare?
- penale banca dati Investigative
Person
è chiunque sia coinvolto in un'indagineReport
è un po 'di informazioni che fa parte di un'indagine- A
Report
riferimenti a primariePerson
(oggetto di un'indagine) - A
Report
ha complici secondariamente correlati (e potrebbe c essere primariamente in altre indagini o rapporti - Queste classi hanno id che vengono utilizzati per memorizzarli in un database, poiché le loro informazioni possono cambiare nel tempo (ad es. potremmo trovare nuovi alias per una persona, o aggiungere persone di interesse per un rapporto)
Domain http://yuml.me/13fc6da0
Se questi sono memorizzati in una sorta di banca dati e desidero utilizzare oggetti immutabili, non sembra essere un problema per quanto riguarda lo stato e il riferimento.
Supponendo di modificare alcuni metadati su uno Person
. Dal momento che i miei Person
oggetti immutabili, potrei avere un po 'di codice come:
class Person(
val id:UUID,
val aliases:List[String],
val reports:List[Report]) {
def addAlias(name:String) = new Person(id,name :: aliases,reports)
}
Così che il mio Person
con un nuovo alias diventa un nuovo oggetto, anche immutabile. Se a Report
si riferisce a quella persona, ma l'alias è stato modificato altrove nel sistema, il mio Report
ora si riferisce alla persona "vecchia", cioè la persona senza il nuovo alias.
Allo stesso modo, potrei avere:
class Report(val id:UUID, val content:String) {
/** Adding more info to our report */
def updateContent(newContent:String) = new Report(id,newContent)
}
Dal momento che questi oggetti non so chi vi fa riferimento, non è chiaro per me come lasciare tutti i "referenti" sanno che c'è un nuovo oggetto disponibile che rappresenta lo stato più recente.
Questo può essere fatto facendo in modo che tutti gli oggetti "si aggiornino" da un archivio dati centrale e tutte le operazioni che creano nuovi oggetti aggiornati vengano archiviati nell'archivio dati centrale, ma si tratta di una reimplementazione approssimativa del riferimento della lingua sottostante. cioè sarebbe più semplice rendere questi "oggetti memorizzabili secondari" semplicemente mutabili. Quindi, se aggiungo un alias a Person
, tutti i referrer visualizzano il nuovo valore senza fare nulla.
Come viene gestita questa funzione quando si desidera evitare la mutabilità o si tratta di un caso in cui l'immutabilità non è utile?
È possibile implementare l'elenco collegato doppio in haskell. http://www.haskell.org/haskellwiki/Tying_the_Knot Se capisci questo ed è applicabile al tuo problema, sarebbe bello se rispondessi. :-) –
@Thomas Jung: Penso che la soluzione sopra si avvantaggi di alcune stranezze che si ottengono con la valutazione pigra. Scala, essendo attentamente valutato, ha bisogno di saltare attraverso i cerchi per ottenere lo stesso effetto. Penso che la soluzione più semplice qui sia semplicemente quella di evitare le dipendenze cicliche con strutture di dati immutabili. – Juliet