2013-02-20 2 views
1

식료품 가게에서 고객 용 영수증을 출력하는 간단한 프로그램을 작성하는 과제를 받았습니다. 기본 판매 세은 서적, 식품 및 면제 대상 의약품을 제외한 모든 제품에 대해 10 %의 비율로 적용 가능합니다. 수입 관세은 모든 수입품에 대해 면제가없는 5 %의 추가 판매 세가 적용됩니다.객체 지향 디자인

샘플 입력 : $ 1에서 1 권, $ 5에서 가져온 초콜릿 바 등 1 개.

가능한 한 객체 지향적으로 프로그램을 만들고 싶습니다. 따라서 내 계층 구조는 다음과 같습니다.

최상위 계층은 추상 클래스 Item (이름, 가격)입니다. 그러면 SaleTaxItem 클래스 (세금 10 %를 지불해야하는 항목)를 갖게되고 NonSaleTax 항목 클래스가 Item에서 확장됩니다. 문제는 위의 각 클래스 안에 isImported라는 부울 변수를 만들어서 5 % 더 청구 할시기를 알아야한다는 것입니다. 또는 가져온 항목에 대한 새 클래스를 만들어야합니까?

디자인이이 과제에서 매우 중요하므로 완벽하게 만들고 싶습니다. 감사!

+1

왜 그냥 방법을'쓸 경계가 될 수 getTax()? 10 % + 10 % + 5 %의 수입 관세가 부과 될 수있는 품목은? 부울 값은 확장 성이 좋은 선택이라고 생각하지 않습니다. 언젠가 우리가 새로운 세금을 도입했다고 상상해보십시오 : 새로운 부울을 도입해야합니까? int로 인코딩해야합니까? –

+0

예. getTax()를 사용하여 현재 부울 값을 사용하여 5 % 수입세를 부과할지 여부를 결정합니다. 그리고 Item 클래스에서 is_import boolean을 구현합니다. 내가 부울을 사용하지 않는다면 무엇을 사용해야합니까? –

답변

2

상속을 사용하는시기와 사용하지 않는시기에 대해 많은 논의가 있습니다. 이 경우 이 아니며은 상속을 사용하여 아이템을 모델링합니다.

왜? 실생활에서 이러한 세금 및 관세 규정은 시간, 공간 (예 : 현재 상태)과 실행중인 회사의 유형에 따라 자주 변경되기 때문에. 지방 정부와 연방 정부가 규정을 바꿀 때마다 클래스 계층을 변경해야한다면, 이미 업데이트 된 클래스에서 인스턴스가있는 클래스가 변경됩니다.

또 다른 고려 사항 : 클래스를 사용하여 판매에 세금 및/또는 관세를 (효과적으로) '태그 지정'하면 태그가없는 인터페이스가있는 항목으로 끝나고 일부는 다중으로 상속됩니다. 네 가지 수업이 필요합니다. 몇 가지 추가 규칙을 추가하면 클래스 폭발이 있습니다 (고려해야 할 세금/임무의 수를 계승).

대체 구현은 항목에있는 세금 및 임무의 징표 인 속성을 갖는 것입니다.

  • 이 문자열 세금
  • 세금 : :

  • 두 번 이름 : 그래서 당신은 두 개의 클래스, :

    • 항목

      • 목록을 가지고 퍼센트를

    세금에는 SalesTax 및 ImportDuty와 같은 여러 글로벌 인스턴스가 있습니다. 그런 다음 항목에 목록에 0 개, 1 개 또는 2 개의 세금 인스턴스가 있으며 목록에 세금이 적용된다는 의미입니다.

    enter image description here

    이 두 가지가 있습니다

    이 마지막 접근 방식은 또한 장차 검증 나는 개선 제안이 새로운 세금

    숙박 편집의 추가 포함, 세금 변화를 훨씬 더 다이어그램에 'wings':

    1. AbstractItem 계층 구조, Item 및 i ts taxes
    2. TaxOrDuty 계층 구조 및 TaxAssessor의 알고리즘. TaxedItem 의해 모델링 된 각각의 층 -

    AbstractItem 세금 층의 상품 포장, 아이템에 decorator pattern을 이용한다. 가장 바깥 쪽 레이어는 적용 가능한 모든 세금으로 포장 된 아이템이며, 데코레이터 패턴을 사용하면 비정상적인 가격을 제외하고 Item처럼 보이고 작동합니다.

    • getPrice() : :이 AbstractItem는 여러 가지 유용한 방법이 있습니다
    • getAllTaxes은() 항목의 전액 반환 빈 목록으로 이동을하고, 방법은 TaxOrDuty 인스턴스를 수집 장식을 통해 재귀.
    • getUntaxedItem() : 반환하는 Item을 찾을 때까지 꾸미기를 반복합니다. 이렇게하면 데코 레이팅 된 Item에서 원시 Item을 쉽게 검색 할 수 있습니다.

    세금 측면에는 일반적으로 세금의 추상적인 행동을 모델링하는 TaxOrDuty 클래스가 있습니다. 이 순진한 구현에서는 모든 세금에 일정한 세율이 적용되지만,이 세 가지 비율을 FlatRateTax 클래스로 쉽게 푸시 할 수 있습니다. 그 방법은 다음과 같습니다

    • getRate() : 세금 또는 의무 속도을 반환 추상 방법.
    • computeTax() 메서드는 항목을 가져 와서 getRate()를 기반으로 세금을 계산합니다.
    • isApplicable()은 세금이 해당 Item에 적용 가능한 경우 true를 반환하는 추상 메서드입니다. SalesTax (항상 true를 반환) 및 ImportDuty (Item.isImported를 반환)

    TaxAssessor는 적용 가능한 세금 할당을 조정하는 클래스입니다. 모든 TaxOrDuty 인스턴스의 목록을 포함합니다 (이 경우 SalesTax 인스턴스 하나와 ImportDuty 인스턴스 하나). 이 메소드는 applyTaxes (Item) 메소드를 호출하여 isApplicable()을 호출한다.사실 반환하는 모든 TaxOrDuty를 들어, TaxAssessor는 (물론 TaxOrDuty를 참조) TaxedItem의 새 인스턴스 항목을 래핑 :

    AbstractItem applyTaxes(Item item) { 
        taxed = item; 
        for (TaxOrDuty td : taxes) { 
          if (td.isApplicable(item)) { 
           taxed = new TaxedItem(td, taxed); 
        return taxed; 
    

    그래서 전체 답변이 될 것입니다 뭔가 같은 :

    Item item = new Item("Book", 10.0, false); // New $10 book, not imported 
    AbstractItem withTaxes = taxAssessor.applyTaxes(item); 
    double taxedPrice = withTaxes.getPrice(); 
    List<TaxOrDuty> applicableTaxes = withTaxes.getAllTaxes(new List<TaxOrDuty>()); 
    

    이 모델의 주요 장점은 다음과 같습니다

    • 새로운 세금 플러그
    • 세금 평가 및 계산 알고리즘입니다 오히려 항목에 비해 세금의 일부이기 때문에 매우 복잡한 세금 (나에게)
    • 책임은 분명 자신의 클래스에 독립적으로 정확하게 모델링하고 명확하게
  • +0

    과세 대상 품목을 식별 할 수 있습니까? 예를 들어, 새 Item을 만들고 생성자에 "초콜릿"이라는 이름을 입력하면 생성자는 초콜릿이 음식임을 인식하고 세금을 세금에 부과합니다. –

    +1

    @CharlieVictor :이 질문에 답하는 훨씬 향상된 모델로 답변을 업데이트했습니다. –

    관련 문제