Sto lavorando a un piccolo progetto in cui sto tentando di applicare una conformità relativamente rigida a due idee:
- Dillo, non chiedere (TDA)
- Immutabilità
Il concetto principale in questo progetto è un Map
(come in una mappa geografica, non nella struttura dati), che contiene un array 2D di Tile
s. Le tessere possono essere pensate come quadrati su una scacchiera, con la loro posizione nell'array come loro posizione sulla scacchiera.
Un'operazione che può essere eseguita è che un segmento di linea può essere disegnato, iniziando da una tessera e passando attraverso una o più tessere, prima di terminare quando colpisce il bordo della mappa o un'altra linea che contiene già una tessera. Disegnare una linea attraverso un Tile
in questo caso significa semplicemente segnare Tile
con una proprietà booleana che dice che contiene una linea.
Per mantenere l'immutabilità, una Tile
non muta il suo stato quando viene tracciata una linea, invece di restituire una nuova Tile
con la linea disegnata. Il punto di ingresso per disegnare una linea è un metodo sulla mappa stessa, che assomiglia a:
public Map DrawLine(Tile from, Direction direction)
Quindi il problema qui è come disegnare una linea aderendo alle due idee che ho citato prima?
Un modo per tracciare la linea, mantenendo l'immutabilità ma dimenticando TDA, è che Map
si occupi dell'intero processo di disegno, stabilendo quali tessere debbano essere contrassegnate come contenenti una linea e facendo questo aggiornamento per ogni uno, sostituendoli con il Tiles
appena creato nel suo array.
Un altro modo, mantenendo TDA ma dimenticando l'immutabilità, è per il Map
per dire al Tile
di tracciare una linea, e in quale direzione, e poi per ogni tessera per notificare il successivo, finché uno decide che il la linea deve terminare (ad esempio perché contiene già una linea). In questo caso, non vedo alcun modo semplice per assicurarsi che tutti i Tile
s aggiornati vengano sostituiti in Map
, motivo per cui dico che questo approccio sacrifica l'immutabilità. Si suppone che anche il Map
stesso sia immutabile, quindi anche il passare a Tiles
con un metodo di callback void UdpateTile(int x, int y, Tile replacement)
non funzionerebbe.
Quindi la mia domanda è: esistono tecniche o schemi che mi permettano di fare quanto sopra, rispettando l'immutabilità TDA e ? Oppure, ci sono dei progetti di alto livello più appropriati che mi permettano di affrontare questi requisiti e aderire a entrambi i principi? Capisco che la violazione della TDA in questo caso è relativamente piccola, quindi a livello pratico non sarebbe un enorme sacrificio. Sono solo interessato a alternative migliori che potrei perdere.