如何繪制邏輯圖——要素的屬性:內(nèi)聚與解耦(6)
編輯導(dǎo)語(yǔ):邏輯圖在我們的工作中經(jīng)常會(huì)用到,一個(gè)優(yōu)秀的邏輯圖可以提高我們的工作效率;筆者在上一篇文中介紹了描述要素歸集名稱的屬性(系統(tǒng)與模塊),本文作者說明了描述要素歸屬的原則屬性,我們一起來看一下。
松耦合和高內(nèi)聚,是決定最終完成系統(tǒng)是否具有應(yīng)變性、復(fù)用性的重要設(shè)計(jì)原則,作為在分析和設(shè)計(jì)一線的需求工程師也必須要理解和掌握;因?yàn)樵谛枨蠓治龊蜆I(yè)務(wù)設(shè)計(jì)中沒有做到,那么到了后面的開發(fā)階段再考慮就晚了。
后期僅用技術(shù)手段讓系統(tǒng)獲得同等的應(yīng)變/復(fù)用能力,可能要付出很大的成本、同時(shí)系統(tǒng)可能也因此變得更加復(fù)雜;所以,松耦合與高內(nèi)聚的設(shè)計(jì),是從需求工程師的工作開始的。
屬性4:解耦與內(nèi)聚,是描述要素歸集原則的重要概念。
分層與粒度說明了要素的大?。幌到y(tǒng)與模塊說明了要素的歸集單位。下面討論形成系統(tǒng)的原則是什么。
打個(gè)比方說:將不該放到一起的要素放到了同一個(gè)盒子內(nèi),就會(huì)造成每個(gè)盒子內(nèi)的要素總會(huì)受到另一個(gè)盒子內(nèi)的要素牽扯,造成無法將盒子蓋上蓋子形成黑盒(的狀態(tài));在黑盒與白盒一篇中講到了,如果研究對(duì)象處于這樣的狀態(tài)就無法對(duì)同一層的要素進(jìn)行黑盒狀態(tài)的分析和研究。
那么什么樣的要素可以放在一起,什么樣的要素不能放在一起呢?解決這個(gè)問題需要引入解耦和內(nèi)聚的概念。
一、解耦的概念
耦合:是指兩個(gè)或兩個(gè)以上的系統(tǒng)(要素的集合體)的輸入與輸出之間存在緊密配合與相互影響,某一方的變動(dòng)會(huì)影響到另一方的變化。
解耦:指的就是解開耦合的狀態(tài),去掉兩者之間造成耦合的連接關(guān)系。
耦合有兩種狀態(tài):緊耦合、松耦合,舉例說明兩者的概念和關(guān)系。
假定某個(gè)對(duì)象的內(nèi)部是由4個(gè)子系統(tǒng)構(gòu)成的,分別為系統(tǒng)1、系統(tǒng)2、系統(tǒng)3、系統(tǒng)4。如圖1所示。
圖1 緊耦合與松耦合的示意
1. 緊耦合
從系統(tǒng)1、系統(tǒng)2、系統(tǒng)3這三者之間的關(guān)系可以看出,不同系統(tǒng)內(nèi)部的要素之間發(fā)生了密切關(guān)聯(lián),三個(gè)系統(tǒng)之間兩兩成對(duì)地形成了非常復(fù)雜的依賴關(guān)系,三個(gè)系統(tǒng)因“蓋不上蓋子”都不能形成黑盒,這種狀態(tài)就是“緊耦合”狀態(tài)。
2. 松耦合
系統(tǒng)4與其它系統(tǒng)之間的關(guān)系是非常清晰、簡(jiǎn)單的,分別只有一個(gè)接口,可以看出系統(tǒng)4 內(nèi)部的要素并不直接與其他系統(tǒng)中的要素直接關(guān)聯(lián),而是由統(tǒng)一的接口進(jìn)行關(guān)聯(lián);也就是說,系統(tǒng)4和其它和系統(tǒng)之間雖然有關(guān)聯(lián),但不是復(fù)雜的依賴關(guān)系,這種由唯一或是標(biāo)準(zhǔn)關(guān)聯(lián)形成的關(guān)系就是松耦合。
解耦,簡(jiǎn)單地說,就是將上述的“緊耦合”狀態(tài)解開,形成“松耦合”的狀態(tài)。
解耦概念說明,當(dāng)分析對(duì)象內(nèi)部的系統(tǒng)之間都是緊耦合關(guān)系時(shí),那么各個(gè)系統(tǒng)就不能在“黑盒狀態(tài)”下進(jìn)行分析設(shè)計(jì)了;因?yàn)?,各個(gè)系統(tǒng)都存在著系統(tǒng)內(nèi)要素之間的依賴關(guān)系,也不可能在不考慮這些依賴關(guān)系的前提下,將各個(gè)系統(tǒng)看成是黑盒了。
解耦概念對(duì)后續(xù)分析與設(shè)計(jì)有著非常實(shí)際的指導(dǎo)意義,比如:某個(gè)產(chǎn)品的生產(chǎn)過程在企業(yè)內(nèi)部大都是由多部門協(xié)同完成的,業(yè)務(wù)流程大多要跨部門才能完成;最佳的流程設(shè)計(jì)是部門之間的交互最少,最大限度地減少不同部門內(nèi)部工種之間發(fā)生的直接依賴,避免由于某個(gè)部門內(nèi)部某個(gè)工種的作業(yè)內(nèi)容發(fā)生了變化而引起其它部門的連鎖反應(yīng)。
二、內(nèi)聚的概念
內(nèi)聚:是說明同一個(gè)系統(tǒng)中各個(gè)要素之間的關(guān)聯(lián)性。
理想的內(nèi)聚狀態(tài),如圖2所示,對(duì)象中的每個(gè)系統(tǒng)都可以獨(dú)立地完成一個(gè)業(yè)務(wù)領(lǐng)域的工作,且各個(gè)系統(tǒng)內(nèi)部的要素之間關(guān)系緊密;也就是說,每個(gè)系統(tǒng)內(nèi)所有的要素都是為了完成同一個(gè)目標(biāo)而存在的;比如:對(duì)于財(cái)務(wù)系統(tǒng)來說,既不要把財(cái)務(wù)系統(tǒng)的功能劃分到其他系統(tǒng)中,也不將其它系統(tǒng)中的非財(cái)務(wù)功能拉入到財(cái)務(wù)系統(tǒng)中來。
內(nèi)聚的概念說明,各個(gè)系統(tǒng)內(nèi)部的要素要按照“內(nèi)聚”的標(biāo)準(zhǔn)放在一起,各個(gè)系統(tǒng)之間通過一定的接口進(jìn)行相互調(diào)用,而各系統(tǒng)內(nèi)的要素之間沒有直接關(guān)聯(lián);這樣在進(jìn)行討論時(shí)一個(gè)系統(tǒng)就可以用一個(gè)黑盒來表示。
圖2 內(nèi)聚概念的示意
內(nèi)聚的實(shí)際意義在于,在設(shè)計(jì)時(shí)讓每個(gè)系統(tǒng)具有的功能都相對(duì)獨(dú)立、單一,這樣就容易進(jìn)行拆分、并通過不同的組合靈活地滿足各種需求。
三、高內(nèi)聚與松耦合
系統(tǒng)內(nèi)要素間的內(nèi)聚程度高就稱之為“高內(nèi)聚”,系統(tǒng)間的關(guān)聯(lián)程度低就稱之為“松耦合(或低耦合)”,參見圖3的對(duì)比可以看出來,內(nèi)聚和耦合之間的關(guān)系。
圖3 高內(nèi)聚與松耦合的示意
1. 高內(nèi)聚
高內(nèi)聚的系統(tǒng)內(nèi)的功能要素要做到高度的相似聚合,共同為一個(gè)目標(biāo)服務(wù)。圖3(a)中系統(tǒng)1、2、3就沒有做到高內(nèi)聚,而是緊耦合,系統(tǒng)內(nèi)部之間的交互非常繁雜;而圖3(b)的情況就完全不同了,各個(gè)系統(tǒng)的內(nèi)部都做到了高內(nèi)聚。
2. 松耦合
在同一對(duì)象內(nèi)的各個(gè)系統(tǒng)之間要盡量做到松耦合,系統(tǒng)之間具有最小的相關(guān)度,圖3(a)中系統(tǒng)之間沒有做到,對(duì)圖3(b)內(nèi)系統(tǒng)之間實(shí)現(xiàn)了松耦合,因此圖3(b)構(gòu)造看上去就非常的干凈、舒服。
判斷信息系統(tǒng)架構(gòu)優(yōu)劣的重要原則之一就是:系統(tǒng)之間是否進(jìn)行了松耦合的設(shè)計(jì),它關(guān)系到系統(tǒng)運(yùn)行后的維護(hù)成本,而且還極大地影響到系統(tǒng)的擴(kuò)展性、對(duì)需求變化的響應(yīng)能力、甚至是系統(tǒng)的生命周期。
四、內(nèi)聚與解耦的作用
內(nèi)聚和解耦的作用,不但對(duì)于從事編碼開發(fā)的工程師重要,對(duì)于從事需求分析和軟件設(shè)計(jì)的工程師來說更為重要也不為過。
因?yàn)橥瓿梢粋€(gè)好的系統(tǒng)是從分析和設(shè)計(jì)開始,如果前期的分析和設(shè)計(jì)將業(yè)務(wù)都耦合在一起了,那么后續(xù)從技術(shù)架構(gòu)和開發(fā)層面再怎么努力,可能也挽回不了系統(tǒng)整體的緊耦合狀態(tài);或是需要花費(fèi)巨大的成本(時(shí)間、資源)才能收到很小的效果。
圖4給出了一個(gè)企業(yè)架構(gòu)的框架示意圖,這個(gè)圖是由不同的子系統(tǒng)、模塊構(gòu)成的,在繪制過程中注意了高內(nèi)聚、松耦合的設(shè)計(jì)原則,每個(gè)子系統(tǒng)、或是模塊都可以隨著需求的變化而被替換。
圖4 企業(yè)架構(gòu)的框架圖(不同系統(tǒng)的組合關(guān)系)
擴(kuò)展說明:
“功能做到模塊化、快速響應(yīng)客戶的需求變化”是軟件行業(yè)一直追求的目標(biāo),不能快速地響應(yīng)時(shí)代的變化的系統(tǒng),隨著時(shí)間的推移就失去了存在的價(jià)值。
但是很多軟件工程師并不清楚達(dá)成這個(gè)目標(biāo)與業(yè)務(wù)人員的相關(guān)性,不清楚業(yè)務(wù)人員對(duì)系統(tǒng)的模塊化設(shè)計(jì)和結(jié)果起著非常重要的作用;因?yàn)檫@些目標(biāo)的達(dá)成都需要一個(gè)非常重要前提,那就是對(duì)“業(yè)務(wù)的拆分”,首先要將研究對(duì)象拆分成為若干個(gè)小的可以獨(dú)立的要素,才可能實(shí)現(xiàn)“將一個(gè)大的系統(tǒng)分解成多個(gè)小的、獨(dú)立的功能/組件,然后通過它們的不同組合來處理復(fù)雜的、大型的、多變的問題”。
也就是說,業(yè)務(wù)人員能否將研究對(duì)象進(jìn)行有效的拆分、并給出變化的規(guī)律性是關(guān)鍵;如果業(yè)務(wù)人員做不到,那么在后續(xù)的技術(shù)設(shè)計(jì)和開發(fā)時(shí)就很難做系統(tǒng)的模塊化,更別談讓系統(tǒng)具有強(qiáng)應(yīng)變能力了。
系統(tǒng)的模塊化設(shè)計(jì),不是從程序員開始的,是從需求工程師開始的。
五、要素屬性小結(jié)
對(duì)于繪制邏輯圖中的三元素之一“要素”的屬性描述,使用了很多的概念(粒度/分層、黑/白盒、系統(tǒng)/模塊、解耦/內(nèi)聚),這些概念使得對(duì)邏輯圖中的要素塊(圖標(biāo)符號(hào))有了更深入的理解,應(yīng)用這些概念不但可以在邏輯圖繪制過程中讓圖中傳遞的信息更加清晰、準(zhǔn)確、簡(jiǎn)潔。
而且在分析、交流問題的過程中也有著很好實(shí)用價(jià)值,這些概念運(yùn)用可以讓的軟件工程師的眼、腦、耳、嘴、手等器官在理解、分析和描述問題時(shí)具有了立體感、維度感和層次感。
本系列下一篇博文:如何繪制邏輯圖 — 7.邏輯的表達(dá):業(yè)務(wù)邏輯
作者:李鴻君;《大話軟件工程—需求分析與軟件設(shè)計(jì)》一書作者。
本文由 @李鴻君 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自?Unsplash,基于 CC0 協(xié)議
沒有舉例,道理雖然懂了,還是不會(huì)用
太頂了,學(xué)到了