2011-06-15 43 views
1

我有一個Product對象。產品在不同的地點/場合以不同的稅率徵稅。 部分產品根本不需要納稅(例如:醫藥)OOPs:針對以下情況建議設計

例如,購買產品可能會在A店購買$ X,在B店購買$ Y。它在兩個不同的州可以有不同的成本(州稅是不同的)。

我的問題是,我們可以有屬性來確定產品對象本身的稅收。

例如它是一個好主意,有屬性,如

    Boolean isImported ; 
        Boolean isTaxable ; 

或者我們有更好的設計模式來做到這一點?

回答

3

首先,我相信這個問題沒有單一的,很好的答案。

您可以通過屬性來確定Product中的稅額。但是,我建議有一個單獨的類(TaxCalculator?),根據其來源,類型,交易等計算Product的稅額。動機是Product應該僅代表產品數據;爲什麼要一瓶酒護理分配給它什麼稅?還有些東西應該這樣做,這是專門用於根據產品計算稅款的東西。

但這只是我的看法,我並不認爲它是最好的。我想聽聽一些更有經驗的用戶。

1

你當然可以把這些屬性放在Product類中。

或者你可以創建一個單獨的接口(TaxStrategy?),將採取Product並返回一個Money稅額:

public interface TaxStrategy { 
    Money calculateTax(Product p); 
} 

這樣,你可以有不同的方式計算稅款接口的不同實現。產品不需要知道他們是應稅的。它將您銷售的東西與您定價的方式分開。

+0

它是否像戰略模式? – vinoth 2011-06-15 09:42:54

+0

我選擇的班級名稱無疑表明了這一點。答案會改變你對這個建議的感覺嗎? – duffymo 2011-06-15 09:51:10

+0

我的問題是,即使我有一個類似於上面建議的界面的界面,我仍然會傳遞產品,並且產品必須包含一些關於(例如)是否已導入或應稅等信息? – vinoth 2011-06-15 09:53:05

2

產品無需瞭解稅。稅收在邏輯上與銷售有關,產品價格也是如此。在我們的應用程序中,我們有以下(簡化):

public class Invoice { 
    private InvoiceItem[] invoiceItems; 
} 

public class InvoiceItem{ 
    private ProductPrice productPrice; 
    private BigDecimal taxRate; 
} 

public class ProductPrice{ 
    private Product product; 
    private BigDecimal price; 
    private String currencyCode; 
} 

public class Product{ 
    .... 
}