C Java PHP Perl Python 的程序代碼美化工具(Pretty Print Program/Source Code Beautifier)使用

版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
http://www.chedong.com/tech/indent_tools.html

關鍵詞:pretty print indent perltidy pydent astyle htmltidy source code beautifier

內容摘要:
寫本文的目的無非是2個:

  1. 如果前任程序員縮進非常不整齊的代碼非常影響現任維護者的代碼閱讀速度。
  2. 新的項目代碼(無論在什麼編輯環境下編寫)都能夠非常好的適應公司的縮進規範,可以便於開發者之間的交流。

如果馬上能從以下列表中找到你需要的就完全不必耐心的看到最後:相應工具包中的文檔會有更詳細的使用說明

c, c++ c# ==>      

java ==>

php ==>

perl ==>

python ==>

asp ==> VBSBeaut

程序員應該是善於溝通的,代碼美化的意義在於體現了開發者對他人的尊重,使用好的編碼約定可以使源代碼明白、易讀、準確,更加直觀且與其他語言約定保持一致,從而讓程序員之間更好的溝通。

有統計表明縮進良好的代碼可以提高代碼閱讀的效率40%以上,而另一個統計是軟件開發工作的70%以上是維護前人的代碼,因此對以往代碼的格式美化往往也是系統重構(refactoring)的第一步。代碼美化工具(pretty print program)的使用可以使基本的代碼縮進規範成爲一種更容易執行的制度。

另外,如果作爲部門代碼規範的制訂者也應該瞭解程序員不是機器,寫代碼時完全不犯代碼縮進錯誤幾乎是不可能的。基於工具的批量格式化和整理工具方便的配置導入/導出機制制定統一的縮進規範纔是一個真正有可操作性的制度。

幾種開放源代碼的代碼美化工具的介紹

工具名稱適用語言簡介安裝/使用
indentcindent就是代碼美化工具的代名詞indent是gcc附帶的一個標準工具,
indent [options] [input-files]
indent [options] [single-input-file] [-o output-file]
perltidyperl
perltidy本身也是用perl寫的下載後: perl Makefile.PL;make;make install
perltidy [ options ] file1 file2 file3 ...
(output goes to file1.tdy, file2.tdy, file3.tdy, ...)
perltidy [ options ] file1 -o outfile
perltidy [ options ] file1 -st >outfile
perltidy [ options ] <infile >outfile
astylec c++ java (php)一個速度很快的C/C++/Java源代碼美化工具。
astyle比indent好在有很多成套的的風格定義:ansi java linux...不必記住複雜的縮進具體選項。
下載源代碼解包後,make, 生成astyle可執行文件
astyle [options] < Original > Beautified
astyle [options] Foo.cpp Bar.cpp [...]
astyle --style=ansi *.cpp
我嘗試過用它來格式化PHP程序也很有效(當然是不合HTML代碼混在一起的純PHP代碼)。
jalopyjava功能強大的JAVA代碼格式化工具,除了標準界面外,命令行工具,還可作爲ANT JBUILDER ECLIPSE JDEVELOPER等工具的插件使用,並提供APIhttp://prdownloads.sourceforge.net/jalopy/下載
並參考相應安裝文檔
pydentpythonpythius包含了2個工具:
pydent: 代碼縮進工具
pystat: 代碼統計工具
下載源代碼解包後:
Run "python setup.py build"
Run "python setup.py install"
htmltidyhtml/xmlHTML代碼的糾錯工具,可以幫助你的HTML代碼更好的符合W3C規範,現在被稱作tidy,因爲它不僅只使用於HTML,也現在也適用於XHTML XML的格式化。

但JSP不適合ASP PHP JSP等嵌入式腳本的代碼美化

 

下載源代碼後 make 生成tidy可執行文件:
tidy file1 file2 ...
注意:對於含有中文的頁面要使用 -raw選項
tidy.exe -raw -imuq -wrap 132 -f %f.err %f
選項說明:
-raw: 不修改中文字符 (output values above 127 without conversion to entities)
-i indend 缺省HTML按2個空格縮進
-m 覆蓋原文件
-u 強制所有HTML標記大寫(這個可以不加)
-wrap 頁面代碼寬度大於132行強制換行
-f %f.err 將錯誤輸出到“相應文件名.err”文件中
HTMLTIDY支持XML的格式美化:
tidy -xml -imq web.xml
tidy -xml -imq build.xml

其他工具介紹:

php代碼美化工具
phpCB: php code beautifier 有命令行版本,也有圖形界面的代碼查看器。
http://www.phpedit.net/products/phpCodeBeautifier/

Java的代碼美化工具
如果是專門針對JAVA代碼的格式化,Jacobe也是很好的選擇,它缺省包含了一個完全按照SUN的代碼規範的格式化配置文件。而且甚至有JIndent這種商業化代碼整理工具以獲得更好的效果。

ImportScrbber: java import聲明的整理工具,能夠將import java.util.*這樣的引用變成單條的引用,並且幫助刪除已經不再需要的引用。 http://importscrubber.sourceforge.net/

介紹這些工具的都可以在這裏可以找到:Jacobe Jindent Jxbeautifier...
http://directory.google.com/Top/Computers/Programming/Languages/Java/Development_Tools/Code_Beautifiers/

使用命令行工具實現代碼的批量修改

Windows 2000下:用for命令實現目錄遍歷和文件過濾及命令執行,例如:
for /R %f in (*.java) do astyle --style=java %f
for /R %f in (*.htm*) do tidy -raw -imq -wrap 132 -f %f.err %f
for /R %f in (*.asp) do vbsbeaut.exe -i -s4 %f

Linux:用find -exec 遍歷執行,例如:
find ./ -name *.java -exec astyle --style=ansi {} /;

因此不要被很多商業化軟件漂亮的圖形界面所迷惑,當面對上千個源文件時,能夠基於命令行的批量操作也是一個非常重要的功能。

針對Eclipse等IDE開發環境的工具插件使用

越來越多的IDE開發環境都包含了代碼美化功能,但有些仍不如這些專門的工具強大,而且如果開發人員中有的用Eclipse,有的是JBuilder的忠實用戶,如何讓他們都能方便的遵守代碼規範呢?答案就是用全Jalopy針對這些主流IDE開發環境的插件。
Jalopy: Java代碼美化工具: http://jalopy.sourceforge.net/
Eclipse plug-in: http://jalopy.sourceforge.net/plugin-eclipse.html
CheckStyle: Java代碼代碼規範(縮進,命名)檢查工具 http://checkstyle.sourceforge.net
Eclipse plug-in: Eclipse Checkstyle Plug-in

安裝:
作爲Eclipse的插件安裝都非常方便,下載後解包到Eclipse/plug-in/目錄下重啓Eclipse即可:

配置:
Jalopy: Windows ==> Jalopy Preference 配置的導入/導出在General選單中,
CheckStyle: Windows ==> perference ==> checkstyle 配置的導入/導出就在配置界面右側
標準配置的導入/導出功能可以大大降低開發人員針對以上工具的學習時間,對於大部分開發者來說不需要詳細瞭解其中所有的選項配置,只要知道將標準配置導入就可以了。我常用的Jalopy配置文件

使用:
Jalopy: 在代碼編輯界面點右鍵的選單中除了原有的Format選項外,還多出了Format with Jalopy選項,而Eclipse自身帶有的Source=>Orgenize Imports也是能夠達到Imports Srubber同樣的功效。
CheckStyle是一個非常複雜的代碼風格檢查過程:包括縮進,命名規範等,因此缺省是Disable的,啓動針對一個項目的CheckStyle需要在點:項目的properties==>CheckStyle==>Enable。

而且以上這些工具都包含了針對ant的擴展,可以方便的加入到ant腳本中進行自動的代碼整理/統計。


參考資料:

GNU Coding Standards
http://www.gnu.org/prep/standards_toc.html

Code Conventions for the Java(TM) Programming Language
http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html

PHP Coding Standard
http://alltasks.net/code/php_coding_standard.html

Perl Style
http://www.perldoc.com/perl5.6.1/pod/perlstyle.html

pb: Perl/Javascript Beautifier
http://www.arachnoid.com/lutusp/ftp/cgi/pb.txt

HTML XML XHTML CSS...
http://www.w3c.org 

C-C++ Beautifier HOW-TO:
http://www.tldp.org/HOWTO/C-C++Beautifier-HOWTO/

VBScript代碼規範
http://msdn.microsoft.com/library/en-us/script56/html/vbsCodingConventions.asp

VBSBeaut代碼整理工具
http://www.daansystems.com/vbsbeaut/

Java組件之間的依賴度分析
http://www.clarkware.com/software/JDepend.html

代碼檢查
http://www.thecortex.net/clover/index.html

更多XP工具
http://directory.google.com/Top/Computers/Programming/Languages/Java/Coding_Standards/
http://www.xprogramming.com/software.htm
http://www.qsm.com/CodeCounters.html


附:爲什麼HTMLTIDY的不適合重新格式化JSP PHP ASP等HTML嵌入式腳本語言

而有些無法解析的錯誤其實是代碼不規範造成的。

  1. JAVASCRIPT中的"<"
    比如
    for (i = 1; i<a; i++)
    需要改成
    for (i = 1; i < a; i++)
    ^ ^ "<"前後需要加空格,否則HTMLTIDY會把<a當成HTML標記
  2. HTML屬性中包含JSP標記:
    對於一般的JSP屬性輸出TIDY是可以認出來的

    比如: <input type=text size="9" name="alias" maxlength=20 value=<%=infoForm.getAlias()%> >
    但像這樣的代碼:
    <img border=0 src=/image/upload/content/<%=infoForm.getId()%><%=infoForm.getPhoto()%> width=120>
    由於屬性的開頭不是<%,因此會出現IMG沒有結尾錯誤
  3. HTMLTIDY缺省是將代碼完全補齊的,而實際上很多HTML代碼是在被包含文件中。而且HTMLTIDY對中文編碼得識別還有一定問題(目前只支持BIG5)

原因:

爲什麼嵌入式代碼很難維護?畢竟針對不規範的HTML語法檢查器要比一個語言的解析器要複雜的多。舉例來說,比如針對這樣的代碼:
<?php echo "<table>";?>
</table>

這樣形式的代碼,美化工具必須同時懂得HTML語法和PHP語法纔行,所以大部分格式工具都是針對一種語言,或者針對嵌入腳本的程序部分的格式化,或者只對針對純HTML格式化。只有少數Virsual Age, Forte等大型開發工具裏包含了JSP的代碼美化,另外就是SLICKEDIT這種大型商業文本編輯器等。

解決:對於包含程序的JSP ASP等文件的HTML部分的格式美化最好還是使用專門的HTML編輯工具Dreamweaver(≥4)和Frontpage(≥2000)中的格式化工具來實現。比如:對於FRONTPAGE從菜單的工具==>網頁選項==>HTML源代碼選單裏選擇“使用下面的規則重新格式化源代碼”。

總之,使用HTML和程序在一起的嵌入式腳本語言本身就是一件非常不好的開發習慣。從長遠來開用XML/XSLT等技術實現數據/表現/邏輯的分離是一種更適合大規模開發的模式。

爲了目前大量的ASP PHP JSP應用我還是通過Google上找到一些工具,相信HOMESITE等。其實前面提到的VBSBeautifier其實也是調用Perl 5.8在Windows上的

一個用於ASP的代碼美化工具:VbsBeaut
http://www.daansystems.com/vbsbeaut/

一個用於ASP JSP PHP編輯並帶有代碼美化功能的工具:BPHTML
http://www.bphtml.com/

一個基於Java的HTML編輯器,內嵌了C C++ Java JavaScript Perl等類C語言的代碼美化器:http://www.arachnoid.com/arachnophilia/index.html

Beautifier highlights and indents source code using highlight configuration files (which are similar to Ultraedit highlighting files). As such, it supports C, C#, Java, Perl, PHP, Pascal, Lisp, Mumps, Eiffel, Euphoria, and x86 Assembler, amongst others.
http://www.beautifier.org/

Trita is a source code beautifier which learns your personal formatting style by examining examples of your code.
http://www.trita.com/
支持:Java, Javscript, CSS, JSP, HTML, ASP, Lisp, Delphi, C#, C++, PHP, Perl, Python, and SQL.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章