999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

契約對重構中行為保持的作用

2007-04-29 00:00:00李伯林
計算機時代 2007年9期

摘要:應用軟件重構技術,需要解決修改代碼卻不影響程序原有功能的問題。文章利用契約式程序設計思想解決重構的行為保持問題,給出了契約式重構(Refactoring by Contract)方法,并應用Java語言給出了這種方法的具體實現過程。

關鍵詞:重構;契約;行為保持;屬性;工具

引言

在保證質量的前提下,軟件開發(fā)需要更高的速度和效率。隨著代碼量的增長,對代碼的理解和修改,會變得越來越困難。在軟件開發(fā)過程中使用設計模式可以規(guī)范開發(fā)人員的開發(fā)習慣,繼承優(yōu)秀的開發(fā)經驗,高效地開發(fā)新系統(tǒng)。重構是一種對代碼的修改技術。敏捷軟件開發(fā)實踐提倡“Refactoring to Patterns”,這是目前普遍公認的最好的使用設計模式的方法。在重構過程中最重要的問題是如何保證程序在重構前后的功能不變,因為一旦程序的功能發(fā)生了改變,而這種改變又是不可預期的,那么程序的修改就沒有任何意義了。契約原是經濟領域的一個概念應用在軟件開發(fā)中是指,在軟件修改前,“簽定”一份協議(契約),規(guī)定程序或函數、方法所需要的條件,在程序修改后檢查程序的運行結果以確保在修改后函數或方法的功能仍然未改變。契約式軟件開發(fā)技術提出至今,已經有了一些開發(fā)軟件,可以利用現有的契約式程序開發(fā)軟件作為輔助工具,重構技術的契約化過程就成為了一種可行的、有效的方法。

1 重構的概念和作用

1.1 重構的定義

效率和可維護性可能是進行重構的最重要理由。

重構的一般定義:

重構(Refactoring,名詞):是對軟件的內部結構所作的一種改變,這種改變在可觀察行為(Observable behaviour)不變的條件下使軟件更容易理解,而且修改更廉價。

重構(Refactor,動詞):應用一系列不改變軟件可觀察行為的操作對軟件進行重新組織(restructure)。

定義中最重要的方面是,不改變軟件系統(tǒng)的可觀察行為,并且軟件結構是朝著更好的設計、更容易理解和可重用的方向改變。重構提供了一種以更有效和受控方式清理代碼的技術。Martin Fowler名詞形式的重構定義是說重構是對軟件內部結構的改變,這種改變的前提是不能改變程序的可觀察的行為,這種改變的目的就是為了讓它更容易理解,更容易被修改。動詞形式的定義則突出重構是一種對軟件重構的行為,其方法就是應用一系列的重構操作。

“不能改變程序的可觀察的行為”就是重構之前軟件實現什么功能,之后照樣實現什么功能。任何用戶,不管是終端用戶還是其他的程序員,都不知道也不必知道某些內部的事情所發(fā)生的變化。

1.2 目前重構技術的應用的不足

在Opdyke的一這篇經典文獻中,提出了重構的概念,并分析了程序的特征,探討了使用數學方法保證重構技術中行為保持的可行性。但是文章并未給出軟件開發(fā)過程中可以實際使用的方法或技術,這不能不說是一個遺憾。在Martin Fowler的著作中,他給出了一份重構方法的目錄,總結了實際開發(fā)中存在的重構技術,但是也未給出重構的行為保持方法。在目前的重構工具中,還沒有一款軟件能夠保證重構的行為不變。為了避開這個問題,這些軟件大都實現了比較簡單的重構方法,如rename等。一些比較大型的如Tease Apart Inheritance工具,也不能保證重構后軟件行為不變。因此在軟件開發(fā)過程中,當需要使用重構技術的時候,可以僅僅使用某種軟件的方法,而不是復雜的數學上的公式來方便的監(jiān)測或保證重構的行為不影響程序的功能。

2 契約式程序設計

Design by Contract(DbC,契約式設計)是面向對象軟件大師Bertrand Meyer對軟件構造方法的一個重大貢獻,無論是在形式化的數學證明中,還是在實踐運用中,它都被證明是大幅改善軟件工程質量的有效手段。

每個軟件都是由若干不同的模塊組成的,軟件的錯誤,是指某些模塊沒有正確履行自己的職責。要徹底杜絕軟件錯誤,只有分清各自模塊的責任,并且建立機制,保證各模塊正確履行自己的責任。

如何保證各方恪守職責呢?Eiffel語言引入了契約(Contract)的概念。契約所核查的,是“為保證正確性所必須滿足的條件”,也就是核查模塊是否正確履行自己的職責。

契約式設計就是在設計和編碼階段向面向對象程序中加入斷言(assertion)。所謂斷言,就是必須為真的假設,只有這些假設為真,程序才能正確執(zhí)行并可能做到正確無誤。契約式設計的主要斷言包括先驗條件(precondition)、后驗條件(postcondition)以及不變式(invaIiant):

(1)先驗條件針對方法(method),它規(guī)定了在調用該方法之前必須為真的條件。

(2)后驗條件也是針對方法,它規(guī)定了方法順利執(zhí)行完畢之后必須為真的條件。

(3)不變式針對整個類,它規(guī)定了該類任何實例調用任何方法時都必須為真的條件。

目前,直接在語言層面上應用了契約式設計思想的程序設計語言只有Eiffel,但對于Java和c++,則可以通過添加工具的支持,滿足契約式設計的要求。Java語言的契約式設計的支持工具主要有iContract、Jass、Jcontract、JMSAssert等。

3 契約式重構

3.1 契約對重構中行為保持的作用

契約式設計強制程序模塊在修改和使用之前必須提供保證正確性所必須滿足的條件。利用這一思想可以在重構過程中保持程序的“行為”不發(fā)生變化,從而實現安全性重構。

在對一段程序進行重構之前,要先明確這段代碼的作用及其與程序其他部分的聯系,確定重構的目標。在要重構的代碼前加上契約,規(guī)定類、方法、變量的行為要求,保證程序所接收的是正確的值,并在代碼后加上契約,保證重構后程序模塊的功能是正確無誤的。這樣做的目的是:一方面建立重構前后良好的程序文擋,利于檢查和修改。另一方面,確保重構之后得到合法的程序,使重構之后的程序的行為方式與重構之前等價。

在理解上,契約可以從某種程度上被視為一種“程序代碼”,在代碼本身被修改時,契約也應當做出相應的修改。在重構一段代碼時,首先可以抽象出變化的模型,這個模型除了可以用UML表示外,也可以是以契約的形式來反映我們所要的改變和結果,把契約寫成代碼進行安全性重構。另外注意:在類內引入—個新的方法或變量時,也應當使它們滿足相應的類的契約。

3.2 契約式重構的應用方法

每一個重構方法包括以下的幾個部分:

(1)名稱。

(2)簡要。簡單介紹此重構方法的適用情景及它所做的事情。

(3)動機。介紹為什么需要這個重構和什么情況下不該使用這個重構。

(4)作法。簡明介紹如何進行此重構。

(5)范例。

為了保證重構過程中“不改變代碼的外在的行為”,在重構方法中,添加契約式重構的部分:

(1)回答問題以確定重構的契約:

a.這段代碼的作用是什么?

b.這段代碼中需要被重構的屬性有哪些?改變這些屬性預期會出現哪些結果?

①正常的改變對這些屬性的影響,如添加訪問限制、更改名稱、修改引用等。

②非正常的改變對這些屬性的影響,如對不存在的情況或事件的訪問執(zhí)行等。

c.源代碼中要重構的代碼段與其它部分之間的關系,及影響結果。

d.查找并確定要重構代碼中基本查詢和派生查詢。

e.根據代碼的功能及可能產生的結果確定契約。

(2)執(zhí)行重構方法。

(3)重構結束,運行測試并使用契約支持工具檢測重構的行為保持。

3.3 契約式重構實例

根據以上的研究,結合一個Java程序重構的例子來說明契約式重構的具體實現方法:

這是—個利用順序表實現的城市數據庫,每條數據庫記錄包括城市名和城市坐標,數據庫允許插入記錄、按照名字或者坐標刪除或檢索記錄,還支持打印在指定結點y給定距離內的所有記錄。

首先需要區(qū)分開命令和查詢。查詢返回一個結果,但不改變對象的外在性質;命令改變對象的狀態(tài),但不返回結果。在這里size( )、valueof( )是查詢,remove( )、insert( )是命令。接著將基本查詢同派生查詢區(qū)分開,派生查詢可以用基本查詢來定義。對于每一個命令都寫一個后驗條件,規(guī)定每個基本查詢的值。

在重構的過程中,注意到我們可以利用Extract Class提取—個順序表類ABlist,而保留源代碼不變,因此不必添加契約。接下來注意到變量DefaultSize、msize、numlnlist都屬于類ABlist,先用Move Field將他們復制過去,不更改源代碼中的相應變量。

下一步將ABlist中變量的作用域更改為public,接著更改源代碼中相應的引用,使它們引用ABlist中的變量。這些變量不必添加契約,但它們必須滿足新類中的契約。

然后用Move Method將size( )、valueof( )、insert( )、remove( )逐個的搬移到Ablist中,添加契約。在這里為了節(jié)省篇幅僅詳細解釋insert()的契約:首先,添加的結果是要在順序表里加入一個新的記錄,需要被修改的屬性有size( )、numlnlist,改變的結果會使numlnlist和size()都增加了一個相應量。源代碼中相應引用部分更改為新的類方法。確定契約為:前置條件(@pre)為numlnlist=pos)表明沒有越界插入;后置條件(@post)為size( )==$prev(size( )+1對基本查詢的更改,valueof(city)==pos插入結果。

4 結束語

軟件從往往帶有某種缺陷:或者有bug,或者需要進行擴展。運用重構技術能夠很好地修改代碼,它具有良好的面向對象的設計優(yōu)點,滿足設計原則。契約式重構通過在模塊中加入契約,確保了重構過程中軟件行為保持不變。

主站蜘蛛池模板: 22sihu国产精品视频影视资讯| 日韩欧美91| 国产色婷婷| 国产主播喷水| 亚洲国产成人综合精品2020| 免费国产高清精品一区在线| 在线精品亚洲国产| 久久99精品久久久久纯品| 伊人久久久大香线蕉综合直播| 在线观看国产黄色| 国产精品一区二区不卡的视频| 亚洲日韩图片专区第1页| 欧美第二区| 国产免费a级片| 国产成人精品高清不卡在线 | 亚洲午夜天堂| 天天操天天噜| 日本色综合网| 免费a级毛片视频| 久久综合五月婷婷| 最新国产成人剧情在线播放| 性做久久久久久久免费看| 色呦呦手机在线精品| 无码电影在线观看| 久久久久久高潮白浆| 欧洲亚洲一区| 日韩欧美亚洲国产成人综合| 一本一本大道香蕉久在线播放| 欧美va亚洲va香蕉在线| 99re在线视频观看| 凹凸国产熟女精品视频| 综合五月天网| 久久性妇女精品免费| 一本大道香蕉中文日本不卡高清二区| 国产高清毛片| 亚洲国产天堂久久综合| 亚洲欧美自拍一区| 国产中文一区二区苍井空| 一级毛片在线直接观看| 99视频精品在线观看| 日韩精品无码一级毛片免费| 国产久草视频| 国产在线精品99一区不卡| 国产又黄又硬又粗| 国产亚洲欧美在线中文bt天堂| Aⅴ无码专区在线观看| 欧美成人国产| 国产高清免费午夜在线视频| 国产精品久久久久久搜索| 国产特级毛片aaaaaa| 91精品在线视频观看| 亚洲欧美日韩中文字幕在线| 思思热在线视频精品| 国产迷奸在线看| 国产精品久久久久久影院| 成人av专区精品无码国产| 波多野结衣的av一区二区三区| 国产精品嫩草影院av| 国产精品尤物在线| 亚洲电影天堂在线国语对白| 免费一级α片在线观看| 久久久久久久久久国产精品| 亚洲精品无码专区在线观看| 97在线国产视频| 成人午夜福利视频| 尤物国产在线| 日本三级精品| 一级在线毛片| 激情无码字幕综合| 国产乱子伦精品视频| 免费一级毛片完整版在线看| 夜夜爽免费视频| 99精品福利视频| 国产微拍一区二区三区四区| 亚洲黄色网站视频| 99久久精品免费观看国产| 久久动漫精品| 成人蜜桃网| 国产激情在线视频| 天堂av高清一区二区三区| 国产aⅴ无码专区亚洲av综合网 | 91一级片|