2011-11-04 2 views
1

안녕하세요 저는 다음과 같은 간단한 설명으로 앱을 작성해야합니다.배열 컬렉션을 적절하게 캡슐화하십시오.

프로모션 규칙에 따라 가격을 계산하는 인터페이스를 구현합니다.

co = Checkout.new(promotional_rules) 
co.scan(item) 
co.scan(item) 
price = co.total 

기본적으로 설정 한 홍보 규칙에 따라 특정 항목이 그에 따라 할인됩니다. 나쁜 OO

내가 처음에 규칙의 배열을 포함하는 promotional_rules 객체를 생성 -

은 내가 promotional_rules의 그룹을 캡슐화하고 어쨌든 배열로 규칙을 노출했다고 진술 내 코드에 대한 몇 가지 코멘트를 공유했습니다.

def initialize 
    @rules = [] 
    end 

def addrule(rule) 
    @rules.push(rule) 
end 

그런 다음 내 체크 아웃 개체에는 setup 및 초기화 프로그램으로 전달 된 promotional_rules 개체가 있습니다. promotional_rules 객체에 포함 된 규칙 배열을 반복하고 체크 아웃 객체가 스캔 한 항목에 적용합니다.

def initialize(promotionalrules=Promotionalrules.new) 
    @promotionalrules = promotionalrules 
end 

....Other code 

for rule in @promotionalrules.getrules 
    for item in @items 
    ##Execute rule on current item. 
    end 
end 

하지 너무 행복 내 코드 임 ...하여 루프 등으로 루프하지만은 임 내가 잘못 갈 경우 확실하지 캡슐화 도움을 찾고 있어요.

브리핑에 적용 할 좋은 디자인 패턴에 대한 제안은 내가 취한 접근 방식에 대해 너무 확신하지 않는 한 유익 할 것입니다. 감사합니다

답변

2

나는 그들이이 "노출"에 대해 불평하고 있다는 추측에는 요 : 발신자 밖으로 (아마도 PromotionalRules라고한다) 당신의 Promotionalrules에서 내부 규칙을 출혈

for rule in @promotionalrules.getrules 

.

# I'm not sure how the rules and item interact so this "each" might 
# be a different iterator in reality 
@items.each { |i| @promotional_rules.apply_to_item(i) } 

근본적인 변화가 각 항목에 대한 전체 규칙 집합을 적용한다는 것입니다 : 나중에 다음

class Promotionalrules 
    #... 
    # and possibly remove the getrules method completely 
    def apply_to_item(item) 
    # Apply @rules to item 
    end 
    #... 
end 

과 : 수정 프로그램은 로직 조금 반대하는 것입니다. 이렇게하면 규칙 집합 구현 세부 정보가 숨겨지고 추가 보너스로 서로 의존하는 규칙 ("쿠폰 Y를 사용하지 않는 한 할인 X를 얻을 수 있습니다"등)을 쉽게 지원할 수 있습니다.

+0

정말 좋아, 지금 그들이 무엇을 의미하는지 알 수 있습니다. 내 규칙과 항목이 상호 작용하는 방식에 대해 생각하고 있다면 개선 할 수 있을지는 모르겠지만 또 다른 질문 일 수도 있습니다. 어쨌든, 지금, PromotionalRules 객체의 규칙 객체 배열을 반복하여 각 항목에 적절하게 적용합니다. – namtax

+0

@namax : 규칙에 따라 전체 항목 목록을 규칙 집합에 넘겨주는 것이 좋습니다 그리고 규칙 세트가 항목을 반복하게하면 "1의 가격에 2"와 같은 것을 쉽게 처리 할 수 ​​있습니다. –

+0

참. 규칙을 반복하는 것처럼 중첩 된 루프가 포함되지만 해당 루프 내의 항목을 반복합니다. – namtax

관련 문제