以物件導向設計品質改善軟體可維護性之研究
79
0
0
全文
(2) 摘要. 物件導向軟體開發的概念,已逐漸地成為目前軟體開發的主流,不 過對於軟體維護作業並沒有獲得具體改善。其中軟體設計的品質將直接 影響後續維護作業進行的效率,但是大部分軟體專案卻都只著重在開發 的效率,而忽略了後續的維護作業,同時軟體設計也會因為每個人觀點 及設計風格的不同,造成設計的品質不易掌控,往往造成軟體後續維護 的成本因此而提高。設計階段提升軟體可維護性的一個方式,即是針對 軟體未來進行變動而造成的漣漪效應提出預防的措施,以提升維護作業 進行的效率。因此本研究根據物件導向設計的相關特性,並結合相關的 品質量測方式,提出一套以變動衝擊為基礎的整合性量測模式,藉以分 析物件導向設計中,造成日後維護瓶頸的關鍵所在,並透過相關調整法 則的指示,對品質上有缺失或有問題的軟體設計進行調整。最後,本文 以實驗的結果,確認整合性變動衝擊量測模式,可以有效的分析出不利 於軟體維護作業的因素,同時透過調整法則的指示,可以有效的降低軟 體的變動衝擊,進而提升軟體的可維護性。 關鍵詞:軟體可維護性、物件導向設計、量測模式、變動衝擊. -I-.
(3) Abstract. In recent years object-oriented paradigm becomes the more popular software development methodology. However, the object-oriented paradigm can not resolve the critical problems of software maintenance. Several researchers have same recognitions that software design phase is an important factor to affect the maintenance operations. Therefore, how to reduce change impacts of design phase becomes an important issue for improving the software maintainability. In this paper, the change impacts of the object-oriented software system are analyzed. Based on the change impacts, we propose the design quality measurement model to detect the high change impact of design phase. Some adjustable rules for reducing high change impact and enhancing software maintainability are also proposed. Applied the measurement mode and adjustable rules, we make some experiments for object-oriented design modifications. The results of experiments assure that the measurement model and adjustable rules can reduce the change impact of object-oriented design effectively and improve.. Keywords: software maintainability, object-oriented design, measurement model, change impact. - II -.
(4) 誌謝 本論文得以順利完成,首先感謝恩師賴森堂老師在攻讀碩士學位兩 年期間,辛勤的指導與照顧,使學生受益不淺。同時非常感謝口試委員 呂芳懌教授與李明錡教授,在口試期間不辭辛勞撥冗指導,提供諸多寶 貴意見與指導,使本論文更臻完備。 在撰寫論文期間,承蒙資訊管理研究所諸位老師以及同學威男、志 平、家銓、文龍、佳純、光前、宏仁、大鈞、鉥棚、振益、榮佩、永祥、 妙華及光松大哥在論文及課業上的協助與鼓勵,並帶給我兩年的美好回 憶,特此誌謝。 最後,感謝我的父母親以及所有的親朋好友們在就學期間提供精神 與物質上的支柱,使我在求學的過程中得以全力衝刺。在此謹將此論文 獻給我最親愛的家人,以及所有幫助過我的師長、朋友,願與大家共享 這份難得的喜悅與榮耀。. 楊逸祥 謹誌於 國立屏東商業技術學院資訊管理研究所 中華民國九十三年七月八日. - III -.
(5) 目錄 摘要…………………………………………………………… I 英文摘要……………………………………………………… II 誌謝…………………………………………………………… III 目錄…………………………………………………………… IV 圖表索引……………………………………………………… VII 第壹章 緒論………………………………………………….. 1 第一節 研究背景與動機………………………………………… 1 第二節 研究目的………………………………………………… 3 第三節 研究流程………………………………………………… 4 第四節 章節安排………………………………………………… 5. 第貳章 文獻探討…………………………………………….. 6 第一節 軟體維護與物件導向設計……………………………… 6 (一)、軟體維護的定義…...…………………………………... 6 (二)、物件導向設計………………………………………….. 7 (三)、設計階段提升軟體可維護性相關方式……………….. 8 第二節 物件導向軟體變動情形探討….………………………… 9 (一)、類別間的變動情形…...………………………………... 10 (二)、類別內的變動情形…………………………………... 13. - IV -.
(6) 第三節 物件導向軟體變動衝擊相關量測方式….……………… 14 (一)、物件導向軟體相關量測方式……...…………………... 14 (二)、運用物件導向量測方式於變動衝擊分析之相關研究.. 15. 第參章 物件導向設計變動衝擊分析……………………….. 17 第一節 類別間變動衝擊分析….………………………………… 17 (一)、繼承關係…………………………...…………………... 17 (二)、非繼承性其他連結關係……………………………….. 19 第二節 類別內變動衝擊分析…………………………………… 22 (一)、繼承關係…………………………...…………………... 22 (二)、非繼承性其他連結關係……………………………….. 26 第三節 物件導向設計變動衝擊分析…….……………………… 38 (一)、繼承關係特性……………………...…………………... 30 (二)、非繼承性連結關係特性……………………………….. 32 (三)、類別過載情形………………………………………….. 34 (四)、類別內特性………………………...…………………... 35. 第肆章 整合性變動衝擊量測模式與調整法則…………….. 36 第一節 物件導向變動衝擊量測方式….………………………… 36 (一)、繼承關係量測方式………………...…………………... 36 (二)、非繼承性連結關係量測方式………………………….. 39. -V-.
(7) (三)、類別內聚力量測方式………...…...…………………... 41 第二節 物件導向設計變動衝擊量測模式..……………………... 42 (一)、繼承深度的量測………………...……………………... 43 (二)、繼承廣度的量測………………...……………………... 45 (三)、非繼承性連結關係的量測……...……………………... 48 第三節 設計階段提升軟體可維護性調整法則….……………… 50 (一)、類別內調整法則………………...……………………... 51 (二)、類別間調整法則…………………...…………………... 51. 第伍章 整合性變動衝擊量測模式驗證實驗……………….. 55 第一節 實驗說明………………………………………………… 55 第二節 實驗過程………………………………………………… 55 (一)、類別繼承深度…………………...……………………... 55 (二)、類別繼承廣度………………………………..………… 58 (三)、類別非繼承性連結…………………………………….. 61 第三節 實驗結果………………………………………………… 64. 第陸章 結論與未來研究方向……………………………….. 65 第一節 結論…….………………………………………………… 65 第二節 未來研究方向.…………………………………………… 66. 參考文獻……………………………………………………… 67 - VI -.
(8) 圖表索引 圖 2-1 類別繼承關係變動……………………………………………… 11 圖 2-2 非繼承性連結關係變動………………………………………… 12 圖 3-1 類別繼承關係(抽象類別變動)…………………………….…… 18 圖 3-2 類別繼承關係(非抽象類別變動)……………………….……… 18 圖 3-3 非繼承性其他連結關係變動…………………………………… 20 圖 3-4 類別繼承關係(資料成員變動)………………………………… 23 圖 3-5 類別繼承關係(成員函數變動)………………………………… 24 圖 3-6 類別繼承深度情形……………………………………………… 31 圖 3-7 類別繼承廣度情形……………………………………………… 32 圖 3-8 類別間耦合情形………………..……………………………… 33 圖 3-9 類別間引用強度………………..……………………………… 34 圖 3-10 類別過載情形………………………………………………….. 34 圖 4-1 類別繼承關係範例……………………………………………… 38 圖 4-2 類別非繼承連結關係範例……………………………………… 40 圖 4-3 繼承深度關係範例……………………………………………… 44 圖 4-4 多個子類別繼承關係範例………….…………………………... 47 圖 4-5 非繼承性連結關係範例………………………………………… 49 圖 5-1 繼承深度實驗類別圖……………………………….................... 56. - VII -.
(9) 圖 5-2 繼承廣度實驗類別圖…………………………………………… 59 圖 5-3 類別間耦合實驗類別圖………………………………………… 62 表 2-1 物件導向軟體變動型態架構…………………………………… 10 表 3-1 繼承關係變動衝擊評估表……………………………………… 19 表 3-2 非繼承性連結關係變動衝擊評估表………………….………... 22 表 3-3 類別內變動衝擊評估表(繼承關係部分)………………………. 25 表 3-4 類別內變動衝擊評估表(非繼承性連結關係部分)……………. 30 表 5-1 調整前類別圖各類別繼承深度變動衝擊值…..……………….. 56 表 5-2 調整後類別圖各類別繼承深度變動衝擊值…………………… 57 表 5-3 調整前後變動衝擊比較(資料成員變動)….…………………… 57 表 5-4 調整前後變動衝擊比較(成員函數變動)….…………………… 58 表 5-5 調整前類別圖各類別繼承廣度變動衝擊值…..……………….. 59 表 5-6 調整後類別圖各類別繼承廣度變動衝擊值…………………… 59 表 5-7 調整前後變動衝擊比較(資料成員變動)….…………………… 60 表 5-8 調整前後變動衝擊比較(成員函數變動)….…………………… 61 表 5-9 調整前類別圖各類別耦合變動衝擊值………..……………….. 62 表 5-10 調整後類別圖各類別耦合變動衝擊值……………………….. 62 表 5-11 調整前後變動衝擊比較(資料成員變動)….…………………... 63 表 5-12 調整前後變動衝擊比較(成員函數變動)….………………...... 64 - VIII -.
(10) 第壹章 緒論 一、研究背景與動機 面對現今軟體系統的規模與複雜度不斷升高,傳統結構化開發方法 已漸漸不再適用於當前的軟體環境。因此,物件導向軟體開發的概念, 已逐漸地成為目前軟體開發的主流[6,26,32]。由於企業組織在開發及 導入大型軟體的過程,需要投入相當龐大的人力與成本,使得各企業組 織無不希望能夠拉長軟體系統的生命週期,以增長軟體系統的使用年 限。其中,雖然物件導向開發方法相對於結構化開發方法,在軟體維護 方面已經有所改善。但是,對於如何提升物件導向軟體維護的效率,仍 是具有許多進步的空間[9,14,29,34]。同時,為了因應企業組織的營 運管理、策略以及使用者的需求等,軟體維護需求提出的頻率,時常會 大於預期,因而造成許多現有的軟體,必須面臨重新設計或是進行相關 的維護作業,才能夠符合企業組織的需求,並使軟體系統能夠持續的運 作。另一方面,軟體維護成本的花費,佔軟體生命週期總成本的 67%[31], 亦即,軟體在進行維護作業時,經常必須花費許多的人力以及成本。根 據 ISO 9126 軟體品質標準對可維護性的定義,可維護性代表軟體在進行 特定修改時,所需投入工作量的影響因素[20]。因此,如果能夠提升軟體 的可維護性,將有助於增加軟體維護的效率,同時可以降低軟體維護的 成本。 依據 Swanson 所提出,軟體維護可以分為三種類型,(1)修正性 (Corrective)維護:當軟體在執行期間發生錯誤時,所進行的維護作業,(2) 異動性(Perfective)維護:當使用者的需求有所變動,提出新增、修改及刪 除功能等的要求時,所進行的維護作業等,(3)適應性維護(Adaptive):當軟 體所運作的環境變動時,為了使軟體適應新環境所進行的維護作業[33]。. 1.
(11) 其中,異動性維護佔了全部維護類型中的 60.5%[31],亦即,大部分的維 護作業,是因為軟體功能需求的變動,所進行的維護作業。一般而言, 異動性維護作業進行的流程,先由使用者提出需求變動,維護人員會先 針對維護需求進行協商,以決定是否要接受此項維護需求。確定要執行 維護作業後,維護人員會根據規格書、操作手冊及設計文件等相關的文 件,找出問題的核心。接著便是修改規格書及設計文件等,以符合維護 需求所提出的條件。當相關文件修改完成後,就會進入程式碼修改的階 段,此時,維護人員會根據修改後的相關文件,進行程式碼的修改[31]。 由上述軟體維護的作業流程顯示,軟體設計階段所產生的相關文件,對 於軟體維護的進行,有著很重要的關係。在物件導向設計階段時,主要 會進行架構設計以及細部設計兩個部分,此階段所產生的相關設計文 件,將會交付到實作階段進行實作。亦即,軟體的設計關係著軟體的架 構以及程式碼的撰寫,一旦產生設計品質不佳的軟體,或許可以實作完 成並上線運作,但卻會造成後續維護人員在維護作業上的困難。提升軟 體可維護性有許多的方式,其中,Schach 以及 Layzell 皆認為,在軟體開 發程序的每個階段中,都必須要事先考量到後續軟體維護的問題,並加 以規劃,以提升軟體的可維護性[13,23]。亦即,軟體發展的各階段都與 後續的維護作業有著密切的關係,若能在軟體開發時,就將後續的維護 問題納入考量,對於日後進行軟體維護作業時,勢必可以提升維護的效 率。其中,Younessi 認為,為了使日後維護作業能夠順利進行,在設計 階段時,必須設計出具有可維護性的軟體 [37]。Zagal 等人認為必須從軟 體維護的角度來進行軟體設計[39]。然而,高品質的物件導向設計經常必 須仰賴於良好且有經驗的設計者,而這方面的設計人員卻為有限,且目 前大部分的軟體專案團隊經常為了趕進度,在設計階段忽略後續維護的 問題,因而造成日後軟體在進行維護時,增加維護人員的困擾。因此,. 2.
(12) 若是有一套客觀的量測模式,針對設計文件作出量測,輔助指示出可能 影響後續維護作業的瓶頸為何,將有助於協助了解該如何改善設計文 件。有鑑於此,本文以設計階段為出發點,探討在設計階段時,如何能 夠提高軟體可維護性,使日後進行維護作業的效率能得以提高。目前在 設計階段提升軟體可維護性的相關研究仍然有限,主要是針對物件導向 設計的品質作出量測[17,11,28,4,5,16,12,10]。但是,卻鮮少有 一套整合性的量測模式,針對物件導向設計階段的可維護性進行量測。 因此,本文將提出一套整合性的量測模式,針對物件導向設計階段進行 量測,以輔助指示出影響後續維護作業的瓶頸為何。在物件導向設計階 段中,最主要產出的文件為類別圖,所以為了能夠在設計階段提升軟體 的可維護性,本文將針對設計階段產出的類別圖,運用整合性的量測模 式進行量測,同時加以調整,以提升軟體的可維護性。. 二、研究目的 本研究的目的在於進行物件導向設計時,將後續維護納入考量,以 提升日後的維護的效率。因此,將分析在物件導向設計階段時,對於軟 體維護作業產生影響的因素,同時,根據這些影響因素,提出一套整合 性的量測模式。藉由整合性量測模式針對類別圖作出量測,指示在物件 導向設計中,造成日後維護作業產生瓶頸的關鍵為何。接著提出調整的 法則,以提供在設計階段時,使類別圖能夠依據法則作出調整,藉此提 升軟體的可維護性。最後,則是透過實驗的方式,對於量測模式及調整 法則作出驗證,以驗證本研究之可行性。 因此,總結本研究之目的,主要可以歸納出以下四點 :. 1、分析物件導向設計中,影響後續維護作業的因素為何。. 3.
(13) 2、提出一套整合性的量測模式,以輔助指示出在物件導向設計階段中, 影響後續維護作業的瓶頸。. 3、根據量測模式所測量出的結果,提出調整的法則。. 4、以實驗方式驗證所提出之量測模式,以及調整法則之有效性。. 三、研究流程 本研究的研究流程,主要可分為以下幾個部分,分述如下 :. 1、確定研究主題 : 確定研究主題、方向、範圍、目的及主要架構等。. 2、相關文獻探討 : 收集相關文獻及研究,文獻探討主要包含物件導向設計、物件導向 軟體維護、物件導向軟體量測以及相關軟體工程研究等方面。. 3、資料分析 : 根據相關文獻,分析出在物件導向設計階段時,對於後續維護作業 所會產生影響的因素,並作出整理。. 4、量測模式建立 : 針對物件導向設計階段,建立一套量測的模式,以輔助進行分析, 在設計階段中,造成後續維護作業產生瓶頸的關鍵為何。. 4.
(14) 5、提出調整法測 : 根據量測模式所量測出之結果,針對不合適的物件導向設計,提出 調整的法則以進行調整,藉以提升軟體可維護性。. 6、實驗建立 : 針對本研究所提出之量測模式以及調整法則,建立驗證之實驗,以 驗證量測模式及調整法則之可行性。. 7、結論及未來研究方向 : 最後根據本研究之研究結果,提出本研究的成果及貢獻,並作出本 研究之結論及未來研究方向。. 四、章節安排 本研究的章節安排,第一章為針對軟體開發及軟體維護的現況提出 概述。第二章為文獻探討部分,主要針對與本研究有關之相關背景知識 及文獻提出描述。第三章為分析物件導向軟體進行維護時,因為變動而 造成衝擊的情形,並探討衝擊情形與物件導向設計的對應關係。第四章 為量測模式之建立,根據相關文獻及量測方式,建立一套針對物件導向 設計階段之量測模式。同時提出在設計階段時,提升軟體可維護性的調 整法則,第五章為建立驗證之實驗,為本研究所提出之量測模式及調整 法則,建立實驗以驗證其有效性。最後,結論及未來研究方向則描述於 第六章。. 5.
(15) 第貳章 文獻探討 本章將針對物件導向設計及維護的背景知識進行描述,同時從相關 文獻中,探討影響物件導向軟體維護作業的相關因素,以及針對物件導 向軟體特性提出的相關量測方式。. 一、軟體維護與物件導向設計. (一)、軟體維護的定義 根據 IEEE 1219 軟體維護標準對軟體維護所作之定義 : 「交貨以後 一個軟體產品的改正錯誤,改善效率或其他的因素,或是使產品適應修 改過的環境」[19]。此外,有些學者亦提出對軟體維護的看法 :. (1)Martin 等學者認為軟體維護是由於一個問題或者有改進的需要,對軟 體產品進行程式碼和相關文件的修正,其目標是在保持軟體完整性的 情況下,修改現有的軟體產品[27]。. (2)Von Mayrhauser 認為軟體維護涵蓋軟體系統生命週期從軟體上線運作 直到該軟體被移除為止[35]。. (3)FIPS(Federal Information Processing Standards)定義軟體維護是在軟體 系統成為產品之後,為維持軟體系統的作業與效率而進行的活動[18]。. 綜合上述內容,軟體維護主要是為了使軟體能夠正常運作,以及使 軟體功能可以符合實際的需求,以有效延長軟體使用期限之作業,直到 軟體移除不再使用為止。同時,在傳統的軟體生命週期觀念下,軟體維 護被視為是軟體生命週期中的一個階段,在軟體開發階段時並沒有加以 6.
(16) 重視與考量。然而,在新的軟體維護觀念中,則認為軟體維護必須是全 盤性的考量[31,23],亦即,為了降低後續維護作業的困難,必須在軟體 進行開發時,就必須事先考量到後續維護的問題。因此,在軟體開發的 各個階段中,若可以事先考量到後續軟體維護,將有助於提升軟體的可 維護性,進而降低日後軟體維護作業所投入的人力與成本。. (二)、物件導向設計 為了能夠滿足當前軟體系統的要求,物件導件軟體開發方式,已逐 漸成為軟體開發的主流[6,26,32]。物件導向軟體開發方式擁有與傳統 結構化軟體開發方式不同的特性,包含類別、方法、訊息、繼承、多形 與資訊隱藏等特性[31]。因此,在軟體設計方面,物件導向設計與結構化 設計的方式亦有所不同。在物件導向分析及設計方面,在 1997 年時,由 Rational Software Corporation 所提出的統一塑模語言(Unified Modeling Language,UML)獲得物件管理協會(OMG,Object Management Group)採 納成為正式的標準,使物件導向分析與設計得以擁有一個統一的標準, UML 則針對物件導向軟體分析及設計提出了相當詳細的定義方式[13]。 在進行物件導向設計時,經過架構設計及細部設計後,將會產出軟體的 類別圖,類別圖屬於重要設計核心的文件,其中是由類別以及類別間的 相互關係所組成,類別內部定義完整的資料成員及成員函數,而類別間 則規劃出許多不同的引用關係,一般兩類別間的引用關係包含關連 (Associations) 、 一 般 化 (Generalization) 、 聚 合 (Aggregation) 以 及 合 成 (Composition)等關係[13]。此外,由於軟體發展的各階段都與後續的維護 作業有著密切的關係,若能在軟體開發時,就將影響後續的維護問題納 入考量,對於日後進行軟體維護作業時,勢必可以提升維護的效率。其 中,Younessi 認為,為了使日後維護作業能夠順利進行,在設計階段時, 必須設計出具有可維護性的軟體,以利於後續的維護[37]。Zagal 等人認 7.
(17) 為必須從軟體維護的角度來進行軟體設計[39]。Abreu 等人認為設計的品 質,將影響軟體的可分析性、可變動性、穩定性以及可測試性,這些特 性將影響軟體的可維護性[8]。因此,設計階段對於後續維護作業而言, 佔有舉足輕動的地位,若能夠在設計階段時,就考量到後續軟體的維護, 將有助於提升軟體維護作業的效率。. (三)、設計階段提升軟體可維護性相關方式 在設計階段提升軟體可維護性,主要可以分為兩個方向,分別是集 中化(localization)以及副作用的管理(side-effect management)[37],以下分 別加以探討 :. 1、集中化 表示在進行維護作業時,能夠從設計文件中快速確認問題範圍的能 力。包括設計作業的模組化、抽象化等,都有助於提升在設計文件中隔 離問題的能力。. 2、副作用的管理 表示在進行維護作業時,控制因某項變動,而造成其他變動產生的 能力。為了提升軟體可維護性而強調軟體集中化的關係,雖然有利於在 設計中快速隔離問題的範圍,但卻會發生在修改某些模組時,造成其他 模組受到影響的情形,因而增加了維護人員的負擔。因此,副作用管理 的目的即是為了控制此類情形的發生。當能夠降低因為變動而產生的副 作用時,即可以降低維護人員在進行維護作業上的困難,提升軟體維護 作業的效率。. 本研究將以副作用的管理為出發點,探討在設計階段時,如何降低 8.
(18) 未來在進行維護作業所可能產生的副作用。為了要能夠控制軟體在進行 維護作業時所產生的副作用,首先必須具有分析的依據,分析副作用的 一個方式,即為軟體的變動衝擊分析(change impact analysis)[15],在物件 導向軟體中對於變動衝擊的定義,即為某個類別進行變動時,同時造成 其他類別或類別本身產生影響,而產生漣漪效應(ripple effects)。這將會 造成維護作業極大的不便,因此若能夠掌握軟體因為變動而產生的衝擊 情況並深入分析,將有助於提出相關的方法來預防或降低因變動而產生 的漣漪效應,以提升軟體承受修改的能力,並以此達到副作用管理的目 的。因此,本文將分析物件導向軟體因變動而產生衝擊的情形,以便在 設計階段時,提出降低相關變動衝擊的預防方式。. 二、物件導向軟體變動情形探討 雖然軟體未來會進行何種維護動作並無法預先完全得知,但是程式 碼的更改是無法避免的,因此在程式碼變動方面,有些學者提出了詳細 的變動分類,首先是 Kung 等學者針對物件導向軟體的變動作出分類,其 中將物件導向軟體可能的變動情形,分類為變數的變動、方法的變動、 類別的變動以及類別庫(class library)的變動[22]。另外,Chaumun 等學者 亦針對 C++物件導向語言分析出詳細的變動種類,其中包含 12 種變數的 變動、35 種方法的變動以及 19 種類別的變動[15]。綜合上述所提出物件 導向軟體變動情形加以分類,主要可以分為類別間(inter-class)以及類別內 (intra-class)的變動。整合上述學者所提出的變動種類,將物件導向軟體產 生變動時的情形整理如表 2-1 所示,其中,類別間的變動可以分為繼承關 係及非繼承關係(包含關連、聚合關係)的變動,類別內部的變動主要為資 料成員及成員函數的變動。相關變動情形的詳細描述如下 :. 9.
(19) 表 2-1 物件導向軟體變動型態架構 變動層級. 變動描述 抽象/非抽象類別的新增/刪除以及類. 繼承關係. 別範圍的變更. 類別間 非繼承性其他連 結關係 資料成員 類別內 成員函數. 相依/一般類別的新增/刪除以及類別 範圍的變更 新增/刪除、型態以及範圍變更 新增/刪除、範圍、傳回型態以及邏 輯變更. (一)、類別間變動情形 類別間的變動情形,依據特性的不同,可以分為繼承關係與非繼承 性的連結關係,以下分別探討之 :. 1、繼承關係 在繼承關係上可能會進行的變動,主要是抽象及非抽象類別的變 動,以下分別加以說明之 :. (1)抽象(abstract)類別的新增/刪除 抽象類別代表該類別被其他類別繼承,以圖 2-1(a)為例,類別 A 以 及類別 B 皆有受到其他的類別繼承,因此皆屬於抽象的類別。. (2)非抽象(non-abstract)類別的新增/刪除 10.
(20) 繼承其他類別而未被其他類別所繼承的類別稱為非抽象的類別,以 圖 2-1(a)為例,類別 C 因為沒有被其他類別繼承,因此屬於非抽象類別。 由於抽象及非抽象類別的新增或刪除,會造成其中某些抽象(非抽象)類別 轉換成為非抽象(抽象)類別。以圖 2-1(b)為例,當新增一類別 D 繼承類別 C 時,類別 C 即成為抽象類別。. A. A. B. B. C. C. (a). D. (b). 圖 2-1 類別繼承關係變動. (3)抽象/非抽象類別繼承範圍(scope)的變動 在繼承關係中,類別範圍的變動情況為類別的宣告在 Public、 Protected 以及 Private 之間進行變更,例如某類別的宣告由 Public 變更為 Protected。. 另外在繼承關係中,類別內部的變動亦會造成其他類別的影響,在 繼承關係中類別內部變動的情形,包含抽象/非抽象類別資料成員的新增/ 刪除、型態及範圍變更,抽象/非抽象類別成員函數的新增/刪除、範圍、 傳回型態以及邏輯變動,變動的描述如類別內變動所示。. 2、非繼承性連結關係 非繼承性的連結關係,主要可以分為關連及聚合關係,由於 UML 所. 11.
(21) 定義的關係中,許多關係主要為概念性的傳達類別間的關係,並無法直 接實作。因此從實作的角度來看,類別間的非繼承性關係可以分為關連 及聚合關係,其中,關連關係代表某類別引用其他類別的資料成員或成 員函數,聚合關係代表某類別之中實作其他的類別,在非繼承性連結關 係中,變動的類別分為相依以及一般類別,以下分別說明之 :. (1)相依類別新增/刪除 當一個類別被其他類別的引用或實作時,則稱此類別為相依類別, 以圖 2-2 為例,類別 B 被類別 A 引用,因此類別 B 屬於相依類別。. (2)一般類別新增/刪除 當一個類別引用、實作其他類別,而未被其他類別引用或實作時, 則稱此類別為一般類別。以圖 2-2 為例,類別 A 引用類別 B 且未被其他 類別引用,因此類別 A 屬於一般類別。. A d1 d2. B d3 d4. m1() m2(). m3() m4(). 圖 2-2 非繼承性連結關係變動. (3)相依/一般類別範圍的變動 在非繼承性連結關係中,同樣會有類別範圍的變動,類別範圍變動 情況為該類別的宣告在 Public、Protected 以及 Private 之間互相進行變更。. 在非繼承性連結關係中,類別內部的變動同樣會造成其他類別的影 響,在非繼承性連結關係中的變動情形,包含相依/一般類別資料成員的 12.
(22) 新增/刪除、型態及範圍變更,相依/一般類別成員函數的新增/刪除、範圍、 傳回型態以及邏輯變動,變動的描述如類別內變動情形所示。. (二)、類別內變動情形 類別內的變動主要為資料成員以及成員函數的變動,以下分別說明 :. 1、資料成員變動情形. (1)資料成員新增/刪除 在一個類別之中,針對某些資料成員進行新增或刪除的動作。. (2)範圍變動 資料成員範圍的變動,為資料成員的宣告在 Public、Protected 以及 Private 之間互相的變更。. (3)型態變動 指資料成員宣告型態的變動,例如整數宣告轉變為雙精確度浮點數 宣告,字元宣告轉變為字串宣告等…。. 2、成員函數變動情形. (1)成員函數新增/刪除 在一個類別之中,針對某些成員函數進行新增或刪除的動作。. (2)範圍變動 成員函數範圍的變動,為成員函數的宣告在 Public、Protected 以及. 13.
(23) Private 之間互相的變更。. (3)傳回型態變動 成員函數傳回值型態的轉變,例如傳回值的型態由整數轉變為浮點 數等…。. (4)邏輯變動 運作邏輯的變動代表成員函數中演算邏輯的變動。. 三、物件導向軟體變動衝擊相關量測方式 為了要瞭解設計文件中,可能產生的變動衝擊,必須要規劃相關的 量測方式,透過相關量測的方法,就可以針對設計文件可能產生變動衝 擊的情況加以量化,再依據量化值分析在設計文件中,那些部分受到變 動衝擊的影響,同時量測方法可以用來評估所提出之降低變動衝擊的方 法是否有效。但是根據物件導向軟體的特性,傳統結構化量測方式已不 適用於量測物件導向的軟體[17][6],因此根據物件導向軟體的特性,有許 多學者提出對於物件導向軟體特性的量測方法,以下分別探討 :. (一)、物件導向軟體相關量測方式. 1、Chidamber 和 Kemeter 對於物件導向設計階段的量測提出一套完整的 量測方法,稱為 C&K 量測方法[17]。其中包含四個類別間量測(inter-class metric),分別為 DIT(Depth of inheritance tree)、NOC(number of children)、 CBO(coupling between objects)以及 RFC(response for a class),以及兩個類 別內量測(intra-class metric),包含 LCOM(lack of cohesion of methods)以及 WMC(weighted method per class)。 14.
(24) 2、Abreu 等學者針對物件導向設計的特性,提出了 MOOD(Metrics for Object Oriented Design)量測方式[7],其中依據物件導向中資訊隱藏的特 性提出了 MHF(Method Hiding Factor)與 AHF(Attribute Hiding Factor)量測 方式,依據類別間繼承的特性提出包含 MIF(Method Inheritance Factor)與 AIF(Attribute Inheritance Factor) 量 測 方 式 , 依 據 多 形 的 特 性 提 出 PF(Polymorphism Factor)量測方式,依據訊息傳遞的特性提出 CF(Coupling Factor)量測方式。. 3、Briand 等學者根據類別間的耦合度(coupling)提出量測方法[12],他們 認為類別間的互動可以分為類別與屬性間的互動 CA(Class-Attribute interactions)、類別與方法間的互動 CM(Class-Method interactions)以及方 法與方法間的互動 MM(Method-Method interactions)等三種主要的類型。. 4、Bieman 和 Kang 根據類別內部定義的方法與變數之關係,提出了 TCC(Tight Class Cohesion)與 LCC(Loose Class Cohesion)兩個類別內聚力 的量測方式[10]。. 以上為常用的物件導向軟體量測方式,有些學者採用上述部分的物 件導向量測方式[15,21],對物件導向軟體的變動衝擊進行量測,以瞭解 引用的量測方式是否可以用來量測物件導向軟體的變動衝擊,以下分別 進行描述 :. (二)、運用物件導向量測方式於變動衝擊分析之相關研究. 1、Chaumun 等學者運用 WMC 量測法針對一個商用電信系統進行量測, 並探討 WMC 是否適合用來量測物件導向軟體的變動衝擊,結果發現 15.
(25) WMC 量測方式可以用來量測物件導向軟體的變動衝擊,亦即當 WMC 的 值越高時,物件導向軟體的變動衝擊情形就會越大[15]。但是只依據類別 成員函數的總數來判定變動的衝擊,則顯的過於單純,且不易於了解造 成變動衝擊的關鍵為何。. 2、Briand 等學者運用 18 項的耦合力量測方式包括 CBO、MPC(Message Passing Coupling)[25]、ICP(Information-flow-based coupling)[24]等,針對 一個 C++語言所撰寫的商用系統進行量測,以瞭解軟體因為變動而產生 的漣漪效應,結果證明各項耦合力的量測方式,皆與軟體因為變動而產 生的漣漪效應呈現正向的關係[11]。. 3、Kabaili 等學者以類別內聚力的角度探討軟體的變動衝擊情形,其中運 用 LCC 與 LCOM 量測方式以量測軟體的變動衝擊情形,但結果顯示 LCC 與 LCOM 量測方式並不適合用來量測軟體的變動衝擊情形[21]。然而, 造成此結果的原因,很有可能是因為該受測軟體,原本就有很高的設計 品質,因此並不容易產生變動的衝擊,進而造成此二項內聚力量測方式 無法應用於量測該受測軟體的變動衝擊。. 由上述相關研究的結果可知,目前對於運用相關物件導向量測方式 在變動衝擊分析上的相關研究,大多是運用在程式碼的變動衝擊分析, 且運用的量測方式,僅可以單純的判斷類別間的關係,並無法真正的指 示出造成變動衝擊瓶頸的類別為何,因此本研究將會根據物件導向軟體 變動衝擊的相關因素,結合目前所提出之物件導向量測方式,提出一套 整合性的變動衝擊量測模式,並針對物件導向設計作出量測,以瞭解受 量測的物件導向設計對於後續維護作業可能產生的變動衝擊。. 16.
(26) 第參章 物件導向設計變動衝擊分析 本章根據表 2-1 所提出物件導向軟體變動情況,分析在各種變動的情 況下可能產生的變動衝擊,同時將根據物件導向設計可能出現的情況進 行分析,以瞭解造成變動衝擊的關鍵所在。. 一、類別間變動衝擊分析 在傳統結構化開發方式中,當某個模組進行變動後,經常會影響其 他模組的正常運作,因而造成許多模組亦必須進行修改,這種情況稱為 連漪效果。連漪效果的情況,同樣會發生在物件導向軟體開發方式中。 然而,因為物件導向的相關特性,如繼承、多形等,有別於結構化的開 發方式,造成連漪效果在此二種開發方式的產生情形亦有所不同[28]。在 此以類別間的關係,分析物件導向軟體進行變動時,所可能產生的衝擊 情況。根據表 2-1 所示,在類別間的變動方面,主要可分為繼承性與非繼 承性連結關係的變動,同時在各關係中。依據這二種連結關係,分析因 變動而會造成的衝擊如下 :. (一)、繼承關係 在繼承關係中類別變動的情形,主要可以由抽象及非抽象類別變動 的情況加以分析,以下分別加以探討之 :. 1、抽象類別的新增/刪除 新增一個抽象類別對現有類別造成衝擊的情形,以圖 3-1 為例,在圖 3-1(a)中,類別 A 為現有的類別,當新增一個抽象類別時,如圖 3-1(b)所 示,此時類別 A 必須進行修改才能夠繼承類別 B。因此,新增抽象類別 的變動情況,將會造成變動的衝擊。刪除抽象類別對現有的類別造成的 衝擊情形,以圖 3-1(b)為例,類別 A 繼承類別 B,當類別 B 被刪除時, 17.
(27) 將造成類別 A 必需要進行修改,才能夠正常的運作。因此,刪除抽象類 別的變動情況,亦將會造成變動的衝擊。. B d3 d4 d5. A d1 d2. A d1 d2. m2() m3() m4(). m1(). m1(). (a). (b) 圖 3-1 類別繼承關係(抽象類別變動). 2、非抽象類別的新增/刪除 新增一個非抽象類別對現有的類別所造成的影響,可以圖 3-2 為例, 在圖 3-2(a)中,類別 A 為現有的類別,此時新增一個非抽象的類別來繼 承類別 A 時,如圖 3-2(b)所示,類別 A 並不會因為非抽象類別的新增, 而需要進行任何的修改。因此,新增非抽象類別的變動情況,並不會造 成變動的衝擊。刪除非抽象類別對現有類別造成的影響,以圖 3-2(b)為 例,類別 B 繼承類別 A,當類別 B 被刪除時,類別 A 並不會因為類別 B 的刪除而需要進行任何的修改。因此,刪除非抽象類別的變動情況,並 不會造成變動的衝擊。. A d1 d2. A d1 d2. m1(). m1(). (a). B. (b) 圖 3-2 類別繼承關係(非抽象類別變動). 18.
(28) 3、抽象/非抽象類別範圍的變更 抽象類別範圍的變更,主要以 Public 類別轉變為 Private 類別以及 Protected 類別轉變為 Private 類別而造成變動衝擊。Public 類別轉變為 Protected 類別、Protected 類別轉變為 Public 類別、Private 類別轉變為 Public 類別以及 Private 類別轉變為 Protected 類別則不會產生衝擊。另外,非抽 象類別範圍的變更,並不會對抽象類別造成影響,因此不會造成變動的 衝擊。. 在繼承關係中,因為變動而造成的衝擊情形,整理如表 3-1 所示。從 繼承關係的變動衝擊情形中可以得知,造成變動衝擊產生的關鍵,主要 是集中在抽象類別,而在非抽象類別的變動方面,並不會造成變動的衝 擊。. 表 3-1 繼承關係變動衝擊評估表 繼承關係變動情形. 是否產生 變動衝擊. 抽象類別新增. 是. 抽象類別刪除. 是. 抽象類別範圍變更. 是. 非抽象類別新增. 否. 非抽象類別刪除. 否. 非抽象類別範圍變更. 否. (二)、非繼承性其他連結關係 非繼承性其他連結關係,可以分為關連以及聚合關係,而主要的變 動情形為相依及一般類別的變動,在此分析二種關係因為變動而產生的 19.
(29) 衝擊情形 :. 1、相依類別新增/刪除 在關連關係中新增相依類別所可能造成的衝擊情形,以圖 3-3(a)為 例,類別 A 為現有的類別,當新增一個類別 B 後,由於類別 A 為了引用 類別 B 的資料成員或成員函數,使得類別 A 必須進行修改,因此在關連 關係下,相依類別的新增將造成變動的衝擊。另外,在關連關係中刪除 相依類別所可能造成的衝擊情形,以圖 3-3(a)為例,類別 A 引用類別 B, 當類別 B 受到刪除後,將造成類別 A 同時必須進行修改。因此,在關連 關係中,相依類別的刪除將會造成變動的衝擊。在聚合關係方面,聚合 關係中新增相依類別時造成衝擊情況的原因,以圖 3-3(b)為例,類別 A 為現有類別,此時新增一類別 B 且為類別 A 所引用,類別 A 為了引用類 別 B,本身則必須進行增加引用關係,因此在聚合關係下,相依類別的 新增將造成變動的衝擊。另外,在聚合關係中刪除相依類別時,可能造 成衝擊情況的原因,以圖 3-3(b)為例,類別 A 引用類別 B,當類別 B 受 到刪除後,類別 A 將會受到影響而須進行修改。因此,在聚合關係中, 相依類別的刪除將會造成變動的衝擊。. A d1 d2. B d3 d4. A d1 d2. B d3 d4. m1() m2(). m3() m4(). m1() m2(). m3() m4(). (a). (b). 圖 3-3 非繼承性其他連結關係變動. 2、一般類別新增/刪除 在關連關係中新增一般類別所造成的衝擊,以圖 3-3(a)為例,類別 B 20.
(30) 為現有的類別,當新增一個類別 A 引用類別 B,由於類別 A 引用類別 B 的資料成員或成員函數,並不會造成類別 B 必須隨著修改,因此在關連 關係中,一般類別的新增並不會造成變動的衝擊。另外,在關連關係中 刪除一般類別時,造成衝擊產生的原因,以圖 3-3(a)為例,類別 A 引用 類別 B,當類別 A 受到刪除後,類別 B 並不會因為類別 A 的刪除而必須 要配合修改,因此在關連關係中,一般類別的刪除並不會造成變動的衝 擊。在聚合關係方面,聚合關係中新增一般類別所可能造成的衝擊,以 圖 3-3(b)為例,類別 B 為現有的類別,現新增一個類別 A 引用類別 B, 由於類別 A 引用類別 B 並不會造成類別 B 的修改,因此在聚合關係下, 一般類別的新增並不會造成變動衝擊的產生。另外,在聚合關係中刪除 一般類別時,主要造成衝擊情況的原因,以圖 3-3(b)為例,類別 A 引用 類別 B,當類別 A 受到刪除後,類別 B 並不會因為類別 A 的刪除而須要 配合修改,因此在聚合關係中,一般類別的刪除並不會造成變動的衝擊。. 3、相依/一般類別範圍變更 在關連關係中相依類別範圍變動所產生的衝擊,主要以 Public 轉變 為 Protected 及 Private 為主,使得引用該類別的類別需要配合修改。如果 該類別預設為 Protected 及 Private,由於其他的類別原本就無法引用,因 此並不會造成變動的衝擊,同時,類別由 Protected 轉變為 Public 以及 Private 類別轉變為 Public 則是不會產生衝擊。另外在關連關係中一般類 別範圍的變更,由於原類別是引用其他的類別,因此類別本身範圍變更 並不會造成變動的衝擊。在聚合關係方面,在聚合關係中相依類別範圍 變動所產生的衝擊,同樣是以 Public 轉變為 Protected 及 Private 為主,使 得引用該資料成員的類別需要配合修改。若是該類別預設為 Protected 及 Private,由於其他的類別原本就無法引用,因此並不會造成變動的衝擊, 同時,類別由 Protected 轉變為 Public 以及 Private 類別轉變為 Public 則不 21.
(31) 會產生衝擊。另外,在聚合關係中一般類別範圍的變更,由於原類別是 引用其他的類別,因此類別本身範圍的變更亦不會造成變動的衝擊。. 在非繼承性連結關係中,因為變動而造成的衝擊情形,整理如表 3-2 所示。從變動衝擊情形中可以得知,會造成變動衝擊情形產生的關鍵, 主要是集中在相依類別上,一般類別變動並不會造成變動衝擊情況。. 表 3-2 非繼承性連結關係變動衝擊評估表 非繼承性連結關係變動情形. 是否產生變動衝擊 關連關係. 聚合關係. 相依類別新增. 是. 是. 相依類別刪除. 是. 是. 相依類別範圍變更. 是. 是. 一般類別新增. 否. 否. 一般類別刪除. 否. 否. 一般類別範圍變更. 否. 否. 二、類別內變動衝擊分析 根據表 2-1 所示,類別內的變動情形,分別是資料成員與成員函數的 變動情形。在此針對資料成員及成員函數不同的變動情形,對於繼承及 非繼承性連結關係所造成的變動衝擊作出分析 :. (一)、繼承關係. 1、抽象類別資料成員新增/刪除 抽象類別新增或刪除資料成員時,對現有的類別造成的影響,主要 22.
(32) 在於繼承該抽象類別的類別,以圖 3-4(a)為例,類別 B 繼承類別 A,當抽 象類別新增資料成員 d3 時,如圖 3-4(b)所示,類別 B 為了要使用類別 A 的資料成員 d3,因此必須進行修改。相同的情況,以圖 3-4(b)為例,當 類別 A 的資料成員 d3 刪除後,原本有使用資料成員 d3 的類別 B 將會受 到影響。因此抽象類別內資料成員的新增或刪除,將造成變動的衝擊。. A d1 d2. A d1 d2 d3. B. (a). B. (b) 圖 3-4 類別繼承關係(資料成員變動). 2、非抽象類別資料成員新增/刪除 非抽象類別新增或刪除資料成員,並不會對抽象類別產生衝擊的影 響。. 3、抽象/非抽象類別資料成員型態變更 資料成員的型態變動時所產生的衝擊,亦是以繼承此抽象類別的類 別為主。非抽象類別型態的變更,並不會對抽象類別造成影響,因此不 會有變動的衝擊。. 4、抽象/非抽象類別資料成員範圍變更 抽象類別資料成員範圍的變更,主要由 Public 轉變為 Private 以及 Protected 轉變為 Private 而造成變動衝擊。Public 轉變為 Protected、Protected 轉變為 Public、Private 轉變為 Public 以及 Private 轉變為 Protected 則不會 產生衝擊。另外,非抽象類別資料成員的刪除,並不會對受到繼承的抽 23.
(33) 象類別產生衝擊影響。. 5、抽象類別成員函數新增/刪除 抽象類別新增成員函數時,對現有的類別造成的影響,主要在於繼 承該抽象類別的類別。以圖 3-5(a)為例,類別 B 繼承類別 A,當類別 A 新增成員函數 m3 時,類別 B 為了能夠使用類別 A 的成員函數,則必須 進行修改才能夠使用。相同情況,以圖 3-5(b)為例,若將類別 A 的成員 函數 m3 進行刪除,將對類別 B 產生影響,因此抽象類別內成員函數的 新增或刪除,將造成變動的衝擊。. A A B. B. m1() m2() m3(). m1() m2(). (a). (b) 圖 3-5 類別繼承關係(成員函數變動). 6、非抽象類別成員函數的新增/刪除 非抽象類別成員函數的新增或刪除,並不會對抽象類別產生衝擊影 響。. 7、抽象/非抽象類別成員函數範圍的變更 抽象類別成員函數範圍的變更,主要由 Public 轉變為 Private 以及 Protected 轉變為 Private 而造成變動衝擊。Public 轉變為 Protected、Protected 轉變為 Public、Private 轉變為 Public 以及 Private 轉變為 Protected 則不會 產生衝擊。另外,非抽象成員函數範圍的變更,並不會對抽象類別造成 影響,因此不會有變動衝擊的產生。 24.
(34) 8、抽象/非抽象類別成員函數傳回型態的變更 在繼承關係中,抽象類別成員函數並不會傳回任何值給非抽象的類 別,因此抽象類別資料成員傳回型態的變更,並不會對繼承的類別產生 變動衝擊。另外,非抽象類別成員函數傳回型態的變更,亦不會對抽象 類別產生變動衝擊。. 9、抽象/非抽象類別成員函數邏輯變動 在抽象類別中,成員函數邏輯變動,將使繼承此抽象類別的類別產 生影響,另外,在非抽象類別中,類別成員函數邏輯的變動,則是不會 對抽象類別產生影響。. 類別內資料成員及成員函數變動在繼承關係中所產生的衝擊情形, 整理如表 3-3 所示,其中仍以抽象類別資料成員及成員函數變動所造成的 衝擊為主,非抽象類別的資料成員及成員函數變動並不會造成影響。. 表 3-3 類別內變動衝擊評估表(繼承關係部分) 繼承關係變動情形. 是否產生 變動衝擊. 抽象類別資料成員新增/刪除、型態變更以及範圍變更. 是. 非抽象類別資料成員新增/刪除、型態變更以及範圍變更. 否. 抽象類別成員函數新增/刪除、範圍變更、邏輯變動以及 傳回型態的變更 非抽象類別成員函數新增/刪除、範圍變更、邏輯變動以 及傳回型態的變更. 25. 是. 否.
(35) (二)、非繼承性其他連結關係. 1、相依類別資料成員的新增/刪除 在關連關係中,相依類別新增資料成員時,對現有類別造成的影響, 主要在於將要引用該資料成員的類別,為了要引用該類別的資料成員而 必須進行修改,因此相依類別內資料成員的新增,將造成變動衝擊。另 外,在關連關係中相依類別刪除資料成員,由於是受到其他類別的引用, 造成其他類別需要進行修改,因此在關連關係中相依類別資料成員的刪 除,會造成變動的衝擊。在聚合關係方面,聚合關係中相依類別新增資 料成員時,對現有的類別造成的影響,主要在於將要引用該資料成員的 類別,為了要引用該類別的資料成員而必須進行修改,因此相依類別內 資料成員的新增,將造成變動衝擊。在聚合關係中,相依類別刪除資料 成員,由於是受到其他類別的引用,因此會造成其他類別需要進行修改, 在聚合關係中相依類別資料成員的刪除,會造成變動的衝擊。. 2、一般類別資料成員的新增/刪除 在關連關係中一般類別新增資料成員,並不會產生變動衝擊。同時, 在關連關係中一般類別資料成員的刪除,由於是引用其他類別的資料成 員,因此本身資料成員的刪除,並不會產生變動的衝擊。在聚合關係方 面,聚合關係中一般類別新增資料成員,同樣不會產生變動衝擊。另外, 在聚合關係中一般類別資料成員的刪除,亦不會產生變動的衝擊。. 3、相依/一般類別資料成員型態變更 在關連關係中相依類別資料成員型態的變更,主要會對引用到此資 料成員的類別造成影響,因此會產生變動的衝擊。一般類別資料成員型 態的變更,並不會對受到引用的類別造成影響,因此並不會有變動的衝 26.
(36) 擊。在聚合關係方面,聚合關係中相依類別資料成員型態的變更,主要 會對引用到此資料成員的類別造成影響,因此會產生變動的衝擊。一般 類別資料成員型態的變更,亦不會有變動的衝擊的產生。. 4、相依/一般類別資料成員的範圍變更 在關連關係中相依類別資料成員範圍變動所產生的衝擊,主要以 Public 轉變為 Protected 及 Private 為主,使得引用該資料成員的類別需要 配合修改。如果資料成員函數預設為 Protected 及 Private,由於其他的類 別原本就無法引用,因此並不會造成變動的衝擊,另外資料成員由 Protected 轉變為 Public 以及 Private 類別轉變為 Public 則不會產生衝擊。 在關連關係中一般類別資料成員範圍的變更,由於原類別是引用其他的 類別,因此本身範圍的變更並不會造成變動衝擊。在聚合關係方面,聚 合關係中相依類別資料成員範圍變動所產生的衝擊,主要以 Public 轉變 為 Protected 及 Private 為主,使得引用該資料成員的類別需要配合修改。 如果資料成員預設為 Protected 及 Private,由於其他的類別原本就無法引 用,因此並不會造成變動的衝擊,另外資料成員由 Protected 轉變為 Public 以及 Private 類別轉變為 Public 則不會產生衝擊。在聚合關係中一般類別 資料成員範圍的變更,由於原類別是引用其他的類別,因此本身範圍的 變更並不會造成變動衝擊。. 5、相依類別成員函數的新增/刪除 在關連關係中,相依類別新增成員函數時,對現有的類別造成的影 響,主要在於引用該類別的類別,為了能夠引用該類別的成員函數,此 類別必須進行修改才能夠引用,因此在關連關係中,相依類別成員函數 的新增,將造成變動衝擊。相依類別刪除成員函數,對現有的類別造成 的影響,主要在於引用該成員函數的類別,如果先前有引用該類別的成 27.
(37) 員函數時,一旦該成員函數受到刪除,引用該成員函數的類別必須進行 修改才能夠正常運作,因此在關連關係中,相依類別內成員函數的刪除, 會產生變動衝擊。在聚合關係方面,聚合關係中相依類別新增成員函數 時,對現有的類別造成的影響,主要在於引用該類別的類別,為了能夠 引用該類別的成員函數,此類別必須進行修改才能夠引用,因此在聚合 關係中,相依類別成員函數的新增,將造成變動衝擊。相依類別刪除成 員函數,對現有的類別造成的影響,主要在於引用該成員函數的類別, 如果先前有引用該類別的成員函數時,一旦該成員函數受到刪除,引用 該成員函數的類別必須進行修改才能夠正常運作,因此在聚合關係中, 相依類別內成員函數的刪除,會產生變動衝擊。. 6、一般類別成員函數的新增/刪除 在關連關係中,一般類別新增資料成員,並不會產生變動衝擊。同 時一般類別刪除成員函數,並不會產生變動衝擊。在聚合關係方面,一 般類別新增資料成員,並不會產生變動衝擊,同時一般類別刪除成員函 數,亦不會產生變動衝擊。. 7、相依/一般類別成員函數範圍的變更 在關連關係中,相依類別成員函數範圍變動所產生的衝擊,主要以 Public 轉變為 Protected 及 Private 為主,使得引用該成員函數的類別需要 配合修改。如果成員函數預設為 Protected 及 Private,由於其他的類別原 本就無法引用,因此並不會造成變動的衝擊,另外成員函數由 Protected 轉變為 Public 以及 Private 類別轉變為 Public 亦不會產生衝擊。在關連關 係中一般類別成員函數範圍的變更,由於原類別是引用其他的類別,因 此本身成員函數範圍的變更並不會造成變動衝擊。在聚合關係方面,聚 合關係中相依類別成員函數範圍變動所產生的衝擊,主要以 Public 轉變 28.
(38) 為 Protected 及 Private 為主,使得引用該成員函數的類別需要配合修改。 如果成員函數預設為 Protected 及 Private,由於其他的類別原本就無法引 用,因此並不會造成變動的衝擊,另外成員函數由 Protected 轉變為 Public 以及 Private 類別轉變為 Public 同樣不會產生衝擊。在聚合關係中一般類 別成員函數範圍的變更,由於原類別是引用其他的類別,因此本身成員 函數範圍的變更並不會造成變動衝擊。. 8、相依/一般類別成員函數傳回型態的變更 在關連關係中,相依類別成員函數傳回型態的變更,對於引用此成 員函數的類別,因為傳回型態的變更,因此造成本身必須進行修改以配 合,因此在關連關係中,相依類別成員函數傳回型態的變更,會造成變 動衝擊。一般類別資料成員傳回型態的變更,並不會產生變動衝擊。在 聚合關係方面,聚合關係中相依類別成員函數傳回型態的變更,對於引 用此成員函數的類別,因為傳回型態的變更,因此造成本身必須進行修 改以配合,因此在聚合關係中,相依類別成員函數傳回型態的變更,會 造成變動衝擊。一般類別資料成員傳回型態的變更,亦不會產生變動衝 擊。. 9、相依/一般類別成員函數邏輯變動 在關連關係中相依類別成員函數邏輯的變動,將對於引用此相依類 別的類別產生變動的衝擊。另外,在一般類別中,類別成員函數邏輯的 變動,則是不會對受到引用的類別產生影響。在聚合關係方面,相依類 別中成員函數邏輯的變動,將對於引用此相依類別的類別產生變動的衝 擊。另外,在一般類別中,類別成員函數邏輯的變動,則是不會對受到 引用的類別產生影響。. 29.
(39) 類別內資料成員及成員函數的變動,在非繼承性連結關係中所產生 的衝擊情形,整理如表 3-4 所示,其中會造成變動衝擊的關鍵,主要是集 中在相依類別,一般類別的變動則不會造成影響。. 表 3-4 類別內變動衝擊評估表(非繼承性連結關係部分) 非繼承性連結關係變動情形 相依類別資料成員新增/刪除、型態變更及範 圍變更 一般類別資料成員新增/刪除、型態變更及範 圍變更 相依類別成員函數新增/刪除、範圍變更、傳 回型態變更及邏輯變動 一般類別成員函數新增/刪除、範圍變更、傳 回型態變更及邏輯變動. 是否產生變動衝擊 關連關係. 聚合關係. 是. 是. 否. 否. 是. 是. 否. 否. 三、物件導向設計變動衝擊分析 當一個類別進行變動時,不論是類別內或是類別間的變動,皆有可 能影響到其他類別或本身的運作,而造成變動的衝擊。同時在物件導向 不同的特性下,造成變動衝擊的情況會有所不同,在此分析各種在物件 導向設計中,因為物件導向特性而可能出現的情況,以及這些情況可能 產生的變動衝擊,以了解造成各種變動衝擊的關鍵。. (一)、繼承關係特性 在繼承關係中,依照繼承關係的特性,會有不同繼承的情況,不同 繼承情況造成變動衝擊的關鍵亦有所不同,以下分別進行探討 : 30.
(40) 1、繼承深度情形 繼承關係的一種情形,即為繼承的深度情形(如圖 3-6 所示)。由於在 繼承關係的變動衝擊中,會產生變動衝擊的類別為抽象類別,因此當繼 承深度關係過於深時,一旦其中的抽象類別產生變動,對於直接或間接 繼承該抽象類別的類別,都會受到變動衝擊。以圖 3-6 為例,假設類別 B 受到了變動,則變動衝擊的影響層面將涵蓋類別 C 以及類別 D,甚至因 為出現漣漪效應而影響許多的類別。因此在類別繼承深度的關係中,越 上層的抽象類別就成為變動衝擊產生的關鍵。. A d1 d2. B d3 d4. C d5 d6. D d7 d8. m1() m2(). m3() m4(). m5() m6(). m7() m8(). 圖 3-6 類別繼承深度情形. 2、繼承廣度情形 繼承廣度方面有兩種,一種為多個子類別情形,代表同一個抽象類 別,同時受到許多類別的繼承,如圖 3-7(a)所示。另一種為多重繼承情形 代表同一個類別,同時繼承了多個抽象類別,如圖 3-7(b)所示,以下分別 探討繼承廣度的兩種情形 :. (1)多個子類別情形 多個類別同時繼承同一個抽象類別時,主要會造成變動衝擊的關鍵 即為該抽象類別,以圖 3-7(a)為例,類別 B、C 以及 D 同時繼承類別 A, 只要類別 A 有變動的情形時,影響的範圍將會包含類別 B、C 以及 D。 亦即,當越多的類別同時繼承一個抽象類別時,其產生的變動衝擊情形. 31.
(41) 將會越嚴重,因此造成越多的類別需要進行修改,進而產生漣漪效應。. (2)多重繼承情形 在多重繼承方面,以變動衝擊的角度進行分析,可以發現多個抽象 的類別與繼承它們的類別間,只有一層的繼承關係。亦即,單一抽象類 別的變動只會造成繼承它的子類別受到影響,因此,在多重繼承的情形 中,抽象類別亦是產生變動衝擊的關鍵,但受影響的層級相等於深度一 層的變動衝擊情形。. A. A. B. C. B. C. D. D. (a). (b) 圖 3-7 類別繼承廣度情形. (二)、非繼承性連結關係特性 非繼承性連結關係與繼承關係不同的地方,在於繼承關係有深度的 影響,而非繼承性連結關係影響的層面只會存在於兩類別間、同時繼承 關係並不會有傳回值,且繼承關係的影響僅在於抽象類別的變動,因此, 非抽象類別的變動並不會造成變動衝擊的情形,而非繼承性連結關係的 影響則有可能會在兩類別之間互相產生影響。在非繼承性連結關係中, 造成變動衝擊的類別為相依類別的變動,以下探討在非繼承性連結關係 中,影響變動衝擊情形發生的關鍵 :. 32.
(42) 1、類別間耦合情形 在非繼承性連結關係中,造成變動衝擊影響的類別,主要以相依類 別為主,當相依類別同時被過多類別引用時,很容易因為相依類別的變 動,而使得所有引用它的類別產生變動衝擊,因而造成漣漪效應。以圖 3-8 為例,類別 A 同時受到類別 B、C、D 以及 E 的引用,只要類別 A 有 變動時,類別 B、C、D 以及 E 皆會受到影響,同時若各類別引用的資料 成員及成員函數越多時,對於變動產生的衝擊會越大。. D. A. B. E. C. 圖 3-8 類別間耦合情形. 2、類別間引用強度情形 除了在類別間耦合情形之外,兩個類別間因為資料成員以及成員函 數引用的強度,對於變動衝擊產生的情形亦會有所影響,當相依類別同 時有越多的資料成員或成員函數被其他類別引用時,此情況即為兩類別 間的引用的強度越高。當類別間引用的強度越高時,只要引用類別進行 變動時,就會造成引用它的類別受到影響的機會增加。以圖 3-9 為例,類 別 A 的資料成員 d1 到 d6 同時受到類別 B 的引用,其中類別 B 的成員函 數 m3 引用類別 A 中的資料成員 d1 到資料成員 d3,成員函數 m4 引用類 別 A 中的資料成員 d3 到資料成員 d5,成員函數 m5 引用類別 A 中的資 料成員 d4 到資料成員 d6,為便於說明,在此將類別 B 成員函數所引用 33.
(43) 到類別 A 之資料成員表示於右方,此時,假設類別 A 資料成員 d3 進行 變動時,將同時影響類別 B 成員函數 m3 及 m4,因而造成變動衝擊情形 的產生。. 圖 3-9 類別間引用強度. (三)、類別過載情形 當類別同時受到許多類別繼承及引用時,此類別即屬於過載的情 形,如圖 3-10 所示,類別 A 同時為抽象以及相依類別,並同時被許多類 別直接或間接繼承以及引用,因此當類別 A 進行變動時,將會造成許多 類別受到變體衝擊而形成嚴重的漣漪效應。. G. H. A. B. D. F. E. C. 圖 3-10 類別過載情形. 34.
(44) (四)、類別內特性 當類別同時處理過多不同性質的工作時,將使類別本身容易受到變 動衝擊,將會因此造成過多類別與此類別產生連結的關係,而形成此類 別負擔過重的情況。只要此類別一旦進行變動時,將造成其他與此類別 有連結關係的類別產生變動衝擊,因此必需使各類別的內聚力提高,以 避免因為本身的變動,而對其他的類別造成影響。低內聚力對於類別間 所造成的影響,不論是繼承或是非繼承性連結關係,與低內聚力的類別 有連結關係時,都將容易產生變動的衝擊。. 瞭解在物件導向設計中類別內及類別間的變動衝擊情形後,即可以 知道造成物件導向軟體產生變動衝擊的關鍵為何,由於這些關鍵可能會 造成在後續維護作業進行時,產生嚴重的漣漪效應。因此,若能夠針對 這些變動情形的特性提出改善的方式,將可以降低因變動而產生的衝擊 情形。. 35.
(45) 第肆章 整合性變動衝擊量測模式與調整法則 本章根據造成變動衝擊的相關因素,運用物件導向類別間及類別內 的量測方式,提出一套整合性的變動衝擊量測模式,同時依據整合性的 量測模式,衍生物件導向設計品質的改善法則,以降低物件導向軟體因 為變動而造成的衝擊。. 一、物件導向變動衝擊量測方式 根據物件導向軟體變動衝擊的分析,主要可以分為類別間與類別內 的衝擊,以下依據類別間及類別內變動衝擊的特性,運用相關物件導向 量測方法,提出在類別間及類別內不同情況下的量測方式 :. (一)、繼承關係量測方式 由變動衝擊分析中可以得知,在繼承關係中因變動而造成衝擊的類 別,主要是集中在抽象類別,不論是抽象類別本身在架構上的變動,或 是抽象類別內部資料成員及成員函數的變動,都會造成變動的衝擊。為 了精確的瞭解資料成員及成員函數所造成的影響,在此將資料成員及成 員函數分開計算,以便於分辨出該類別是由於何種原因而導致變動的衝 擊。根據物件導向的特性,子類別繼承了抽象類別的資料成員或成員函 數,但也可以依據類別本身的需要,對繼承到的成員函數進行修改 (overriding),也可以在類別中自行增加所需的資料成員及成員函數。因此 抽象類別變動對於子類別所造成的衝擊強度,就必須視不同繼承的情況 而定,在此引用 AIF 及 MIF 量測方式[8],分別表示某類別在抽象類別的 資料成員或成員函數變動時受到衝擊的強度。首先,以 AIF 表示某類別 因為抽象類別資料成員變動而受到衝擊的強度,AIF 的量測方式如公式 (4.1)所示,其中 Ci 代表受量測的類別,Cj 代表 Ci 的父類別。. 36.
(46) AIF (C i , C j ) =. Ai (C i ) Aa (C i ). (4.1). Aa (C i ) = Ad (C i ) + Ai (C i ) , Aa 代表該類別資料成員的總數。 Ad (C i ) = An (C i ) + Ao (C i ) , Ad 代表該類別本身定義的資料成員總數。 An (C i ) 代表該類別本身新增資料成員的總數。 Ao (C i ) 代表該類別修改資料成員的總數。 Ai (C i ) 代表該類別繼承父類別資料成員的總數。. 在成員函數方面,以 MIF 表示某類別因為抽象類別成員函數變動而 受到衝擊的強度,MIF 的量測方式如公式(4.2)所示,其中 Ci 代表受量測 的類別,Cj 代表 Ci 的父類別。. MIF (C i , C j ) =. M i (C i ) M a (C i ). (4.2). 其中 : M a (C i ) = M d (C i ) + M i (C i ) , M a 代表該類別成員函數的總數。 M d (C i ) = M n (C i ) + M o (C i ) , M d 代表該類別定義的成員函數總數。 M n (C i ) 代表該類別本身新增成員函數的總數。 M o (C i ) 代表該類別修改成員函數的總數。 M i (C i ) 代表該類別繼承父類別成員函數的總數。. 以圖 4-1 為例,類別 B 繼承類別 A,其中類別 B 繼承類別 A 的資料 成員 d1~d4 及成員函數 m1~m4,同時類別 B 本身修改類別 A 的資料成員 d1 及 d2,成員函數 m3 及 m4,並新增資料成員 d5~d7 成員函數 m5~m6。. 37.
(47) B d1 d2 d5 d6 d7. A d1 d2 d3 d4 m1() m2() m3() m4(). m3() m4() m5() m6(). 圖 4-1 類別繼承關係範例. 計算類別 B 因為繼承類別 A 而受到的變動衝擊強度如下所示,首先運用 公式(4.1)計算類別 B 在繼承關係中,對於資料成員可能受到的變動衝擊 強度值 :. An (B) = 3、 Ao (B) = 2、 Ai (B) = 4. Ad (B) = An (B) + Ao (B) = 3 + 2 = 5. Aa (B ) = Ad (B) + Ai (B) = 5 + 4 = 9. AIF ( B, A) =. Ai ( B ) 4 = = 0.44 Aa ( B ) 9. 因此類別 B 對於類別 A 資料成員的變動所會產生的衝擊強度為 0.44,運 用公式(4.2)計算計算類別 B 在繼承關係中,對於成員函數可能受到的變 動衝擊值如下所示 :. M n (B) = 2、 M o (B) = 2、 M i (B) = 4. 38.
數據
相關文件
式,都是將終極實在理解為實體性的存在,本文沿用「根源實在論」 [註 2]
是所有正向指標中最低者;其次是「製造業與營造業合計之固定資 本形成之變動率」與「製造業與營造業合計之 GDP 成長率」,二者 的平均值分別為 5.10 分與 5.13
2-1-1 複變數的概念.
二、為因應國內外環境、我國產業發展及人口結構之改變,勞動部推動
Original plan and elevation of the Teatro Sabbioneta, Vincenzo Scamozzi.. 文藝復興時期劇場
學校須在註冊日通知學生有關的校本應變安排 由於今年為 非抽樣年 ,如個別學校因惡劣天氣 或特殊情況而停課,可根據 校本處理機制
材料 C 可取代材料 B。該公司現有以每千克$20購入 的材料C 的存貨。 材料C
由於此,遂使觀音轉向女神趨近,性質為之一變,成為守護航海平 安之神而被祀奉於海中之島嶼。 10