私は一連の定義された状態を経るOrderクラスを持っています。これを助けるために、OrderオブジェクトにIOrderStateインターフェイスを実装するCurrentStateメンバがあるようなStateパターンを実装しました。私はその後、OrderStateNew、OrderStateDeliveredなどのこのインターフェイスの具体的な実装を持っています状態パターンを使用するオブジェクトは、次の状態にどのように移行する必要がありますか?
私の質問は、状態間のOrderオブジェクトを移行する正しい方法は何ですか?外部サービスが状態を設定できるようにするOrder.SetState()メソッドを持つことは容認できますか?状態の変化を決定する基準はOrderオブジェクトの外部に格納されているので、これは明らかな答えですが、私のオブジェクトにpublicメソッドを持たせることで、このような基本的なものを変更するのは少し不安です。
追加の明確化 私は、私が実際に最初の場所で正しくパターンを使用している場合、私は疑問に思うので、私の実装に関するいくつかの詳細を追加すると便利かもしれないと思いました。ここでオーダーを作成し、認可するためのpulbic APIが
Dim orderFacade As New OrderFacade
Dim order = orderFacade.createFrom(customer)
' Add lines etc
' This will validate the order and transition it to status 'Authorised'
Dim valid = orderFacade.Authorise(order)
' This will commit the order, but only if it is at status 'Authorised'
Dim result = orderFacade.Commit()
OrderFacade.Authorise()関数は、あなたが見ることができるように、この
Public Function Authorise(ByRef originalOrder As Order) As ValidationSummary
If originalOrder.CurrentState.CanAuthorise() Then
Dim validator = OrderValidatorFactory.createFrom(originalOrder)
Dim valid = validator.ValidateOrder(originalOrder)
If valid.IsValid Then
originalOrder.SetOrderStatus(OrderStatus.Authorised)
End If
Return valid
End If
End Function
ようになりますです、currentStateのメンバーが決定し、現在のIOrderState実装ですどのアクティビティがオブジェクトに対して有効であるかを示します。私はこれがOrderFacadeではなく移行を決定する責任があるべきかどうか疑問に思いますか?
関連:http://stackoverflow.com/questions/1647631/c-state-machine-design – jldupont