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

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

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

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

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

引言

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

1 重構的概念和作用

1.1 重構的定義

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

重構的一般定義:

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

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

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

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

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

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

2 契約式程序設計

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

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

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

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

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

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

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

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

3 契約式重構

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

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

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

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

3.2 契約式重構的應用方法

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

(1)名稱。

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

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

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

(5)范例。

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

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

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

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

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

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

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

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

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

(2)執行重構方法。

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

3.3 契約式重構實例

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

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

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

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

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

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

4 結束語

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

主站蜘蛛池模板: 亚洲性网站| 欧美午夜久久| 日韩欧美国产另类| 91麻豆精品国产高清在线| 国产爽爽视频| 日本手机在线视频| 日韩欧美国产区| 青青草一区二区免费精品| 性色生活片在线观看| 国产69精品久久久久孕妇大杂乱 | 日韩区欧美区| 欧美黑人欧美精品刺激| 亚洲人成网站在线播放2019| 3p叠罗汉国产精品久久| 好紧好深好大乳无码中文字幕| 国产爽妇精品| 亚洲精品在线91| 57pao国产成视频免费播放| 国产精品无码AV中文| 亚洲一区二区约美女探花| 日韩色图区| 特级做a爰片毛片免费69| 国产97公开成人免费视频| 日韩高清一区 | 一本久道热中字伊人| 8090午夜无码专区| 毛片网站在线看| 亚洲永久免费网站| 丁香五月亚洲综合在线| 成人va亚洲va欧美天堂| 国产成人AV男人的天堂| 久久久精品国产SM调教网站| 91色在线视频| 国产99精品久久| 高清久久精品亚洲日韩Av| 国产自产视频一区二区三区| 亚洲男人的天堂在线观看| 亚洲AⅤ波多系列中文字幕 | 这里只有精品国产| 日本高清有码人妻| 青青操国产视频| 直接黄91麻豆网站| 国产乱子伦一区二区=| 人人艹人人爽| 日本中文字幕久久网站| 好久久免费视频高清| 福利视频99| 日本国产精品一区久久久| 国产成人综合久久| 波多野结衣久久高清免费| 国产亚洲精品97在线观看| 欧美日韩精品综合在线一区| 激情亚洲天堂| 欧美不卡二区| 亚洲精品777| 亚洲欧洲一区二区三区| 久久精品这里只有精99品| 亚洲一级色| 三上悠亚精品二区在线观看| 成人在线不卡| 国产青青草视频| av在线手机播放| 91亚洲精品第一| 亚洲视屏在线观看| 91精品国产综合久久香蕉922 | 国产精品黑色丝袜的老师| www.精品国产| 欧美综合在线观看| 久热这里只有精品6| 亚洲系列中文字幕一区二区| 亚洲中文无码h在线观看| 人妻无码一区二区视频| 四虎影视库国产精品一区| 亚洲日韩欧美在线观看| 狠狠v日韩v欧美v| 一级毛片网| 国产精品欧美在线观看| 国产成人免费视频精品一区二区 | m男亚洲一区中文字幕| 高清乱码精品福利在线视频| 亚洲精品少妇熟女| 亚洲成综合人影院在院播放|