摘 要:耦合、內(nèi)聚是軟件工程中的一個概念。低耦合、高內(nèi)聚是面向?qū)ο缶幊讨械膽?yīng)遵守的基本原則。不同的設(shè)計人員對于這個原則的理解不同,其所設(shè)計、開發(fā)的系統(tǒng)也不盡相同。本文以學(xué)生信息管理系統(tǒng)為例,詮釋了筆者對于低耦合、高內(nèi)聚的理解。
關(guān)鍵詞:耦合;內(nèi)聚
中圖分類號:TP312.2-4
1 耦合
所謂耦合指的是軟件系統(tǒng)中一個代碼模塊與另一個代碼模塊之間的關(guān)系。耦合度越高說明模塊間的關(guān)系越緊密;反之模塊之間的關(guān)系越少。為了提高軟件系統(tǒng)應(yīng)對變更的能力、提高代碼的重用率、減少因變更而花費(fèi)的變更成本,在進(jìn)行系統(tǒng)設(shè)計時應(yīng)盡量降低模塊之間的耦合度,使各個模塊相對獨(dú)立。這樣即使一個模塊發(fā)生了變更,也不會對其他的模塊產(chǎn)生較大的影響。
以學(xué)生信息管理系統(tǒng)為例,學(xué)生類和班級類是針對學(xué)生和班級這兩個業(yè)務(wù)實(shí)體的實(shí)體類。從低耦合的原則上講它們之間應(yīng)相對獨(dú)立,不產(chǎn)生過多的交互。學(xué)生類提供學(xué)生信息相關(guān)的操作;班級類提供班級信息相關(guān)的服務(wù)。如圖1所示:
學(xué)生類Student中包含了與學(xué)生這個業(yè)務(wù)實(shí)體相關(guān)的屬性和操作,如學(xué)號、姓名、班級、住址、手機(jī)號、添加學(xué)生信息、修改學(xué)生信息、刪除學(xué)生信息、查詢學(xué)生信息等。通常一個學(xué)生只屬于一個班級,為此在Student類中包含了一個Classes類型的屬性。實(shí)現(xiàn)了Student類對Classes類的多對一關(guān)聯(lián)。此外Student類中還包含了通過班級號查詢學(xué)生的操作。雖然該操作以學(xué)號作為參數(shù),但其主要功能是實(shí)現(xiàn)學(xué)生的查詢。遵循低耦合的原則,該操作應(yīng)該放在Student類中,而不是Classes類。
從分層的角度上講,同樣需要遵循低耦合的原則。如圖2所示:
對于學(xué)生信息管理系統(tǒng)來說,可以采用標(biāo)準(zhǔn)的三層架構(gòu),即UI層、實(shí)體層、數(shù)據(jù)訪問層(DAL)。其中UI層負(fù)責(zé)用戶交互;實(shí)體層啟到了承上啟下的作用。既對UI層提供功能上的支持,又要調(diào)用數(shù)據(jù)訪問層(DAL),實(shí)現(xiàn)業(yè)務(wù)實(shí)體到關(guān)系表的映射;數(shù)據(jù)訪問層(DAL)則提供了數(shù)據(jù)持久化的相關(guān)操作。
本著低耦合的原則,層與層之間僅僅是向下依賴的,即UI層依賴于實(shí)體層,實(shí)體層依賴于數(shù)據(jù)訪問層(DAL)。隔層之間(UI層與數(shù)據(jù)訪問層(DAL))是不可見的。也就是說,UI層不會用到數(shù)據(jù)訪問層(DAL)中的任何成員。這樣就大大降低了層與層之間的耦合度,提高了系統(tǒng)應(yīng)對變更的能力。舉個例子:假設(shè)原有學(xué)生信息管理系統(tǒng)為C/S結(jié)構(gòu),出于部屬方便的考慮,用戶要求將原系統(tǒng)改為B/S結(jié)構(gòu)?;跇?biāo)準(zhǔn)三層架構(gòu)的學(xué)生信息管理系統(tǒng)只需將原有的UI層替換為web項目即可。實(shí)體層、數(shù)據(jù)訪問層(DAL)保持不變。
“低耦合”可以總結(jié)為“獨(dú)”。也就是說在設(shè)計和開發(fā)的過程中,要保持類與類之間,層與層之間的相對獨(dú)立,不產(chǎn)生多余的關(guān)系。
2 內(nèi)聚
所謂的內(nèi)聚指的是一個模塊各個成員之間的關(guān)聯(lián)程度。內(nèi)聚性越高說明模塊內(nèi)各個成員關(guān)系越緊密,該模塊的重用性越強(qiáng)。內(nèi)聚按緊密程度從低到高排列,依次為包括:偶然內(nèi)聚、邏輯內(nèi)聚、時間內(nèi)聚、過程內(nèi)聚、通信內(nèi)聚、信息內(nèi)聚、功能內(nèi)聚。
偶然內(nèi)聚:因?yàn)榕既辉虺霈F(xiàn)在一個模塊中的成員關(guān)系。可以說各個成員之間毫無關(guān)系,內(nèi)聚性最低。例如各個系統(tǒng)中都包含的工具類。工具類成員通常有加、解密,生成隨機(jī)的校驗(yàn)碼等操作。
邏輯內(nèi)聚:指的是同一個模塊中的成員邏輯上相關(guān),但功能上并無關(guān)聯(lián)。
時間內(nèi)聚:因?yàn)闀r間因素使一組成員關(guān)聯(lián)在一起。例如需要同一時間進(jìn)行數(shù)據(jù)同步。
通信內(nèi)聚:因?qū)ν粩?shù)據(jù)集操作或生成同一數(shù)據(jù)集而關(guān)聯(lián)在一個模塊內(nèi)的成員。
順序內(nèi)聚:為順序完成一個任務(wù)一組成員被放置在一個模塊中,一個成員的輸出作為另一個成員的輸入。
過程內(nèi)聚:因在一個過程中被先后調(diào)用的操作被放置在一個模塊中。
信息內(nèi)聚:基于同一個數(shù)據(jù)的一組成員被放置在一個模塊中。
功能內(nèi)聚:為完成單一功能,一組成員必須出現(xiàn)在一個模塊中。功能內(nèi)聚是一個功能專一、獨(dú)立性強(qiáng)、內(nèi)部結(jié)構(gòu)緊密的內(nèi)聚類型,是最理想的內(nèi)聚。例如:Student類包含了學(xué)生相關(guān)的全部成員。各個成員只為實(shí)現(xiàn)學(xué)生信息的增刪改查提供支持。
“高內(nèi)聚”可以總結(jié)為“緊”,即模塊內(nèi)部各成員之間關(guān)系緊密,功能專一。
3 結(jié)束語
“低耦合、高內(nèi)聚”是在進(jìn)行系統(tǒng)設(shè)計、開發(fā)過程中應(yīng)該保持的原則。不同的開發(fā)人員因項目經(jīng)驗(yàn)不同、對面向?qū)ο缶幊痰睦斫獠煌鞑幌嗤?。要充分理解這六個字還需要在項目實(shí)戰(zhàn)中逐步的去理解,需要一個由量變到質(zhì)變的過程。
參考文獻(xiàn):
[1]梁立新.項目實(shí)踐精解·ASP.NET應(yīng)用開發(fā):基于ASP.NET?C#和ADO.NET的三層架構(gòu)案例分析[M].北京:電子工業(yè)出版社,2010.
[2]Matthew MacDonald.ASP.NET高級程序設(shè)計[M].北京:人民郵電出版社,2011.
[3]Christian Thilmany..NET模式:架構(gòu)設(shè)計與過程[M].北京:中國電力出版社,2005.
[4]Jeffrey Richter.Microsoft.NET框架程序設(shè)計[M].北京:清華大學(xué)出版社,2003.
[5]Martin L.Shoemaker.UML實(shí)戰(zhàn)教程[M].北京:清華大學(xué)出版社,2006.
作者簡介:趙磊(1981-),男,河北人,軟件系副主任,講師,碩士,研究方向:軟件技術(shù)。
作者單位:天津電子信息職業(yè)技術(shù)學(xué)院,天津 300312