Oggetto mobile mutevole vs mutevole

5

Ho bisogno di modellare un oggetto mobile molto semplice ( Robot ) su una griglia rettangolare. Il suo stato è descritto da position (in pratica una coppia di numeri interi) e direction (ad esempio, N, E, S, W). Ha solo due metodi (escluso il costruttore): può spostare un passo nella sua direction , o ruotare di 90, 180 o 270 gradi.

A prescindere dagli ovvi problemi di prestazioni e da eventuali considerazioni specifiche della lingua, quali fattori dovrei prendere in considerazione quando decidere se rendere mutabili le istanze di Robot (metodi modificano lo stato) o immutabili (i metodi restituiscono un robot appena creato con il nuovo stato) ? Le istanze di questa classe verranno utilizzate in varie simulazioni (ometto intenzionalmente i dettagli per ottenere una comprensione più chiara dei principi generali).

(Modificato per chiarire) Quando penso a un robot, l'immagine naturale nella mia mente è una cosa mobile, che corrisponderebbe a un oggetto mutevole. Detto questo, non è difficile per me superare questa associazione mentale e pensare ai robot come piccoli segni sulla griglia che vengono creati (e distrutti se non ci sono altri punti di riferimento su di loro) ogni volta che si muovono. Quindi non mi preoccuperei di ciò che sembra naturale e sceglierei solo ciò che funziona meglio in termini di codice.

Stavo pianificando di modellare position e direction come attributi di robot . Indipendentemente dal fatto che robot sia di per sé immutabile, stavo progettando di rendere immutabili i tipi di position e direction immutabili solo perché è più naturale per me considerarli come tali (ad es. quando parlo di un "punto su una griglia", immagino che resti sempre nello stesso posto, lo stesso per una "direzione").

    
posta max 13.11.2016 - 18:41
fonte

4 risposte

4

Questi tipi di domande sono difficili da rispondere senza conoscere l'intero contesto, ma dalla tua descrizione vedo che Robot è un oggetto mutabile. Hai un robot che si muove attraverso la griglia, non hai un robot che appare in una certa posizione e viene distrutto su quello vecchio.

Il Robot ha un position . Questa può essere una tupla (immutabile) o solo due proprietà del numero sul robot. La posizione può essere modificata con un metodo moveTo sul robot. Il robot ha un direction . Quindi questi sono stati del robot.

Apart from the obvious performance issues and any language-specific considerations, what factors should I consider when deciding whether to make Robot instances mutable (methods modify state) or immutable.

L'unica cosa da considerare è se nelle simulazioni eseguite, il robot viene utilizzato da più thread. Se è necessario sincronizzare l'accesso al suo stato o pensa di renderlo immutabile.

    
risposta data 13.11.2016 - 19:15
fonte
3

It only has two methods (apart from constructor): it can move one step in its direction, or rotate by 90, 180 or 270 degrees.

Questa è una svolta. Urla immutabile. Perché? Perché il tempo può essere rimosso.

On the other hand, when I think of a robot, the natural picture in my mind is a movable thing, which would correspond to a mutable object.

Quando guardiamo film vediamo cose mobili dappertutto. Eppure ogni immagine è una cosa immobile immobile. Ciò che sembra e come funziona non deve essere la stessa cosa.

Essere immutabili ha benefici oltre la concorrenza. Inoltre ha un costo. Questa scelta ha implicazioni per lo scambio di spazi temporali, la memorizzazione nella cache e la convalida dello stato.

Senza conoscere i dettagli della tua simulazione, ne so abbastanza dei benefici degli oggetti immutabili per incoraggiarti ad usarne il più possibile. Quando sarai andato lontano, lo saprai. È quando non sei andato abbastanza lontano da essere trattato con brutte sorprese.

    
risposta data 13.11.2016 - 20:02
fonte
2

when I think of a robot, the natural picture in my mind is a movable thing, which would correspond to a mutable object ... it's not hard for me to overcome this mental association

Sembra che tu stia cercando di forzare l'immutabilità, piuttosto che usarla come strumento per risolvere un problema.

Tipi immutabili con metodi "mutabili"

Un tipo immutabile con metodi "mutabili" alza una bandiera, e ci sono pochissime situazioni in cui effettivamente serve a scopi benefici. A parte queste poche situazioni, di solito causa problemi / confusioni ( String è un buon esempio, con i principianti che non capiscono che toLowercase() crea effettivamente un nuovo oggetto).

La tua idea che Position sia immutabile a causa della sua natura statica è una buona idea, ma ciò non significa che dovrebbe avere metodi che restituiscono nuove istanze di Position .

Suddivisione logica della tua situazione

Position oggetti dovrebbero esistere composti da un qualche tipo di Grid . Quando una Robot si sposta in una nuova posizione sulla griglia, il robot dovrebbe avere un riferimento a quella posizione.

Se per qualche motivo vuoi che Robot abbia la propria posizione indipendente che è soggetta a modifiche, non dovresti considerarla immutabile, dato che il robot non sta creando posizioni, ma semplicemente regolando la sua posizione in modo che corrisponda alla posizione target.

Pensa sempre ai "pro" e ai "contro"

Apart from the obvious performance issues

Se sei consapevole che ci saranno problemi di prestazioni, dovresti assolutamente capire e valutare i benefici ottenuti dalla tua decisione. Sembra che tu non riesca a trovarlo, l'unico ragionamento è "Non è difficile immaginare questo scenario nella mia testa". Probabilmente è meglio concentrarsi sui pro e contro di un determinato design, piuttosto che su quello che meglio replica il mondo reale.

" Non pensarci da una prospettiva del mondo reale " era una brutta scelta di parole. Quello che intendevo era " Non lasciare che i tentativi di replica del mondo reale influenzino la gestibilità e le prestazioni del tuo software ". Solo perché puoi immaginarlo non significa che sia il migliore per un ambiente software.

    
risposta data 13.11.2016 - 20:47
fonte
1

(Questo è originariamente inteso per introdurre l'immutabilità ai lettori di fantascienza, quindi è scritto in modo non rigoroso.)

Puoi utilizzare l'oggetto immutabile se hai bisogno di pianificazione del movimento basata sulla ricerca.

In questo disegno, quanto segue è immutabile:

  • A tempo T ,
  • Il robot è in posizione X , Y ,
  • Direzione del fronte D .

Ci saranno molte istanze di oggetti immutabili nell'albero di ricerca. Ma per ogni tempo T fino ad oggi (vale a dire passato o presente), ci sarà esattamente una di queste istanze che riflette il percorso della storia del movimento del robot. Tutte le altre istanze saranno contemplazione di ciò che accadrebbe se il robot avesse scelto di spostarsi in modi diversi in diversi punti temporali.

Il tempo presente è T , quindi ogni istanza che ha un tempo maggiore di T è una contemplazione, poiché quel tempo futuro non è ancora successo.

Questo ti dà un universo parallelo , parlando in senso fantascientifico.

Un'istanza al tempo T+1 avrà bisogno di un link principale che si riferisce a un'istanza preesistente al tempo T . Questo link spiega come il robot potrebbe arrivare al suo stato a T+1 facendo uno spostamento da una posizione precedente a T .

Puoi usarlo come ricerca per il grafico o per lo scopo di trovare il percorso.

    
risposta data 14.11.2016 - 04:39
fonte

Leggi altre domande sui tag