亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

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

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

        引言

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

        1 重構的概念和作用

        1.1 重構的定義

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

        重構的一般定義:

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

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

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

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

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

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

        2 契約式程序設計

        Design by Contract(DbC,契約式設計)是面向?qū)ο筌浖髱烞ertrand Meyer對軟件構造方法的一個重大貢獻,無論是在形式化的數(shù)學證明中,還是在實踐運用中,它都被證明是大幅改善軟件工程質(zhì)量的有效手段。

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

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

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

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

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

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

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

        3 契約式重構

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

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

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

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

        3.2 契約式重構的應用方法

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

        (1)名稱。

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

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

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

        (5)范例。

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

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

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

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

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

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

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

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

        e.根據(jù)代碼的功能及可能產(chǎn)生的結果確定契約。

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

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

        3.3 契約式重構實例

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

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

        首先需要區(qū)分開命令和查詢。查詢返回一個結果,但不改變對象的外在性質(zhì);命令改變對象的狀態(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,或者需要進行擴展。運用重構技術能夠很好地修改代碼,它具有良好的面向?qū)ο蟮脑O計優(yōu)點,滿足設計原則。契約式重構通過在模塊中加入契約,確保了重構過程中軟件行為保持不變。

        中文字幕国产精品专区| 麻豆国产成人av高清在线观看| 一本大道东京热无码中字| 亚洲av毛片成人精品| 亚洲不卡在线免费视频| 亚洲国产成人久久三区| 99久久综合狠狠综合久久| AV中文字幕在线视| 国产黄色三级一区二区三区四区| 免费看男女做羞羞的事网站| 无码aⅴ在线观看| 亚洲日产国无码| 亚洲国产精品国自拍av| 日韩精品久久久久久久电影蜜臀| 91精品一区国产高清在线gif| 国产粉嫩美女一区二区三| 亚洲av一区二区三区蜜桃| 中文字幕乱码亚洲精品一区| 综合网自拍| 人妻精品人妻一区二区三区四五| 在线观看国产成人av天堂野外| 高潮又爽又无遮挡又免费| 精品人妻中文av一区二区三区| 国产av一区二区三区狼人香蕉| 国产免费牲交视频| 日韩精品无码av中文无码版| 97精品国产高清自在线看超| 成人爽a毛片在线播放| 邻居少妇太爽在线观看| 亚洲日韩小电影在线观看| 欧美v亚洲v日韩v最新在线| 国产亚洲精选美女久久久久| 在教室轮流澡到高潮h免费视| 久久久久成人精品无码| 综合精品欧美日韩国产在线| 国产黄色一级到三级视频| 精品福利一区二区三区免费视频 | 亚洲天堂在线视频播放| 大量老肥熟女老女人自拍| 亚洲成av人片女在线观看| 真实单亲乱l仑对白视频|