[答疑]商品的規格是不是應該建模為值對象

  • 2019 年 10 月 6 日
  • 筆記

阿華 2018-11-28 21:59

諮詢下各位,商品的規格是不是應該建模為值對象?這樣對他們的增刪不會影響到其他地方。比如一個酒品有200ml,500ml兩種規格,管理員後來改成了500ml和700ml,為了不影響之前發的貨,我做一個規格庫的值對象表,然後各個商品動態的去引用這些規格。這樣做可以嗎?

潘加宇:

強行劃分實體和值對象意義不大。 分析設計的建模,是要如實反映領域內涵,這樣系統才可以隨着領域規律的變化而變化,此時變化的成本最小。所有的出發點必須是領域事實如何,而不是賣弄技巧。

天文學上地心說、日心說的例子(百度百科): /* 地心說中的本輪——均輪模型,畢竟是托勒密根據有限的觀測資料拼湊出來的,它是通過人為地規定本輪、均輪的大小及行星運行速度,才使這個模型和實測結果取得一致。但是,到了中世紀後期,隨着觀測儀器的不斷改進,行星的位置和運動測量越來越精確,觀測到的行星實際位置同這個模型的計算結果的偏差,就逐漸顯露出來了。 但是,信奉地心說的人們並沒有認識到這是由於地心說本身的錯誤造成的,卻用增加本輪的方法來補救地心說。起初這種辦法還能勉強應付,後來小本輪增加到80多個,但仍不能滿意地計算出行星的準確位置。這不能不使人懷疑地心說的正確性了。到了16世紀,哥白尼在持日心地動觀的古希臘先輩和同時代學者的基礎上,終於創立了"日心說"。 */ 對象就是對象,它的屬性值都是會變化的。

以商品規格為例,假設有這麼幾個屬性:名稱、標準單價、規格(這個規格應該是隨着商品類別的不同而改變的,具體如何表達這樣的模型,看我們的分析模式幻燈片,在此先假設只經營一種商品:瓶裝酒,那麼可能需要關注的屬性還有酒的成分、度數、保質期)。隨着時間的推移,每一項都有可能單獨變化,名稱過時或犯忌要改,價格要改,成分不允許加某添加劑了,度數按新標準標註了,保質期也重新計算了…… 某個系統的模型只能映射這個領域的一部分,在力所能及的範圍內映射該映射的部分就可以了。 應對這種情況的一種做法是針對特別需要關注的視圖另外加快照類。如果購買合同特別在意的可能是酒的容量(我就買200ml那種,買1000瓶),也可能是酒的名稱(老名字的酒有收藏價值啊,把沒改名之前的酒拿出來炫耀或轉手效果不一樣),把需要在意的屬性都記錄下來。這個快照是有時間屬性的,所以不會變化。注意:不會變化是因為領域知識決定,而不是說"我設定它為值對象,所以它不能變"。 如果要更充分地記錄歷史,可以針對"商品的某個屬性發生變化"這個領域事實建模,也就是說,為對象建立不同的版本,或者記錄對象所有的屬性值變化。 可以看《軟件方法》第8章。

另外,屬性不只是基本類型的屬性,名稱(string)等等,和其他對象的關聯也是對象的屬性,只不過類型是另一個類。

很多時候我們是關注商品規格的狀態的,例如:

這個狀態之所以變化,就是因為關聯到的庫存對象發生了變化。

包括商品類別都有可能變化,例如政府禁酒了

根本原因是該"物品類別"對象和一個"禁售"對象關聯上了,只不過很多時候不關注"禁售"的細節,沒有顯式表達出來。