2

私は販売促進システムを開発していて、おそらくステート マシン パターンで処理できる何かを踏んだだけですが、ステート マシンの経験はまだありません。この状況では、ステート マシンはまったく役に立たないかもしれません :) したがって、一定期間、割り当てられた顧客、製品、割引などを持つ販売プロモーションがあります。各プロモーションにも状態があります。5州くらいです。状態間の遷移は厳密に定義されています。状態 1 を状態 3 に直接変更することはできません。ユーザーは最初に状態 2 に変更する必要があります。「プロモーションの状態が 3 ~ 5 の場合、これ以上商品を追加することはできません」などの制限があります。または、「状態 3 ~ 5 の場合、スーパーユーザーのみがプロモーション費用を編集できる」などの制限。

http://www.codeplex.com/SimpleStateMachineについて読んだところですが、この場合には複雑すぎないかどうかはわかりません。次のようなものを使用して、サービス層で状態ロジックを処理できます。

if (promotion.state == statesRepository.GetState3() && false == loggedUser.IsInRole("superUser")){
   throw new PromotionStateException("user not allowed to edit promotion in this status");
}
...

また

public void ChangePromotionStatus(promotion, newStatus){
  if (promotion.Status == status1 && newStatus != statesRepo.GetState2()){
    throw new StateTransitionException("unable to change from status 1 to " + newStatus);
  }
}

しかし、私はこの種のコードが好きではありません-より良いアプローチが必要です:)誰かアドバイスはありますか? もちろん、懸念事項を分離し、PromotionStatusChangeReviewService、PromotionEditPermissionService などのサービスを開発して、コードの結合を少なくすることもできますが、現時点では見当たらないより良い解決策がおそらくあるでしょう。

4

2 に答える 2