Supponiamo di avere le seguenti classi:
Comepuoivedere,èun'implementazionedel
In sostanza, la classe Order
trasmette le chiamate al metodo pay()
e cancel()
alla sua istanza concreta OrderState
.
Dopo aver eseguito la propria parte della business logic, PendingOrderState
e PaidOrderState
chiamano setState
sull'istanza Order
per passare ad altro stato.
Question (s):
-
È un odore di codice, che l'API pubblica della classe
Order
è "inquinata" dasetState
, un metodo che dovrebbe essere usato solo internamente dalle istanzeOrderState
? -
Se la risposta alla domanda precedente è "Sì", allora come può
setState
essere incapsulato lontano da altri client della classe Order (come una classeCustomer
ipotetica, che riguarda solopay
ecancel
metodi diOrder
)?
Soluzione possibile:
Una possibile soluzione che mi viene in mente è l'introduzione di una sorta di classe OrderWrapper
, che includerebbe la classe Order
e esponesse solo i metodi pay()
e cancel()
.
P.S
Ci scusiamo per il tentativo sciatto di UML:).