Ho letto The Early History of Smalltalk e ci sono alcune menzioni di "assegnazione" che rendono mi interrogo sulla mia comprensione del suo significato:
Though OOP came from many motivations, two were central. The large scale one was to find a better module scheme for complex systems involving hiding of details, and the small scale one was to find a more flexible version of assignment, and then to try to eliminate it altogether.
(da 1960-66 - Early OOP e altre idee formative degli anni Sessanta , Sezione I)
What I got from Simula was that you could now replace bindings and assignment with goals. The last thing you wanted any programmer to do is mess with internal state even if presented figuratively. Instead, the objects should be presented as site of higher level behaviors more appropriate for use as dynamic components. (...) It is unfortunate that much of what is called "object-oriented programming" today is simply old style programming with fancier constructs. Many programs are loaded with "assignment-style" operations now done by more expensive attached procedures.
(da "Stile orientato agli oggetti" , Sezione IV)
Sono corretto nell'interpretare l'intento che gli oggetti sono pensati per essere facciate e qualsiasi metodo (o "messaggio") il cui scopo è quello di impostare una variabile di istanza su un oggetto (cioè un "assegnamento") sta vanificando lo scopo ? Questa interpretazione sembra essere supportata da due dichiarazioni successive nella Sezione IV:
Four techniques used together--persistent state, polymorphism, instantiation, and methods-as-goals for the object--account for much of the power. None of these require an "object-oriented language" to be employed--ALGOL 68 can almost be turned to this style--and OOPL merely focuses the designer's mind in a particular fruitful direction. However, doing encapsulation right is a commitment not just to abstraction of state, but to eliminate state oriented metaphors from programming.
... e:
Assignment statements--even abstract ones--express very low-level goals, and more of them will be needed to get anything done. Generally, we don't want the programmer to be messing around with state, whether simulated or not.
Sarebbe corretto dire che qui vengono incoraggiate istanze opache e immutabili? O sono semplicemente direct cambiamenti di stato che sono scoraggiati? Ad esempio, se ho una classe BankAccount
, è OK avere GetBalance
, Deposit
e Withdraw
metodi / messaggi di istanza; assicurati che non ci sia un metodo / messaggio di istanza SetBalance
?