亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

如何在代碼中自動實現設計規范(組圖)

2019-11-18 11:58:35
字體:
來源:轉載
供稿:網友

  摘要
  
  設計規范只表示純粹的想法;但項目的成功來說,實現這些規范是必須的。傳統的實現方式是代碼評審。Hammurapi是一個遵循設計的工具,提供了自動而且一致的方式來實現設計規范,因此使代碼評審更加有效而輕松。在這篇文章中,作者介紹了Hammurapi的使用,并與其他類似工具進行比較,最后還給出演示如何使用的例子。
  
  作為一個J2EE架構師,我需要分發具體設計給項目團隊。通過UML模型,我也會分發那些捕捉最佳實踐的設計規范。例如,在Struts應用中,我推薦避免在Action類中使用實例變量,因為Action類是單例的,而且多個線程同時訪問一個Action類實例是很平常的。其他例子如在任何DAO應用中,一個重要的設計方針是關閉所有打開的數據庫資源,假如沒有這么做通常將導致災難,尤其是在一個產品環境中。
  
  想法是很好的,但是實現才是要害?,F在最常用的實現設計規范的方法是做代碼評審,通常是有經驗的成員檢查代碼來找出不符合規范的地方。這些代碼可能是沒有遵守編碼規范或者設計規范。
  
  這是一種非常低效的方法,主要表現在兩方面:1、這需要兩種資源(開發人員和評審人員)。2、質量變成評審人員的職責。此外,在我的經歷中,由于評審人員過于重視規范,使得他們與開發人員對立起來,而這對一個團隊來說是不好的。
  
  許多年前,我接觸過Checkstyle,這是一個自動強制代碼規范的工具。他與Ant無縫集成并且由基于xml配置文件來驅動。
  
  Hammurapi是一個與Checkstyle類似的工具,只是他用來強制設計規范。Hammurapi是一個由Pavel Vlasov開發的開源軟件,他可以基于一套設計規范來分析代碼庫。當他碰到違反規范的地方,會在報告中標識。就像Checkstyle一樣,他與Ant無縫集成并且由基于XML配置文件來驅動。
  
  運行Hammurapi
  
  你可以直接從命令行運行Hammurapi或者作為Eclipse的插件來使用。在這篇幅文章中,我主要討論如何通過Ant任務來運行Hammurapi。
  
  注重:你可以從資源中下載與本文對應的源程序。
  
  與Ant集成非常輕易,如下面代碼所示:
  
  1  <target name="design_review" depends="init">2
  <taskdef name="hammurapi" classname="org.hammurapi.HammurapiTask">3
  <classpath>4
  <fileset dir="${hammurapi.home}/lib">5
  <include name="**/*.jar"></include>6
  </fileset>7
  </classpath>8
  </taskdef>9
  <hammurapi>10
  <src dir="src"/>11
  <output dir="docs/review"/>12
  <classpath>13
  <pathelement location="${$log4j.home}/lib/log4j.jar"http://>14
  <pathelement location="${weblogic.home}/lib/weblogic.jar"http://>15
  </classpath>16
  </hammurapi>17
  </target>
  
  第一行定義了一個design_review的目標。他依靠于init目標—初始化構建的屬性(如第四行的${hammurapi.home})。第二行定義了一個“hammurapi”新任務。這個Ant任務由org.hammurap.HammurapiTask類實現。內嵌的classpath元素定義了定義這個任務所需要的類庫。
  
  第九行聲明了一個先前定義的hammurapi任務。運行這個任務相當簡單:只要定義內嵌的src元素就可以了,他會告訴任務上哪兒查找源程序;然后定義另一個元素output,這告訴任務在哪兒輸出報告。第十行告訴任務在項目任務目錄下的src目錄下查找需要評審的源程序。第十一行告訴任務輸出報告到項目目錄下的docs/review中。
  
  第十二行的classpath元素是可選的,他定義了源程序依靠的類庫位置。
  
  Hammurapi帶有100多個內建的檢查器。每一個對應一個設計規范。
  
  先前列出的Ant代碼片斷將在log4j源程序上運行Hammurapi。代碼將被解壓到項目目錄下的src目錄。圖1顯示了生成的報告的打開頁面。Hammurapi最令人激動的特性就是他生成的全面的報告。
  
 如何在代碼中自動實現設計規范(組圖)(圖一)

  圖1例示了報告report.Html的主頁,右邊的框架顯示了三個標題:結果、嚴重性小結和文件。
  
  結果段落顯示整體評審的統計。如圖1中所示,26個包中的179個文件被評審了;其中包含6344違反規范的地方。
  
  嚴重性小結段落以表的方式來顯示違反規范的地方。每一項屬于一個嚴重級別。預定義的級別包含1-5級。級別1是最嚴重的。
  
  文件段落(圖2)列出了每一個被評審的文件和他所違反的規范。
  
 如何在代碼中自動實現設計規范(組圖)(圖二)

  雖然嚴重性小結段落可以回答如多少空catch塊被找到,文件段落可以回答在Appender.java中多少規范被違反。但是Hammurapi最有用的功能是他可以在報告中顯示違反規范所在的代碼行數。如讓我們分析一下設計規范ER002:空catch塊(圖2)。點擊數字列的超鏈就可以顯示報告這個違反的文件,如圖3所示。
  
 如何在代碼中自動實現設計規范(組圖)(圖三)

  在很多文件中,報告顯示LogRecord.java (3)在第307行違反了這個規范。在行數下的超鏈直接鏈接到源程序,如圖4的示。
  
 如何在代碼中自動實現設計規范(組圖)(圖四)

  雖然從整個代碼庫的運行Hammurapi是最常用的方式,但你也可以使用增量的評審自上一次評審后改變的代碼。這在代碼庫非常大評審需要很長時間時非常有用。
  
  另一個運行Hammurapi的有效方式是可以處理壓縮文件和其所依靠的并生成壓縮的結果文件。這種方式在開發團隊分布在不同的地理位置時非常有用。在這個情況下,源程序被壓縮并傳送到遠程的評審點。
  
  其他設計評審工具
  
  Hammurapi并非是僅有的代碼評審工具。Metrics也是一個可以作為Eclipse的很流行的類似工具。然而他有兩個主要的缺點:首先他和Eclipse緊密結合,想要與Ant結合相當麻煩。由于需要Eclipse的類庫,這使得不使用Eclipse作為IDE的項目不能使用Metrics。其次,你不能用Metrics構造自定義的檢查器(Hammurapi可以)--這限制了用戶只能使用內建的檢查器。
  
  其他的工具還有PMD。類似于Hammurapi,他與Ant無縫集成而且答應自定義檢查器。然而PMD生成的報告不如Hammurapi生成的報告全面。
  
  Hammurapi如何工作
  
  Hammurapi這樣的代碼分析工具都帶有語言分析器。語言分析器是一種輸入語言代碼并輸出抽象語法樹的工具。這個樹上的節點代表語言標識。例如,考慮一下簡單的算術表達式:3+4. 語言分析器會解析他成為一個如圖5所示的語法樹。在這個樹中,節點+代表操作符標識。節點3和4是操作數標識。
  
 如何在代碼中自動實現設計規范(組圖)(圖五)

  Hammurapi使用ANTLR(另一個語言識別工具)作為語言分析器。然而ANTLR API是相當底層的。為改善可用性,Hammurapi使用另一個API,基于ANTLR 的JSEL(Java源程序工程類庫),來訪問抽象語法樹。
  
  一旦樹構建完成,一種樹遍歷算法就被用來訪問樹中每一個節點。每次訪問到一個節點,一種回調機制(Visitor模式)被用來提示相應的檢查器。在這些回調方法中,檢查器收集相關的信息來確定是否有違反規范的地方存在。
  
  構建自定義的檢查器
  
  一個自定義檢查器可以更好理解Hammurapi框架。如前面所提,一種Struts的最佳實踐是避免Action類中的實例變量。所以我們會構建一個自定義檢查器ActionClassInspector,他掃描源程序中的Action類,假如一個Action類被發現,他就掃描是否存在實例變量。假如一個以上的實例變量被發現,他就標識出相應的違反。
  
  圖6例示了ActionClassInspector類的變量和方法。所有的檢查器都繼續自org.hammurapi.InspectorBase類。
  
 如何在代碼中自動實現設計規范(組圖)(圖六)

  圖7例示了Hammurapi框架激活ActionClassInspector類的回調方法的時序圖??蚣芙馕鲈闯绦虿嫿ㄒ粋€抽象語法樹,然后訪問樹中的每一個節點。當一個類節點被訪問時,他調用visit( v:VariableDefinition )方法。因為通常一個類可能包含多個變量,這個方法可能會被調用多次。
  
如何在代碼中自動實現設計規范(組圖)(圖七)

  下面的代碼顯示了visit( c:Class )方法:
  
  1  public void visit( com.pavelvlasov.jsel.Class c ) throws Exception2
  {3
  isActionClass = c.iSKINdOf( "org.apache.struts.action.Action");
  45   return;6  }
  
  這個方法負責確定是否一個特定的類是Action類。這個測試在第三行被執行。假如測試是肯定的,那么isActionClass被設置為真。這個規范僅應用于Action類。
  
  下面的代碼例示了visit( v:VariableDefinition )方法:
  
  1  public void visit( com.pavelvlasov.jsel.VariableDefinition v ) throws Exception2
  {3
  List modifiers;4
  Scope scope;56
  if( this.isActionClass )7
  {8
  modifiers = v.getModifiers( );9
  scope = v.getEnclosingScope( );10
  if( scope instanceof com.pavelvlasov.jsel.impl.ClassImpl )11
  {12
  if( modifiers.contains( "static" ) )13
  {14
  ;//Do nothing; this class is compliant.15
  }16
  else17
  {18
  context.reportViolation( (SourceMarker)d, "Violation" );19
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品在线播放| 国产97色在线|日韩| 久久人体大胆视频| 久久精品中文字幕一区| 日韩网站在线观看| 久久躁日日躁aaaaxxxx| 日韩中文字幕av| 欧美性受xxxx黑人猛交| 97激碰免费视频| 日韩精品久久久久久福利| 青青草一区二区| 欧美一级电影免费在线观看| 国产精品一区二区女厕厕| 亚洲人成电影在线观看天堂色| 欧美一级电影在线| 国产精品高精视频免费| 搡老女人一区二区三区视频tv| 欧美电影免费观看高清完整| 欧美性猛交xxxx富婆弯腰| 国产成人精品电影久久久| 日本免费一区二区三区视频观看| 欧美成人自拍视频| 亚洲第一偷拍网| 精品视频在线导航| 久久青草福利网站| 久久韩国免费视频| 成人福利网站在线观看| 精品国产精品三级精品av网址| 日韩在线一区二区三区免费视频| 欧美精品videos另类日本| 日韩一区二区欧美| 久久777国产线看观看精品| 这里只有视频精品| 热99在线视频| 伦理中文字幕亚洲| 性亚洲最疯狂xxxx高清| 中文字幕亚洲国产| 精品国产自在精品国产浪潮| 欧美大秀在线观看| 亚洲精品www久久久久久广东| 精品成人av一区| 国产精品久久久av久久久| 精品亚洲一区二区三区在线观看| 亚州欧美日韩中文视频| 啪一啪鲁一鲁2019在线视频| 日韩在线观看免费全集电视剧网站| 欧美日韩国产精品一区二区三区四区| 日韩在线欧美在线| 亚洲人成网站999久久久综合| 日韩有码在线播放| 亚洲a一级视频| 久久精品一本久久99精品| 国产精品久久91| 国产精品扒开腿做爽爽爽视频| 亚洲激情视频网| 日韩欧美成人网| 欧美高清在线视频观看不卡| 国产精品久久久久久久久久免费| 26uuu久久噜噜噜噜| www.亚洲一区| 91网站免费观看| 亚洲精品视频播放| 91禁国产网站| 国产精品精品久久久| 色综合久综合久久综合久鬼88| 精品视频在线播放色网色视频| 欧美激情喷水视频| 美女精品视频一区| 久久69精品久久久久久久电影好| 欧美在线观看日本一区| 清纯唯美亚洲综合| 欧洲美女7788成人免费视频| 亚洲电影成人av99爱色| 亚洲精品国产精品久久清纯直播| 国产精品黄页免费高清在线观看| 成人av.网址在线网站| 亚洲加勒比久久88色综合| 欧美中在线观看| 亚洲一品av免费观看| 26uuu另类亚洲欧美日本老年| 欧美极品少妇xxxxⅹ免费视频| 午夜欧美大片免费观看| 欧美精品在线第一页| 国产亚洲精品美女久久久久| 国产午夜精品麻豆| 亚洲韩国青草视频| 91人人爽人人爽人人精88v| 久久成人精品一区二区三区| 色午夜这里只有精品| 精品视频—区二区三区免费| 欧美一区二粉嫩精品国产一线天| 国产亚洲精品久久久优势| 久久九九全国免费精品观看| 久久理论片午夜琪琪电影网| 久久久成人的性感天堂| 奇米影视亚洲狠狠色| 热久久这里只有| 欧美风情在线观看| 亚洲成人久久一区| 成人久久精品视频| 日韩一中文字幕| 欧美成人精品一区二区三区| 激情亚洲一区二区三区四区| 亚洲一区二区三区视频播放| 亚洲男女自偷自拍图片另类| 久久的精品视频| 久久精品国产91精品亚洲| 国产精品欧美日韩| 欧美最顶级丰满的aⅴ艳星| 精品久久久在线观看| 韩国精品久久久999| 国产精品18久久久久久麻辣| 96国产粉嫩美女| 成人性生交大片免费观看嘿嘿视频| 成人黄色在线观看| 亚洲欧美激情一区| 久久九九免费视频| 中国人与牲禽动交精品| 日韩精品在线电影| 久久99久久亚洲国产| 欧美在线观看网站| 欧美性20hd另类| 久久精品视频导航| 国产精品色午夜在线观看| 日韩免费av在线| 国产一区二区三区在线观看网站| 国产一区二区在线免费视频| 久久久久99精品久久久久| 久久99青青精品免费观看| 亚洲自拍欧美色图| 久久久久久久色| 操人视频在线观看欧美| 国产精品久久久久77777| 国产一区二区三区精品久久久| 久久久精品国产网站| 欧美日韩免费区域视频在线观看| 91丝袜美腿美女视频网站| 国内精品视频一区| 亚洲美女免费精品视频在线观看| 日韩日本欧美亚洲| 亚洲国内高清视频| 97人洗澡人人免费公开视频碰碰碰| 国产精品极品美女粉嫩高清在线| 91日本在线视频| 久久精品视频网站| 亚洲区一区二区| 成人h片在线播放免费网站| 亚洲深夜福利网站| 97视频在线观看网址| 日韩av黄色在线观看| 91精品免费久久久久久久久| 欧美日韩第一页| 精品久久久久久久中文字幕| 国内伊人久久久久久网站视频| 92裸体在线视频网站| 亚洲一区二区三区四区在线播放| 色噜噜狠狠狠综合曰曰曰| 国产精品久久久久久av| 国产精品久久久久久久久久久久| 亚洲欧美日韩国产中文专区| 狠狠干狠狠久久| 丰满岳妇乱一区二区三区| 亚洲片国产一区一级在线观看| 国产精品夜间视频香蕉|