저는 판촉 시스템을 개발 중이며 상태 머신 패턴으로 처리 될 수있는 무언가를 밟았지만 아직 상태 시스템에 대한 경험은 없습니다. 어쩌면 상태 머신은이 상황에서 전혀 쓸모가 없습니다 :) 그래서 일부 기간, 일부 할당 된 고객, 제품, 할인 등 판매 촉진을 가지고있다. 각 프로모션도 상태가있다. 대략 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 등과 같은 서비스를 개발하여 코드를 덜 결합 할 수는 있지만 지금은 볼 수없는 몇 가지 해결책이있을 것입니다.
단순화를 위해 상태 라벨을 숫자로 단순화했습니다. "제안", "확인 됨", "계획"등의 이름이 붙었습니다. "ChangePromotionStatus"응답 : 전환 로직을 배치해야한다고 생각합니다. 특정 클래스. 나는 그것을 모두 결합하는 방법을 알아낼 수 없다. SM에 대해 더 자세히 읽으십시오. – Buthrakaur