2010-02-15 136 views
3

我有兩種類型的產品 - 折扣(10%光盤)和NonDiscounted(0%),每一種可以是LocalProduct/ExportableProduct與出口一個吸引了15%的銷售稅。OO設計問題

什麼是這個場景模型的最佳途徑。 我是絕對新手,S/W的設計,我有非常有限的想法 1.有4個不同的產品分種類 2.使用策略模式,並有4個不同的策略。

能有人請建議我如何能有效地通過上述方式或其他的建模。

+0

我學得越多似乎戰略模式/構成與繼承/開放 - 封閉原則相比,在幾乎所有不涉及類型替換(LSP)的情況下,繼承的優先策略都是繼承。但後來我是一個白癡。 – Will 2010-02-15 12:25:43

+0

策略模式在那裏,您可以輕鬆地支持軟件中的未來更改(新產品類型)。如果您可以想象一種適用於您的設計的軟件「插件」用法,其中產品類型是插件,那麼Strategy是完美的。 – Fuhrmanator 2012-04-18 13:01:54

回答

0

類區分行爲集。因此,讓我們來看看你的部門在這些方面:

  • 雖然參數可以提出,貼現/不打折是行爲上的變化,是微不足道的這種降低到一個現象:所有的產品都折扣,但非折扣產品的折扣金額恰好爲0%。這只是你的產品的一個屬性(discount_amount),而不是一個單獨的類。

  • 本地/可導出可能有也可能沒有明顯的行爲。如果唯一的區別是產品是否允許國際運輸,那麼一個簡單的布爾標誌應該足以處理這種區別。另一方面,如果可出口產品需要當地產品不支持的行爲(例如,海關要求和程序的記錄),那麼將ExportableProduct作爲LocalProduct的一個子類是合適的(如果可出口產品行爲是本地超集產品行爲),或者使用LocalProduct和ExportableProduct子類(如果本地產品也具有不受可導出產品支持的行爲)生成抽象Product類。

+0

+1爲KISS和側重於行爲。 – Fuhrmanator 2012-04-18 13:03:36

1

爲了使事情變得簡單,問問自己,如果折扣真的需要一個亞型,或者它可能是產品,其中「NonDiscounted」有百分之零折扣的屬性。

0

我建議也許貼現/ NonDiscounted不應該是型號的產品都沒有。相反,有兩個子類型,以及父級產品中的「折扣」屬性/字段。每個產品都可以有效地享受折扣。這也允許不固定在10%的折扣。

1

我這樣做:

有所謂的「產品」具有類似名稱,描述,類型產品的基本屬性一類等

基地「產品」類可以有屬性稱爲「DiscountRate」。它可以爲0,非折扣和任何折扣價值。這將有助於簡化計算,因爲相同的公式將始終適用,只是在一種情況下的折扣是0.1

然後你就可以有兩班「ExportableProduct」和「LocalProduct」,他們都從「產品」類繼承。

0

我會避免繼承(即子打字)只是爲了這一點。

相反,我會定義枚舉貼現/ NonDiscounted和本地/ ExportableProduct。然後每個產品類別都會簡單地爲每個產品類型指定一個屬性。

然後,在一個單獨的類,例如:PricingCalculator,限定一個接受產品的實例的方法計算(可能靜態)。此方法僅檢查枚舉屬性並在計算中應用所需的百分比值。

這完全定價的計算,從產品本身分離,讓你隨時有時複雜的定價計算在一個位置。隨着您的定價方案隨着時間的推移而變化,這種方法易於維護和測試。

0

我會避免一切,只是有兩個屬性:discountlocal

由於只有一件事,改變了(價格),你可以計算出它的飛行(折扣=>price * .9,出口=>price * .85 - 或者當比東西根據種類而不同,即使這兩個=>出口&折扣=>price * .9 * .85

0

繼承是特別有用的。

例如,如果折扣,稅收和運輸方法根據物品的類型而有所不同,那麼現在肯定是考慮繼承和子類化的時候了(你會說「這個物品的這個子類型有這個稅和這個折扣和這個航運「)。另一方面,當只有一件事根據類型而變化時,它是否值得擁有幾種類型(即帶有子類的基類型)並不明顯,或者相反,是否可以將該差異更簡單地建模爲單個類型,其實例具有屬性值(例如,名稱爲「discount_percentage」)。

0

當這是所有你會需要,只需在你的產品分類二布爾和他們交換的行爲是最好的解決方案。 YAGNI。

但我恐怕這只是一個較大問題的一小部分。然後你必須問自己:什麼使產品成爲產品(單一責任)。可徵稅性和可折扣性可能是兩個不同的問題,所以您的產品最終有兩種策略。