penso realmente in disaccordo con il modo in cui si sta inquadrando questo:
Anzi, non ho idea su come conciliare l'effetti regola del non-lato implicita tipi immutabili e funzioni puri e il premessa di OO, dove i metodi modificano lo stato dell'istanza sul posto, che è ovviamente effetti collaterali.
Non direi che le operazioni mutative sui campi oggetto sono una "premessa fondamentale di OO". Assolutamente no (anche se al contrario io do penso che l'immutabilità sia una premessa fondamentale di FP). Per me, OO è un modo di pensare al programma modularità più che altro.
Nella mia (forse contorta) mentalità, anche Haskell - un linguaggio i cui sostenitori spesso si arrovellano al pensiero stile OO - tuttavia incarna alcuni concetti OO, nel senso che ha un sistema modulare, vari modi di incapsulare l'implementazione dettagli di tipi di dati, ecc. E sul rovescio della medaglia, anche se è eccezionalmente goffo e aggravante, il mio codice Java tende a fare un uso pesante di concetti funzionali di base come il currying.
In altre parole, penso che i due approcci siano complementari in un certo senso.
Ora, ad un livello meno teorica e più dadi e bulloni ... Diciamo che hai qualcosa di simile:
class Foo(val a : A, val b : B, val c : C) {
def setB(newb : B) : Foo = new Foo(a, newb, c)
}
... così si può dire newFoo = foo.setB(b)
come lei ha suggerito nel post originale . Direi che questo è uno stile assolutamente eccellente, e non è motivo di preoccupazione (in termini di prestazioni, leggibilità o altro). Ne vedrai un sacco con le immutabili classi di raccolta nella libreria Scala.
Lettura interessante e altamente correlata: [Sono FP e OO ortogonali?] (Http://stackoverflow.com/q/3949618/395760) – delnan
È questa la premessa di OO? Perché, allora, Effective Java raccomanda oggetti immutabili? Penso che dovresti iniziare a conciliare la tua visione di OO con quello che gli esperti hanno effettivamente detto ... –