"Stato" modello e incapsulamento

1

Supponiamo di avere le seguenti classi:

Comepuoivedere,èun'implementazionedel Pattern di stato .

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):

  1. È un odore di codice, che l'API pubblica della classe Order è "inquinata" da setState , un metodo che dovrebbe essere usato solo internamente dalle istanze OrderState ?

  2. Se la risposta alla domanda precedente è "Sì", allora come può setState essere incapsulato lontano da altri client della classe Order (come una classe Customer ipotetica, che riguarda solo pay e cancel metodi di Order )?

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:).

    
posta Alexander Lomia 30.11.2018 - 12:46
fonte

1 risposta

1

Sì, è un odore di codice che una funzione "interna" come setState viene esposta nell'interfaccia pubblica di Order .

Ciò che puoi fare al riguardo dipende in gran parte dal design delle tue lezioni e dalle funzionalità fornite dalla tua lingua di implementazione.

In una lingua come Java, se Order e concrete OrderState implementazioni appartengono allo stesso pacchetto, allora potresti dare a setState lo specificatore di accesso "pacchetto privato", rendendo chiaro che solo i membri dello stesso il pacchetto può usare quel metodo.

In C ++, potresti scambiare l'odore di codice di un'API pubblica troppo grande per l'odore del codice di specificare le concrete implementazioni di "OrderState" come amici di "Ordine". Ciò renderebbe possibile rendere setState privato, ma Order deve effettivamente conoscere tutti gli stati in cui può trovarsi e tali implementazioni di stato hanno un accesso molto ampio a Order . Dovresti scegliere quale soluzione ha il minimo odore per te.

In altre lingue, potrebbe non esserci un modo per rimuovere l'odore e dovrai conviverci.

    
risposta data 30.11.2018 - 13:09
fonte