판매 프로모션 시스템의 상태 변경을 처리하는 데 상태 머신이 적합한가요?

StackOverflow https://stackoverflow.com/questions/673535

  •  21-08-2019
  •  | 
  •  

문제

저는 판촉 시스템을 개발 중이며 상태 머신 패턴으로 처리할 수 있는 것을 방금 밟았지만 아직 상태 머신에 대한 경험이 없습니다.아마도이 상황에서 주 머신은 완전히 쓸모가 없을 것입니다. :) 그래서 나는 약간의 시간이있는 판매 프로모션, 일부 고객, 제품, 할인 등을 가지고 있습니다.각 프로모션에는 해당 상태도 있습니다.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 등과 같은 서비스를 개발하여 코드 결합을 줄일 수 있지만 현재로서는 볼 수 없는 더 나은 솔루션이 있을 수 있습니다.

도움이 되었습니까?

해결책

5개 상태는 상태 머신에 비해 너무 복잡하지는 않지만, 일부 전환을 특별하게 또는 명시적으로 처리하려고 하면 몇 가지 문제에 직면하고 있다고 생각합니다.다음은 몇 가지 팁입니다.

  • 상태 머신은 의미 있는 방식으로 상태에 레이블을 지정할 수 없으면 도움이 되지 않습니다."상태 3"은 아무 의미도 없습니다."Promoted", "Active", "Completed" 등과 같이 유용한 이름으로 불러야 합니다.

  • 상태 머신 패턴의 일부에서는 상태와 상태 간 전환 방법을 이해하는 분리된 엔터티가 있다고 가정합니다.다음과 같은 방법을 사용하면 안 됩니다. ChangePromotionStatus() 예를 들어, 상태가 허용되지 않으면 폭발하는 경우가 있습니다.상태 머신은 단순히 발생할 수 없는 전환을 방지해야 합니다.

  • 가능한 전환 수가 적고 잘 정의되어 있고 라벨을 지정하는 것이 타당하다면 전환에도 이름을 지정하는 것이 좋습니다.이는 전환이 모두 동일한 작업을 수행하지만 약간 다른 방식으로 수행되는 경우 특히 유용할 수 있습니다.

다른 팁

John은 핵심에 맞췄습니다. 상태 머신을 사용하여 모델링한 프로세스를 도메인 엔터티에서 분리하기를 원합니다.도메인 엔터티는 특정 이벤트를 기반으로 한 상태에서 다른 상태로 전환하는 작업을 관리하는 상태 머신에서 사용되고 있다는 사실을 직접적으로 알면 안 됩니다. ~ 할 것이다 자신이 속한 각 상태의 비즈니스 의미를 이해하고 해당 상태와 관련된 비즈니스 규칙을 시행하거나 적용할 수 있습니다.

이상적으로는 상태 기계에서 관리하기에 적합한 도메인 엔터티는 상태 기계의 상태 역할을 하는 일종의 상태를 가지며 전환이 적절한 시기를 결정하기 위해 상태 기계에서 사용할 수 있는 이벤트를 발생시킵니다. .

그러나 귀하의 상태가 실제로 사실이라면 완전히 순차적 - 즉항상 a-b-c-d-e 또는 앞뒤로 정확히 한 단계씩 이동합니다. 다음 상태를 선택하는 데 특별한 컨텍스트가 필요하지 않기 때문에 상태 머신이 의미가 있는지 잘 모르겠습니다. 뒤로 또는 앞으로만 이동할 수 있으므로 순서가 지정된 상태 목록은 무엇이든 가능합니다. (예: Enum)을 다음/이전 논리와 결합하면 충분합니다. 그러나 실제 프로세스는 처음에는 뻔해 보일지라도 그렇게 엄격하게 선형인 경우는 거의 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top