国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

第四篇:達(dá)到目標(biāo)必經(jīng)的路 之二

2019-11-17 05:36:24
字體:
供稿:網(wǎng)友

  我們來為內(nèi)聚性舉一些例子,重點強(qiáng)調(diào)如何把其他的內(nèi)聚性轉(zhuǎn)換成功能內(nèi)聚性。當(dāng)然,把各種各樣的子程序加以分類僅僅只是出于研究的用處,在實踐中花大力氣去區(qū)分每個子程序是那一種內(nèi)聚類型是毫無意義的,下面的例子只是建議你在設(shè)計子程序的時候就要充分考慮如何把子程序?qū)懙酶靡恍簿褪侨绾巫龅焦δ軆?nèi)聚。


內(nèi)聚性舉例

以下是幾個內(nèi)聚性的例子,其中既有好的,也有壞的:

功能內(nèi)聚性例子。比如計算雇員年齡并給出生日的子程序就是功能內(nèi)聚性的,因為它只完成一項工作,而且完成得很好。

順序內(nèi)聚性的例子。假設(shè)有一個按給出的生日計算雇員年齡、退休時間的子程序,假如它是利用所計算的年齡來確定雇員將要退休的時間,那么它就具有順序內(nèi)聚性。而假如它是分別計算年齡和退休時間的,但使用相同生日數(shù)據(jù),那它就只具有通訊內(nèi)聚性。

確定程序存在哪種不良內(nèi)聚性,還不如確定如何把它設(shè)計得更好重要。怎樣使這個子程序成為功能內(nèi)聚性呢?可以分別建立兩個子程序,一個根據(jù)生日計算年齡,另外一個根據(jù)生日確定退休時間,確定退休時間子程序?qū)⒄{(diào)用計算年齡的程序,這樣,它們就都是功能內(nèi)聚性的,而且,其它子程序也可以調(diào)用其中任一個子程序,或這兩個部調(diào)用。

通訊內(nèi)聚性的例子。比如有一個打印總結(jié)報告,并在完成后重新初始化傳進(jìn)來的總結(jié)數(shù)據(jù)的子程序,這個子程序具有通信內(nèi)聚性,因為這兩個操作僅僅是由于它們使用了相同的數(shù)據(jù)才聯(lián)系在一起。

同前例一樣,我們考慮的重點還是如何把它變成是功能內(nèi)聚性,總結(jié)數(shù)據(jù)應(yīng)該在產(chǎn)生它的地方四周被重新初始化,而不應(yīng)該在打印子程序中重新初始化。把這個子程序分為兩個獨立的子程序.第一個打印報告,第二個則在產(chǎn)生或者改動數(shù)據(jù)的代碼四周重新初始化數(shù)據(jù)。然后,利用一個較高層次的子程序來代替原來具有通訊相關(guān)的子程序,這個子程序?qū)⒄{(diào)用前面兩個分出來的子程序。

邏輯內(nèi)聚性的例子。一個子程序?qū)⒋蛴〖径乳_支報告、月份開支報告和日開支報告.具體打印哪一個,將由傳入的控制標(biāo)志決定,這個子程序具有邏輯內(nèi)聚性,因為它的內(nèi)部邏輯是由輸進(jìn)去的外部控制標(biāo)志決定的。顯然,這個子程序不是按只完成一項工作并把它作好的原則。怎樣使這個子程序變?yōu)楣δ軆?nèi)聚性呢?建立三個子程序:一個打印季度報告,一個打印月報告、一個打印日報告,改進(jìn)原來的子程序,讓它根據(jù)傳送去控制標(biāo)志來調(diào)用這三個子程序之一。調(diào)用子程序?qū)⒅挥姓{(diào)用代碼而沒有自己的計算代碼,因而具有功能內(nèi)聚性。而三個被調(diào)用的手程序也顯然是功能內(nèi)聚性的。非常巧合,這個只負(fù)責(zé)調(diào)用其它子程序的子程序也是一個事務(wù)處理中心。最好用如DispatchReporPRinting()之類帶有“調(diào)度”或“控制”等字眼的詞來給事務(wù)處理中心命名,以表示它只負(fù)責(zé)命令溫調(diào)度,而本身并不做任何工作。

邏輯內(nèi)聚性的另一個例子。考慮一個負(fù)責(zé)打印開支報表、輸入新雇員名字并備份數(shù)據(jù)庫的子程序,其具體執(zhí)行內(nèi)容將由傳入的控制標(biāo)志控制。這個子程序只具有邏輯內(nèi)聚性,雖然這個關(guān)聯(lián)看起來是不合邏輯的。

要想使它成為功能內(nèi)聚性,只要按功能把它分成幾部分就可以了。不過,這些操作有些過于凌亂。因此,最好重新建立一個調(diào)用各子程序的代碼。當(dāng)擁有幾個需要調(diào)用的子程序時,重新組織調(diào)用代碼是比較輕易的。

過程內(nèi)聚性的例子。假設(shè)有一個子程序,它產(chǎn)生讀取雇員的名字,然后是地址,最后是它的電話號碼。這種順序之所以重要,僅僅是因為它符合用戶的要求,用戶希望按這種順序進(jìn)行屏幕輸入。另外一個子程序?qū)⒆x取關(guān)于雇員的其它信息。這個子程序是過程內(nèi)聚性,因為是由一個特定順序而不是其它任何原因,把這些操作組合在一起的。

與以前一樣,如何把它變?yōu)楣δ軆?nèi)聚性的答案仍然是把它分為幾個部分,并把這幾部分分別放入程序中。要保證調(diào)用子程序的功能是單一、完善的。調(diào)用子程序應(yīng)該是諸如GetEmployeeData()這樣的子程序,而不該是像GetFirstPartofEmployeeData()這類的子程序。可能還要改動其余讀取數(shù)據(jù)的子程序。為得到功能內(nèi)聚性,改動幾個子程序是很正常的。

同時具有功能和臨時內(nèi)聚性的程序。考慮一個具有完成一項事物處理所有過程的子程序,從用戶那里讀取確認(rèn)信息,向數(shù)據(jù)存入一個記錄,清除數(shù)據(jù)域,并給計數(shù)器加1。這個程序是功能內(nèi)聚性的,因為它只從事一項工作,進(jìn)行事物處理,但是,更確切地說,這個子程序同時也是臨時內(nèi)聚性的,不過當(dāng)一個子程序具有兩種以上內(nèi)聚性時,一般只考慮最強(qiáng)的內(nèi)聚性。

這個例子提出了如何用一個名字恰如其分地抽象描述出程序內(nèi)容的問題。比如可以稱這個子程序為ConfirmEntryAndAdjustData(),表示這個干程序僅具有偶然內(nèi)聚性。而假如稱它為CompleteTransaction(),那么就可能清楚地表示出這個子程序僅具有一個功能,而已具有功能內(nèi)聚性。

過程性、臨時或者可能的邏輯內(nèi)聚性。比如一個進(jìn)行某種復(fù)雜計算前5個操作,并把中間結(jié)果返回到調(diào)用子程序。由于5 項操作可能要用好幾個小時,因此當(dāng)系統(tǒng)癱瘓時,這個子程序?qū)阎虚g結(jié)果存入一個文件中,然后,這個子程序檢查磁盤,以確定其是否有足夠空間來存儲最后計算結(jié)果,并把磁盤狀態(tài)和中間結(jié)果返回到調(diào)用程序。

這個子程序很可能是過程內(nèi)聚性的,但你也可能認(rèn)為它具有臨時內(nèi)聚性,甚至具有邏輯內(nèi)聚性。不過,不要忘了問題的要害不是爭論它具有哪種不好的內(nèi)聚性,而是如何改善其內(nèi)聚性。原來的子程序是由一系列令人莫名其妙的操作組成的,與功能內(nèi)聚性相距甚遠(yuǎn),首先,調(diào)用子程序不應(yīng)該調(diào)用一個,而應(yīng)該調(diào)用幾個獨立的子程序:l)進(jìn)行前5步計算的子程序;2)把中間結(jié)果存入一個文件;3)確定可用的磁盤存儲空間。假如調(diào)用子程序被稱作ComputeExtravagantNumber(),那么它不應(yīng)該把中間結(jié)果寫入一個文件,也決不該為后來的操作檢查磁盤剩余空間,它所作的就僅限于計算一些數(shù)而已。對這個子程序的精心重新設(shè)計,將至少影響到一至兩個層次上的子程序,對于這頂任務(wù)的較好設(shè)計。


圖中畫陰影的部分是由原來的子程序從事的工作,在新組織結(jié)構(gòu)中它們位于不同的層次上,這就是為什么為了把這些工作放人恰當(dāng)?shù)淖映绦蛑校M(jìn)行這么多重新組織工作的原因。用幾個功能內(nèi)聚性的子程序來代替一個具有不良內(nèi)聚性的子程序是很平常的。

在實踐中,我們會碰到各種各樣內(nèi)舉類型的子程序,除了功能內(nèi)聚型以外,任何類型的子程序都可以通過增加層次的方式來把它分為幾個功能內(nèi)聚型的子程序,例如上面邏輯內(nèi)聚型的例子,在把功能分給幾個功能子程序后,在功能之上增加了一個控制的程序。這是典型的非面向?qū)ο笳Z言(如C語言)的做法,而在面向?qū)ο笳Z言中(如C++、java),可以通過重載、接口等技術(shù)來實現(xiàn)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 双辽市| 新昌县| 碌曲县| 宁陵县| 无棣县| 鄂托克前旗| 江阴市| 神木县| 清原| 灵宝市| 囊谦县| 凤阳县| 靖安县| 阜南县| 阳谷县| 五寨县| 类乌齐县| 石城县| 辽宁省| 双流县| 新绛县| 泗水县| 会理县| 青铜峡市| 巨鹿县| 翼城县| 库尔勒市| 平湖市| 西乌珠穆沁旗| 兖州市| 无棣县| 和平区| 墨江| 齐河县| 蒲城县| 深泽县| 鄢陵县| 昌乐县| 襄汾县| 迭部县| 竹山县|