Oggetti immutabili vs. collezioni immutabili
Uno dei punti più fini del dibattito sugli oggetti mutabili vs. immutabili è la possibilità di estendere il concetto di immutabilità alle collezioni. Un oggetto immutabile è un oggetto che spesso rappresenta una singola struttura logica di dati (ad esempio una stringa immutabile). Quando si ha un riferimento a un oggetto immutabile, il contenuto dell'oggetto non cambierà.
Una collezione immutabile è una collezione che non cambia mai.
Quando eseguo un'operazione su una raccolta mutabile, quindi cambio la raccolta in atto e tutte le entità che hanno riferimenti alla raccolta vedranno la modifica.
Quando eseguo un'operazione su una raccolta immutabile, un riferimento viene restituito a una nuova raccolta che riflette il cambiamento. Tutte le entità che hanno riferimenti a versioni precedenti della raccolta non vedranno la modifica.
Le implementazioni intelligenti non devono necessariamente copiare (clonare) l'intera raccolta per fornire quell'immutabilità. L'esempio più semplice è lo stack implementato come un elenco collegato singolarmente e le operazioni push / pop. È possibile riutilizzare tutti i nodi della raccolta precedente nella nuova raccolta, aggiungendo un solo nodo per il push e non clonando nodi per il pop. L'operazione push_tail su un elenco collegato singolarmente, d'altra parte, non è così semplice o efficiente.
Variabili / riferimenti immutabili vs. mutabili
Alcuni linguaggi funzionali prendono il concetto di immutabilità per obiettare i riferimenti stessi, consentendo solo una singola assegnazione di riferimento.
- In Erlang questo vale per tutte le "variabili". Posso assegnare oggetti a un riferimento solo una volta. Se dovessi operare su una raccolta, non sarei in grado di riassegnare la nuova raccolta al vecchio riferimento (nome della variabile).
- Scala incorpora anche questo nel linguaggio con tutti i riferimenti che vengono dichiarati con var o val , vals è solo una singola assegnazione e promuove uno stile funzionale, ma varia permettendo una struttura di programma più simile a C o Java.
- È richiesta la dichiarazione var / val, mentre molte lingue tradizionali usano modificatori opzionali come final in java e const in C.
Facilità di sviluppo vs. prestazioni
Quasi sempre la ragione per usare un oggetto immutabile è promuovere la programmazione libera da effetti collaterali e semplici ragionamenti sul codice (specialmente in un ambiente altamente concorrente / parallelo). Non devi preoccuparti che i dati sottostanti vengano modificati da un'altra entità se l'oggetto è immutabile.
Lo svantaggio principale è rappresentato dalle prestazioni. Ecco un articolo su un semplice test che ho fatto in Java confrontando alcuni oggetti immutabili e mutabili in un problema di giocattolo.
I problemi di prestazioni sono controversi in molte applicazioni, ma non in tutti, motivo per cui molti pacchetti numerici di grandi dimensioni, come la classe Numpy Array in Python, consentono aggiornamenti sul posto di array di grandi dimensioni. Ciò sarebbe importante per le aree di applicazione che fanno uso di operazioni a matrice e vettoriali di grandi dimensioni. Questi grandi problemi legati al parallelo dei dati e ad alta intensità computazionale ottengono una grande accelerazione operando sul posto.
string
è immutabile, almeno in .NET, e penso anche in molti altri linguaggi moderni.