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