|
英文原文:The Seven Information Smells of Domain Modelling
領(lǐng)域建模(Domain modelling )作為一項(xiàng)強(qiáng)大的技術(shù),常備于很多IT專業(yè)人士的工具箱之中。令人遺憾的是,在過(guò)去的幾年間,因?yàn)轭I(lǐng)域建模的幾個(gè)問(wèn)題導(dǎo)致人們對(duì)其大失所望,尤其是在敏捷領(lǐng)域。這種方式的兩個(gè)切實(shí)存在的問(wèn)題就是:它會(huì)消耗太長(zhǎng)的時(shí)間并且很易于導(dǎo)致“分析癱瘓(analysis paralysis”),而這會(huì)導(dǎo)致停滯(“spinning wheels”)。我們?yōu)轭I(lǐng)域建模提供了一種方式,可以用來(lái)解決這些問(wèn)題。
我們會(huì)討論領(lǐng)域模型中的一些信號(hào),這些信號(hào)會(huì)告訴你要提出更多的問(wèn)題。我們將這些信號(hào)稱之為“壞味道信息(information smells)”,它們會(huì)提醒我們可能并沒有完全理解領(lǐng)域模型所關(guān)注的信息。這些壞味道可能意味著我們?cè)陬I(lǐng)域模型中丟失了信息或者領(lǐng)域模型中包含了不正確的信息。關(guān)注于壞味道信息會(huì)引導(dǎo)我們發(fā)現(xiàn)需要回答的問(wèn)題,這是一個(gè)很快的過(guò)程。當(dāng)所有的壞味道都消失掉或者能夠確認(rèn)剩余的都是可接受的,我們就會(huì)停止,這會(huì)避免分析癱瘓。
這個(gè)過(guò)程開始于系統(tǒng)的輸出,這些輸出會(huì)為用戶交付價(jià)值。我們?cè)诒疚闹胁粫?huì)闡述如何尋找這個(gè)價(jià)值。接下來(lái),我們基于輸出來(lái)處理模型中的這些壞味道信息。
為了闡述本文中的信息壞味道,我們會(huì)使用一個(gè)虛擬的例子,這個(gè)例子來(lái)源于多個(gè)現(xiàn)實(shí)生活中的場(chǎng)景。我們的人力資源主管想了解各種開發(fā)人員的薪酬是如何支付的,這樣他們就能避免在不同群體間進(jìn)行不公正的支付所導(dǎo)致的法律糾紛。
在隨后進(jìn)行的討論中,團(tuán)隊(duì)試圖理解主管的要求時(shí),產(chǎn)生了如下的草圖:
領(lǐng)域建模最好的工具就是筆和紙或者記號(hào)筆和索引卡片或者白板筆和白板,因?yàn)樗鼤?huì)將關(guān)注的焦點(diǎn)放在要交換的信息上,而不是試圖將樣例或模型變得“看上去很漂亮”。也就是說(shuō),為了防止我們凌亂的筆跡讓您暈頭轉(zhuǎn)向,我們使用圖形化工具來(lái)創(chuàng)建了模型。因此,以下就是這個(gè)樣例的更整潔版本:
關(guān)于壞味道信息以及它們對(duì)領(lǐng)域模型所反映出來(lái)的內(nèi)容,有很重要的幾點(diǎn)需要我們記?。?/p>
- 壞味道信息并不一定表明就是一個(gè)問(wèn)題。
- 壞味道信息是可能存在問(wèn)題的強(qiáng)烈信號(hào)。
- 壞味道信息并不像規(guī)則那樣具有強(qiáng)制性,規(guī)則通常都是正確的。
- 對(duì)于壞味道信息所反映出的問(wèn)題應(yīng)該按照“請(qǐng)給我一個(gè)……的例子”的形式來(lái)進(jìn)行闡述,而不是“告訴我如何……”的形式。我們會(huì)探索領(lǐng)域細(xì)節(jié)的樣例而不是對(duì)模型進(jìn)行泛化(generalisation),從而對(duì)細(xì)節(jié)進(jìn)行隱藏。
閑言少敘,以下就列出了主要的壞味道信息。如果你發(fā)現(xiàn)了其他的場(chǎng)景,請(qǐng)告訴我們以便讓更多的人知道。
- 某個(gè)條目在輸出中,但是不在模型之中。
- 某個(gè)條目在模型之中,但是不在輸出中。
- 兩條信息位于同一個(gè)地方。
- 某個(gè)實(shí)體與任何其他的實(shí)體都沒有關(guān)聯(lián)。
- 一對(duì)一關(guān)系。
- 多對(duì)多關(guān)系。
- 未定義的功能。
以下更為詳細(xì)地描述了每一種壞味道信息。
壞味道信息#1 – 某個(gè)條目在輸出中,但是不在模型之中。
輸出中的所有條目都需要存在于領(lǐng)域模型之中。輸出只是對(duì)模型中數(shù)據(jù)的展現(xiàn)。輸出中展現(xiàn)的每條信息都應(yīng)該是模型中的一個(gè)屬性或方法。在上面的例子中,模型中缺失了部門、平均工資、角色、工資、性別以及種族。為了消除這個(gè)壞味道,將它們作為屬性或方法添加進(jìn)來(lái)。如果缺失添加這些信息的合適實(shí)體,那需要添加實(shí)體。
壞味道信息 #2 – 條目在模型中,但是不在輸出之中。
條目位于模型之中,但是并不在輸出中是分析過(guò)程里面“推(push)”的一個(gè)例子。分析師認(rèn)為它們需要這個(gè)值,而實(shí)際上卻并不是這樣。他們將值推到了模型之中。這會(huì)是比較危險(xiǎn)的,因?yàn)槟阕罱K可能需要額外的開發(fā)來(lái)添加和維護(hù)這個(gè)值。但這是一種壞味道,它可能會(huì)被添加進(jìn)來(lái)因?yàn)榉治鰩熡X得它是有用的。為了解決掉這種壞味道,我們需要問(wèn)一下用戶是否需要這個(gè)信息。注意,對(duì)于分析師來(lái)說(shuō)這是過(guò)程的一種分解,因?yàn)樗麄冃枰獙?duì)用戶的問(wèn)題記錄在問(wèn)題日志中,而不是在模型之中。這種情況可能會(huì)發(fā)生在這樣的場(chǎng)景之中,另外的一個(gè)項(xiàng)目需要一些信息,因此它就“悄然引入(slip)”到需求中來(lái)了。這些額外的需求應(yīng)該作為單獨(dú)的一項(xiàng)任務(wù)來(lái)處理。
在結(jié)構(gòu)化系統(tǒng)分析與設(shè)計(jì)方法(Structured Systems Analysis and Design Method,SSADM)中,這被稱之為“信宿(Information Sink)”。
壞味道信息 #3 – 兩條信息位于一個(gè)地方(1NF)
將兩條信息放在一個(gè)地方會(huì)引起混亂。名字“John Smith”可以按照名和姓進(jìn)行存儲(chǔ)。但是,這是一種壞味道。在一些場(chǎng)景之中,將名字存在一個(gè)地方是合適的,但在另一些場(chǎng)景中卻不是這樣。關(guān)鍵的問(wèn)題在于,你是不是需要獨(dú)立地分析或處理這兩個(gè)信息條目。通常情況下,這被稱之為違反“第一范式(First Normal Form)”或1NF。盡管1NF確實(shí)是一項(xiàng)設(shè)計(jì)規(guī)則,但是它也可以指導(dǎo)我們發(fā)現(xiàn)兩條不同數(shù)據(jù)的實(shí)際指向是同一個(gè)。違反第一范式通常會(huì)通過(guò)查看真實(shí)的數(shù)據(jù)來(lái)識(shí)別,因?yàn)閿?shù)據(jù)一般會(huì)借助名字來(lái)進(jìn)行引用。另外一個(gè)樣例就是種族(Race),它包含了“Jedi”(一個(gè)信仰/宗教)以及“IC1”(英國(guó)警方所使用的種族分類)。
壞味道信息#4 – 沒有關(guān)聯(lián)
系統(tǒng)中的業(yè)務(wù)對(duì)象應(yīng)該是連接起來(lái)的。當(dāng)你無(wú)法識(shí)別兩個(gè)業(yè)務(wù)對(duì)象之間的關(guān)系時(shí),你需要詢問(wèn)用戶一個(gè)重要的問(wèn)題:這兩件事之間的關(guān)聯(lián)是什么?是直接關(guān)聯(lián)嗎?還是通過(guò)其他的事情?
這是一個(gè)很嚴(yán)重的壞味道。根據(jù)經(jīng)驗(yàn)判斷,這通常會(huì)導(dǎo)致信息的丟失。在企業(yè)級(jí)系統(tǒng)中,缺失的通常是組織化的結(jié)構(gòu)。
壞味道信息 #5 – 一對(duì)一關(guān)系,它們是不是同一件事?
當(dāng)你遇到一對(duì)一關(guān)系時(shí),通常會(huì)有兩種可能的解釋。第一,業(yè)務(wù)人員用多個(gè)術(shù)語(yǔ)表達(dá)相同的事情,因此兩個(gè)業(yè)務(wù)對(duì)象實(shí)際上應(yīng)該是一個(gè)對(duì)象。第二,一對(duì)一關(guān)系實(shí)際上應(yīng)該是一對(duì)多關(guān)系,但是你并不知道原因。例如,汽車和司機(jī)可能是一對(duì)一的關(guān)系,但是當(dāng)你深入挖掘的時(shí)候,你會(huì)發(fā)現(xiàn)同一時(shí)間一輛汽車只能由一位司機(jī)進(jìn)行駕駛。眾多的司機(jī)可以在不同的時(shí)間駕駛同一輛汽車。這里缺失的信息就是關(guān)系的暫時(shí)性特征。
壞味道信息 #6 – 多對(duì)多(缺失信息)
多對(duì)多關(guān)系有時(shí)候會(huì)表達(dá)合理的關(guān)系。但大多數(shù)的時(shí)候,它們表明缺失了“連接的(link)”業(yè)務(wù)對(duì)象。在關(guān)系型軟件設(shè)計(jì)中,多對(duì)多關(guān)系會(huì)用連接實(shí)體(link entity)來(lái)取代。連接實(shí)體通常也是一個(gè)業(yè)務(wù)對(duì)象,它具有關(guān)于關(guān)系本身的信息。在上面的例子中,一個(gè)雇員在不同的時(shí)間里面(暫時(shí)性的)會(huì)有多個(gè)工作頭銜或者他們會(huì)將自己的時(shí)間花費(fèi)在多個(gè)角色上。再次強(qiáng)調(diào)一遍,這種壞味道信息會(huì)幫助我們跟蹤潛在的信息缺失。
壞味道信息 #7 – 未定義的功能(缺失信息)
模型中的每個(gè)方法都應(yīng)該進(jìn)行定義。方法中引用的任何事情都應(yīng)該在業(yè)務(wù)模型之中。以getAge為例:
getAge按照年份來(lái)計(jì)算年齡:
getAge = (today() – Employee.date of birth) / 365
出生日期和獲取當(dāng)前日期的功能缺失了。它們應(yīng)該被加到業(yè)務(wù)模型之中。
總結(jié)一下,過(guò)程是這樣的:
- 識(shí)別會(huì)給用戶交付價(jià)值的輸出。
- 如果你還沒有支持這個(gè)輸出的領(lǐng)域模型,那就創(chuàng)建一個(gè)。
- 檢查模型中的壞味道信息,直到它們不再存在。
- 停止。
這種方式會(huì)比傳統(tǒng)的領(lǐng)域建??斓枚嗖⑶腋訉W?。你采用領(lǐng)域建模卻不會(huì)陷于“停滯(spinning your wheels)”的狀態(tài)會(huì)令你的朋友感到吃驚的。
側(cè)邊欄(Sidebar) - 領(lǐng)域模型
領(lǐng)域模型是組織中某個(gè)方面的簡(jiǎn)化,可能是產(chǎn)品、運(yùn)作或者是市場(chǎng)。領(lǐng)域模型是特定于組織及其工作方式的。盡管模型可能會(huì)使用業(yè)界標(biāo)準(zhǔn)的術(shù)語(yǔ),但是模型會(huì)為特定的組織及其環(huán)境創(chuàng)建明確的詞匯表。領(lǐng)域模型通常會(huì)描述從事這項(xiàng)業(yè)務(wù)的人所關(guān)心的信息。鑒于大多數(shù)的業(yè)務(wù)系統(tǒng)主要關(guān)注于收集、處理以及提供數(shù)據(jù),所以可以順理成章地說(shuō),了解信息是什么并且以一種清晰的方式來(lái)對(duì)信息進(jìn)行分類是很重要的。一般來(lái)講,領(lǐng)域模型包含業(yè)務(wù)實(shí)體,而業(yè)務(wù)實(shí)體會(huì)關(guān)聯(lián)數(shù)據(jù)和行為。業(yè)務(wù)實(shí)體之間的交互通常也會(huì)進(jìn)行聲明。領(lǐng)域建模的示例包括實(shí)體—關(guān)系模型以及對(duì)象模型。
側(cè)邊欄 - 所使用的例子
我們從HR主管想要得到的報(bào)告開始。
壞味道1—某個(gè)條目在輸出中,但是不在模型之中。
我們有一些條目在輸出中,但是并不在模型中,所以我們將這些條目添加到模型里面。
注意一下平均工資是基于其他數(shù)據(jù)計(jì)算出來(lái)的,所以將其稱之為getAverageSalary以提醒我們這是一個(gè)計(jì)算所得的屬性。
壞味道 2 – 某個(gè)條目在模型中但是不在輸出之中。
有些人沒有管住自己將Birthday添加到Employee之中了。
我們?cè)儐?wèn)HR主管是否需要在報(bào)表中包含Birthday。他們的回答是“不需要”,但是他們想要在報(bào)表中包含“Age”。
壞味道 3 – 兩條信息位于同一個(gè)位置
名字由名和姓組成。我們?cè)儐?wèn)HR主管是否想要將其分開,這樣的話他們就能看到具備相同姓的所有人(姓可以用于識(shí)別文化群體)。他的回答是并不想這樣。
壞味道 4 –某個(gè)實(shí)體與其他的所有實(shí)體都沒有關(guān)聯(lián)
模型中所有的實(shí)體必須是連接起來(lái)的。我們?cè)儐?wèn)業(yè)務(wù)方面的專家實(shí)體要直接關(guān)聯(lián)還是要通過(guò)其他的實(shí)體進(jìn)行關(guān)聯(lián)。例如,雇員是與部門直接關(guān)聯(lián),還是雇員與團(tuán)隊(duì)關(guān)聯(lián),而團(tuán)隊(duì)再與部門關(guān)聯(lián)。
壞味道 5 – 一對(duì)一關(guān)聯(lián)
一對(duì)一關(guān)聯(lián)是一種壞味道,所以針對(duì)這種關(guān)系我們要詢問(wèn)相關(guān)的專家。我們并不是直接問(wèn)雇員和部門之間的關(guān)系是什么,因?yàn)檫@只會(huì)得到通用的情況。相反,我們應(yīng)該這樣問(wèn),“你能給我某位員工屬于多個(gè)部門的例子嗎”以及“你能給我某個(gè)部門的員工多于一個(gè)人的例子嗎”。
嚴(yán)格使用這種技術(shù)可能會(huì)問(wèn)出一些看起來(lái)很愚蠢的問(wèn)題,但是這些問(wèn)題實(shí)際上是很有價(jià)值的。“你能給我某位雇員有多個(gè)性別或多個(gè)種族的例子嗎”。通過(guò)這些問(wèn)題識(shí)別出來(lái)的人很可能正是那些遭受歧視和偏見的人。
我們保持這些問(wèn)題一直是開放的,直到找到某個(gè)樣例為止。它們會(huì)作為系統(tǒng)可能會(huì)發(fā)生變化的風(fēng)險(xiǎn)指示器。
壞味道 6 – 多對(duì)多關(guān)系
多對(duì)多關(guān)系可能意味著信息的丟失。我們?cè)儐?wèn)相關(guān)的專家可能丟失的信息是什么。在本例中,雇員的時(shí)間被分配到了兩個(gè)或更多的部門之中。
在角色、性別以及種族方面,相關(guān)的專家并沒有想出任何有額外價(jià)值的信息。所以壞味道信息將依然作為開放性的問(wèn)題,它們指示了一種變化的風(fēng)險(xiǎn)。
一個(gè)專業(yè)的網(wǎng)站通過(guò)建立七種分類(male、female、male pre-op female、female pre-op male、male post-op female、female post-op male、inter-sex)解決了性別中的多對(duì)多關(guān)系。缺失的信息可能是某個(gè)人決定要做手術(shù)的日期,或者他們何時(shí)做的手術(shù)以及這些事情隨后怎樣影響工資增長(zhǎng)和獎(jiǎng)金。.
壞味道 7 – 未定義的功能
我們?cè)儐?wèn)相關(guān)的專家如何計(jì)算getAverageSalary以及getAge。
這會(huì)導(dǎo)致將allocation.cost和employee.dateOfBirth的值加入到模型之中。
現(xiàn)在已經(jīng)沒有未處理或決定延遲處理的壞味道了。我們可以就停止領(lǐng)域建模了。
關(guān)于作者
Chris Matts是一位敏捷實(shí)踐者,他會(huì)做所有必要的事情。因此,他擔(dān)當(dāng)?shù)慕巧?xiàng)目管理人員、業(yè)務(wù)分析師、測(cè)試人員甚至開發(fā)人員(盡管在這方面他做得實(shí)在不好)。盡管在過(guò)去二十多年的經(jīng)驗(yàn)中,他主要在為投資銀行構(gòu)建交易和風(fēng)險(xiǎn)管理系統(tǒng),但是他目前擔(dān)任Microsoft Skype部門在企業(yè)級(jí)級(jí)別采用敏捷和Real Option的教練。Chris的第一個(gè)碩士學(xué)位是微電子和軟件工程(Microelectronics and Software Engineering)專業(yè)的,而第二個(gè)碩士學(xué)位是數(shù)學(xué)交易和金融專業(yè)(Mathematical Trading and Finance)的。除了Olav Maassen以及Chris Geary,他還會(huì)出版一本關(guān)于業(yè)務(wù)的圖形化小說(shuō),將其稱之為“Commitment”。“Commitment”是關(guān)于項(xiàng)目風(fēng)險(xiǎn)管理的故事。
Kent J. McDonald幫助很多的組織提高了項(xiàng)目的有效性。他超過(guò)15年的經(jīng)驗(yàn)包括擔(dān)任業(yè)務(wù)分析師、戰(zhàn)略管理、項(xiàng)目管理以及多種行業(yè)的產(chǎn)品開發(fā),這涉及到金融服務(wù)、健康保險(xiǎn)、績(jī)效營(yíng)銷、人力資源服務(wù)、非盈利組織以及汽車行業(yè)。他是“Stand Back and Deliver: Accelerating Business Agility”的合作者,目前為B2T Training提供業(yè)務(wù)分析培訓(xùn)并且在BeyondRequirements.com站點(diǎn)上分享他在項(xiàng)目有效性方面的想法。
it知識(shí)庫(kù):領(lǐng)域建模中的七種壞味道信息,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。