Sono confuso riguardo alla nozione di immutabilità. Considera la seguente struttura di una calcolatrice semplicistica:
Eccoleinterfacce:
interfaceIOperationalInterface{intSum(inta,intb);}interfaceIAuditInterface{intSumInvocations();}
IOperationalInterface.Sum
dovrebbecalcolarelasommadidueinterieIAuditInterface.SumInvocations
dovrebberestituireilnumerototaledichiamateSum
ricevute.
Eccoun'implementazionebanale:
classCalculatorImpl:IOperationalInterface,IAuditInterface{privateintinvocations=0;publicintSum(inta,intb){invocations++;returna+b;}publicintSumInvocations(){returninvocations;}}
ÈCalculatorImpl
immutabile?Ovviamenteno,perchéilsuostatocambiaconogniinvocazionedelmetodoSum
.L'operazioneSum
èpura?SecondoIAuditInterface
non è pura, poiché potrebbe restituire risultati diversi.
In sintesi, SumInvocations
è mutabile e tutti i suoi metodi sono impuri.
Tuttavia, dal punto di vista di CalculatorImpl
, che parla ad esso solo attraverso CalculatorClient
, sembra essere immutabile e l'operazione IOperationalInterface
sembra essere pura nel senso che non potrebbe osservare alcun effetto collaterale tramite quell'interfaccia .
D'altra parte, dal punto di vista di Sum
, è completamente diverso: è ovvio che l'oggetto che implementa AuditClient
è mutabile e la sua operazione AuditInterface
è impura, e questo segue direttamente dalla specifica del SumInvocations
.
Quindi, è possibile partizionare un'interfaccia / specifica di una classe mutabile in modo tale che alcune parti di essa sembrino mutabili e altre no. In questo caso, considerando solo l'operazione IAuditInterface
e tralasciando il requisito di conteggiare le invocazioni, otteniamo qualcosa che non ha effetti collaterali.
Ora, implementando il Sum
si può prendere in considerazione il fatto che l'oggetto dietro l'interfaccia appare per essere immutabile. Almeno uno non poteva dire la differenza.
Quindi la mia domanda è: ha senso parlare di "immutabilità" delle interfacce o è una cattiva idea? In quale altro modo posso comunicare il fatto che non ci saranno effetti collaterali osservabili attraverso quell'interfaccia? E se è brutto, cosa potrebbe andare storto?
Aggiorna
Grazie per le vostre risposte / commenti! Ora vedo che non c'è modo di dire che CalculatorClient
è puro; le condizioni di purezza sono troppo forti per essere applicate in questo caso. Tuttavia la domanda rimane se esiste una nozione più debole (forse "immutabilità"?) Che è applicabile.