Racconta, Non chiedere e immutabilità in una rete non direzionale

1

Sto lavorando a un piccolo progetto in cui sto tentando di applicare una conformità relativamente rigida a due idee:

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.

    
posta Ben Aaronson 18.10.2014 - 18:20
fonte

1 risposta

1

Il punto principale degli oggetti è incapsulare il cambiamento di stato in un solo ambito locale. Se fosse possibile modificare i dati dell'oggetto da qualsiasi posizione, sarebbe estremamente difficile eseguire il debug. Immutabilità e oggetti non hanno senso insieme, perché se i tuoi oggetti sono immutabili, la possibilità che lo stato venga modificato da un diverso ambito scompare e quindi è necessario incapsulare.

"Dillo, non chiedere" è un principio che dovrebbe ricordarti di non interrompere l'incapsulamento. Ma se non hai bisogno di incapsulamento, non hai nemmeno bisogno di questo principio.

Quindi non ha senso cercare di seguire entrambi i principi allo stesso tempo.

    
risposta data 18.10.2014 - 22:04
fonte

Leggi altre domande sui tag