亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 >
追求代碼質量: 用AOP進行防御性編程
作者:網絡轉載 發布時間:[ 2013/2/25 14:10:13 ] 推薦標簽:

很自然,我也會編寫一個快速測試用例來驗證我的檢驗是否真能避免 NullPointerException,如清單 4 所示:

清單 4. 驗證 null 檢驗

    
@Test(expectedExceptions={RuntimeException.class})
public void verifyHierarchyNull() throws Exception{
 Class clzz = null;
 HierarchyBuilder.buildHierarchy(null);  
}   


在本例中,防御性編程似乎解決了問題。但僅依靠這項策略會存在一些缺陷。

防御的缺陷
關于斷言

清單 3 使用一個條件來驗證 clzz 的值,實際上 assert 也同樣好用。使用斷言,無需指定條件,也不需要指定異常語句。在啟用了斷言的情況下,防御性編程的關注點全部由 JVM 處理。

盡管防御性編程有效地保證了方法的輸入條件,但如果在一系列方法中使用它,不免過于重復。熟悉面向方面編程(或 AOP)的人們會把它認為是橫切關注點,這意味著防御性編程技術橫跨了代碼庫。許多不同的對象都采用這些語法,盡管從純面向對象的觀點來看這些語法跟對象毫不相關。

而且,橫切關注點開始滲入到契約式設計(DBC)的概念中。DBC 是這樣一項技術,它通過在組件的接口顯式地陳述每個組件應有的功能和客戶機的期望值來確保系統中所有的組件完成它們應盡的職責。從 DBC 的角度講,組件應有的功能被認為是后置條件,本質上是組件的責任,而客戶機的期望值則普遍被認為是前置條件。另外,在純 DBC 術語中,遵循 DBC 規則的類針對其將維護的內部一致性與外部世界有一個契約,即人所共知的類不變式。

契約式設計

我在以前的一篇關于用 Nice 編程的文章中介紹過 DBC 的概念,Nice 是一門與 JRE 兼容的面向對象編程語言,它的特點是側重于模塊性、可表達性和安全性。有趣的是,Nice 并入了功能性開發技術,其中包括了一些在面向方面編程中的技術。功能性開發使得為方法指定前置條件和后置條件成為可能。

盡管 Nice 支持 DBC,但它與 Java™ 語言完全不同,因而很難將其用于開發。幸運的是,很多針對 Java 語言的庫也都為 DBC 提供了方便。每個庫都有其優點和缺點,每個庫在 DBC 內針對 Java 語言進行構建的方法也不同;但近的一些新特性大都利用了 AOP 來更多地將 DBC 關注點包括進來,這些關注點基本上相當于方法的包裝器。

前置條件在包裝過的方法執行前擊發,后置條件在該方法完成后擊發。使用 AOP 構建 DBC 結構的一個好處(請不要同該語言本身相混淆!)是:可以在不需要 DBC 關注點的環境中將這些結構關掉(像斷言能被關掉一樣)。以橫切的方式對待安全性關注點的真正妙處是:可以有效地重用 這些關注點。眾所周知,重用是面向對象編程的一個基本原則。AOP 如此完美地補充了 OOP 難道不是一件極好的事情嗎?

結合了 OVal 的 AOP

OVal 是一個通用的驗證框架,它通過 AOP 支持簡單的 DBC 結構并明確地允許:

    為類字段和方法返回值指定約束條件
    為結構參數指定約束條件
    為方法參數指定約束條件

此外,OVal 還帶來大量預定義的約束條件,這讓創建新條件變得相當容易。

由于 OVal 使用 AspectJ 的 AOP 實現來為 DBC 概念定義建議,所以必須將 AspectJ 并入一個使用 OVal 的項目中。對于不熟悉 AOP 和 AspectJ 的人們來說,好消息是這不難實現,且使用 OVal (甚至是創建新的約束條件)并不需要真正對方面進行編碼,只需編寫一個簡單的自引導程序即可,該程序會使 OVal 所附帶的默認方面植入您的代碼中。

在創建這個自引導程序方面前,要先下載 AspectJ。具體地說,您需要將 aspectjtools 和 aspectjrt JAR 文件并入您的構建中來編譯所需的自引導程序方面并將其編入您的代碼中。

自引導 AOP

下載了 AspectJ 后,下一步是創建一個可擴展 OVal GuardAspect 的方面。它本身不需要做什么,如清單 5 所示。請確保文件的擴展名以 .aj 結束,但不要試著用常規的 javac 對其進行編譯。

清單 5. DefaultGuardAspect 自引導程序方面

    
import net.sf.oval.aspectj.GuardAspect;

public aspect DefaultGuardAspect extends GuardAspect{ 
 public DefaultGuardAspect(){
  super();  
 } 
}


AspectJ 引入了一個 Ant 任務,稱為 iajc,充當著 javac 的角色;此過程對方面進行編譯并將其編入主體代碼中。在本例中,只要是我指定了 OVal 約束條件的地方,在 OVal 代碼中定義的邏輯會編入我的代碼,進而充當起前置條件和后置條件。

請記住 iajc 代替了 javac。例如,清單 6 是我的 Ant build.xml 文件的一個代碼片段,其中對代碼進行了編譯并把通過代碼標注發現的所有 OVal 方面編入進來,如下所示:

清單 6. 用 AOP 編譯的 Ant 構建文件片段

    
<target name="aspectjc" depends="get-deps">

 <taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
  <classpath>
   <path refid="build.classpath" />
  </classpath>
 </taskdef>

 <iajc destdir="${classesdir}" debug="on" source="1.5">
  <classpath>
   <path refid="build.classpath" />
  </classpath>
  <sourceroots>
   <pathelement location="src/java" />
   <pathelement location="test/java" />
  </sourceroots>
 </iajc>

</target>

上一頁1234下一頁
軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 视频福利一区 | 欧美人善交vides0 | 一级毛片牲交大片 | 最近免费字幕中文大全在线观看 | 日韩视频第一页 | 阿v天堂2021在线观看 | 国产麻豆久久 | 男女在线观看视频 | 亚洲韩国日本欧美一区二区三区 | 日本中文字幕精品理论在线 | 天天摸夜夜添久久精品麻豆 | 成人小视频免费观看 | 免费看国产黄色片 | 涩涩漫画入口 | 最近的2019中文字幕国语hd | 日韩视频免费一区二区三区 | 亚洲视频精品 | 免费乱人伦 | 亚洲tube| 亚洲乱仑| 欧美午夜艳片欧美精品 | 99爱在线精品视频免费观看9 | 精品亚洲欧美中文字幕在线看 | 欧美日韩一区二区三区在线视频 | 男女做羞羞的网站视频 | 69堂午夜精品视频在线 | 91视频网址入口 | 欧美激情视频二区三区 | 在线簧片 | 五月婷婷视频在线 | 性一交一无一伦一精一品 | 最新亚洲一区二区三区四区 | 午夜私人影院免费体验区 | 国产精品一区二区免费 | 午夜琪琪 | 免费的a级毛片 | 国产一级片播放 | 亚洲精品高清国产麻豆专区 | 翁熄性放纵苏玥完整小说 | 久久精品国产亚洲精品2020 | 欧美人与性禽xxxx |