2009-08-12 120 views
0

我正在爲一個應用程序的新領域模型工作,該應用程序將爲內置的項目進行訂單處理(無論如何,這個問題也保持簡單)。我有一個類「VendorItem」代表可以訂購的物品。最初,「Order」類將有一個與之相關的VendorItem列表,但到目前爲止我遇到過這個問題。架構:維護訂單歷史

假設系統已經創建了一段時間的訂單就好了。有一天,用戶來了,並決定一個vendoritem已經改變了價格或其他一些細節,如包裝尺寸。我不希望以前的訂單受到這種變化的影響。

首先,我打算創建一個基本上是「VendorItem」類的副本的「OrderLine」類,但這只是在OO意義上感覺(味道?)錯誤。

有沒有更好的方式來重構這個,所以我沒有的類和信息的副本域模型?

+0

注意:在我們的開發週期中,我們忽略數據庫,直到域模型完成以允許明確分離關注點。 – 2009-08-12 23:07:14

回答

-1

是的,你可以使用「樣板」,無論如何,你的想法是你有一個物品代表你的物品,溜冰鞋或其他物品的「產品」,那麼你有這個物品組成的一些定價對象或什麼的, foreach訂單讓你指定一個定價對象,所以現在當你改變一個價格或者某種類型的東西時,你只需要爲你的Item對象分配一個新的價格對象(使用不同的參數),這樣你只有1個類代表每個O對的物品,並且您有一個價格對象,用於定義該物品具有的價格和特徵(以表示可能隨時間變化的屬性)。在這種情況下的樣板是Item,因爲它有點像模板,並且它永遠不會改變,並且您可以使用您的Price對象(在給定示例中)自定義

+0

我不同意這個解決方案,因爲那時你會將定價作爲一個獨立的對象(和你的數據庫中的表格)存在,因爲定價只與產品相關。此外,其他信息可能會更改產品,標題,說明,顏色等更新產品項目的信息,現在不知道更新之前的內容,並且無法再輕鬆跟蹤更改。當標題是「Superfantastical ProductX」或者它變成了「ProductX」時,這個人是否購買了這個?看到我的答案更詳細。 – 2009-08-12 21:31:00

0

過去,我創建了「變體」類。賣方項目包含「變體」變體可以是T恤尺寸或內衣風味。每種變化都有它自己的價格,這樣你就可以製作巧克力內褲比草莓更貴。 OrderLine類具有訂單,變體,數量和價格的參考。您在OrderLine中保留價格,以便以後可以更改變體的價格而不影響審計程序。然後,而不是編輯現有的項目,你可以簡單地添加一個變化,並把舊的爲「不活動」

我有沒有告訴太多的家族企業?

0

IMO你應該這個主要由你的數據庫處理。每一個你稱之爲VendorItem的產品都有一個PK和一個有效的開始(不允許爲null)和有效的結束日期(可能爲null,以處理當前直到停止使用)以及關於該項目的所有相關信息。

在您的訂單表,你應該有相關的0到許多訂單ID與包含外鍵,它當時出售的VendorItem記錄一個客戶ID。

這樣,您就可以跟蹤從未作出您的產品線的所有更改,並允許價格的變化,說明變化等對銷售的影響很容易容易分析。

裏面的代碼幾乎沒有,除了訂貨過程中甚至會改變/查看物品處理你從產品表中獲取當前項目。

+0

域模型將是持久性的無知,所以它不可能爲數據庫設計。 – 2009-08-12 22:58:04

+0

雖然...我可以看到這個更小的系統,如在線訂購產品。 – 2009-08-12 23:05:09

+0

我的答案完全符合PI解決方案。正如我所提到的,你需要有對象之間的關係。 – 2009-08-13 16:42:36

1

我覺得它更容易先介紹你知道的一切有關的項目,因爲他們真的存在,而不是作爲類。然後找出信息層次結構,然後弄清楚如何用類進行建模。

例如: 產品是您從一個或多個供應商處購買的產品,通常由UPC(通用產品代碼 - 註冊的條形碼)定義。

供應商通常也有一個內部ID號,通常稱爲供應商產品編號(VIN)。

一個項目可以有不同的大小和顏色,都具有相同的UPC - 但不同的VIN可能與不同的費用:

T-Shirt UPC 9055540022 
VIN: 40001 - Large, White - $5.00 
VIN: 40002 - Small, White - $4.00 
VIN: 40003 - Large, Green - $5.00 
etc. 

和這些項目的成本/ VIN的會隨時間而改變。

訂單是在給定時間點的物品及其成本列表,因此您的訂單信息需要包括有關訂單上物品的成本和任何其他可變信息。

因此,如果該項目UPC是在您的信息層次的頂部:

Item - 1 record per item - Descriptive info, UPC 

Vendor - 1 record per vendor - Vendor info 

VendorItemVin - 1 record per Vendor/Item/VIN - Vendor specific info, size/color/cost etc. 

然後你就可以得到一個想法的數據庫表應該是什麼樣子,然後制定出的類。

+0

這是一篇內容豐富的文章,但這真的沒有回答OP如何處理項目版本的問題。您需要在這種情況下過期VIN#以處理歷史記錄。 – 2009-08-12 21:34:38

+0

然後要求每個物品有1到多個VIN#s。 – 2009-08-12 21:35:57

+0

現在我們在舊版本中使用的方法與此類似,但我們仍然遇到版本問題。我們現在面臨的問題是用戶改變關係的「項目」方面。我們可以鎖定這個以便他們不能改變它,但這不是一個現實的選擇。理想情況下,我們希望供應商項目永不改變,庫存項目永不改變的情況,但我們也不能這樣做。 – 2009-08-12 23:02:56