2011-10-26 5 views
0

여기에 비즈니스 요구 사항이 간단히 나와 있습니다.디자인 패턴을 사용하여 구독 시스템 모델

시스템에 대한 "가입"을 나타내는 PricingSchedule이라는 엔티티가 있습니다. 우리는 우리 팀의 유비쿼터스 언어에서 "구독"이 아닌 "가격 책정 일정"이라는 용어를 사용합니다. 그러나 이론적으로 구독은 동일한 것입니다. 1. PricingSchedule (의 "시간"일명, 등 가입 ... 1 년, 2 년, 얼마나 오래 ... 다음 PricingSchedule의 가격을 결정 무엇

두 가지의 조합입니다 2. PricingSchedule에 몇 개의 Styles (다른 엔티티)를 포함시킬 것인가? 스타일을 포함하는 방법에 대한 두 가지 옵션이 있습니다 : 1. 스타일 당 지불 2. 모든 스타일 지불

숫자 2는 새로 추가 된 요구 사항입니다 이전에 가격을 결정한 것은 PricingSchedule의 기간이었습니다.

내 문제는 이것입니다. PricingSchedule의 가격은 Duration 또는 StylePricingType이 단독으로 적용됩니다. 나는 그들이 결합되었을 때만 최종 가격을 얻을 수있다. 일명, 5 스타일과 2 년 기간.

우리는 며칠에서 3 년 또는 4 년까지 네 가지 가능한 미리 결정된 기간을 가지고 있습니다.

우리는 두 가지 방법으로 스타일 선택을 청구 할 수 있습니다. 1. 스타일마다 또는 2. 모든 스타일. 이 두 가지가 결합되어 전반적인 가격이 결정되었습니다.

나는 전략 디자인 패턴이 일명 나를 도와 줄 수 있다고 생각하기 시작했다.

public interface IDurationPricingStrategy 
public decimal GetDurationPriceFor(PricingSchedule) 

public interface IStylePricingStrategy 
public decimal GetStylePriceFor(PricingSchedule) 

이것은 앞으로 나아갈 것으로 예상되는 것들을 분리하는 좋은 방법입니다. 다른 전략의 "조건부"를 모른 채로 하나의 전략을 구현할 수는 없습니다.

는 예를 들어, IStylePricingStrategy를 들어, 내가 지금처럼 무제한 스타일 가격 옵션을 구현 :이 접근 방식을 취할 경우

public class UnlimitedStylePricingStrategy : IStylePricingStrategy 
{ 
public decimal GetStylePriceFor(PricingSchedule) 
{ 
if (PricingSchedule.Duration.Type == DurationType.OneYear) 
{ 
return decimal x; 
} 
if (PricingSchedule.Duration.Type == DurationType.TwoYears) 
{ 
return decimal x; 
} 
} 
} 

, 즉 의미 만약 내가 추가하거나 기간 가격 유형을 변경해야 할 때, SRP를 깨는 StyleStrategy 구현 클래스를 변경해야하며, 기본적으로 다시 정사각형으로 되돌아갑니다.

PricingSchedule의 가격을 결정하는 "물건"이 하나뿐이라면 쉽습니다. 그러나이 두 가지가있을 때, 그것이 벽을 때리는 위치입니다.

내가 사용할 수있는 또 다른 패턴이 있습니까? 아니면 어떻게 든 전략 패턴을 다르게 사용합니까? 나는 문제가 여전히 전략쪽으로 나를 끌어 들인다 고 느낀다. 그러나 나는 하나의 전략 대신에 두 가지 전략을 통합하는 방법을 확신하지 못한다.

감사합니다. 마이크

답변

1

나는 하나의 방법은 시간에 대한 인터페이스를 만들 수있을 것 같아요 :

public interface IDuration 
{ 
    int GetDuration(); 
    decimal CalculatePrice(object whatever); // int something, or whatever. 
} 

을 가지고 일정 클래스를 사용

public class PricingSchedule 
{ 
    public IDuration Duration { get; set; } 
} 

그런 다음 지불 스타일 클래스가 사용할 수있는 기간은 다음과 같습니다.

까다로운 것은 며칠입니다. 어떻게 처리할지 모르겠지만 인터페이스를 사용하는 것이 최선의 방법이라고 생각합니다. 새로운 기간을 추가해야하는 경우 인터페이스 IDuration을 구현하기 만하면됩니다. 이 당신에게 거친 아이디어를 줄

public override void GetStylePriceFor(PricingSchedule schedule) 
{ 
    int duration = schedule.Duration.GetDuration(); 

    int temp = 34; 

    decimal result = schedule.Duration.CalculatePrice(temp); 
} 

희망 :

당신은 다음과 같이하여 가격을 계산할 수 있습니다.

+0

제이슨, 내 게시물을 읽는 데 시간을내어 주셔서 너무 감사드립니다. 재미있는 "Duration"에 대해 언급하면 ​​b/c에서 내 모델과 내 테스트를보고 있었고 지난 10 분 동안 내 모델에서 Duration 개체가 누락되었음을 깨달았습니다. 귀하의 사용법은 이미 잘 알고 있습니다. 나는 이것으로 달리고 그것이 나의 시험을 가져 오는 곳을 볼 것입니다. 다시 한 번 감사드립니다! Mike –

+0

축하해 :) 내 우편물이 당신에게 긍정적 인 영향을 줄 수 있기를 바랍니다. –

관련 문제