寫本文的目的無非是2個,首先,以前程序員縮進非常不整齊的代碼非常影響我的代碼閱讀速度。第二,我希望新的代碼(無論在什麽編輯環境下編寫)都能夠非常好的適應公司的縮進規範,便于程序員之間的交流。
當然:如果馬上能從以下列表中找到你需要的就完全不必耐心的看到最後:相應工具中的文檔會有更詳細的使用說明
c, c++ c# == indent astyle
java == astyle jalopy Jacobe ImportScrbber
php == phpCodeBeautifier
perl == perltidy
python == pydent
程序員應該是善于溝通的,代碼美化的意義在于體現了開發者對他人的尊重,使用好的編碼約定可以使源代碼明白、易讀、准確,更加直觀且與其他語言約定保持一致,從而讓程序員之間更好的溝通。
有統計表明縮進良好的代碼可以提高代碼閱讀的效率40%以上,而另一個統計是軟件開發工作的70%以上是維護前人的代碼,因此對以往代碼的格式美化往往也是系統重構(refactoring)的第一步。代碼美化工具(pretty print program)的使用可以使基本的代碼縮進規範成爲一種更容易執行的制度。
另外,如果作爲部門代碼規範的制訂者也應該了解程序員不是機器,寫代碼時完全不犯代碼縮進錯誤幾乎是不可能的,另外,程序員真的不按照規範做你又能怎麽辦呢?所以按工具的格式化能力制定的縮進規範是一個真正有可操作性的制度。
幾種開放源代碼的代碼美化工具的介紹
工具名稱 適用語言 簡介 安裝/使用
indent c indent幾乎成爲代碼美化工具的代名詞 indent是gcc附帶的一個標准工具,
indent [options] [input-files]
indent [options] [single-input-file] [-o output-file]
perltidy perl
perltidy本身也是用perl寫的 下載後直接運行perltidy腳本
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
astyle c 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代碼)。
jalopy java 功能強大的JAVA代碼格式化工具,除了標准界面外,命令行工具,還可作爲ANT JBUILDER ECLIPSE JDEVELOPER等工具的插件使用,並提供API 從http://prdownloads.sourceforge.net/jalopy/下載
並參考相應安裝文檔
pydent python pythius包含了2個工具:
pydent: 代碼縮進工具
pystat: 代碼統計工具 下載源代碼解包後:
Run "python setup.py build"
Run "python setup.py install"
htmltidy html/xml HTML代碼的糾錯工具,可以幫助你的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://tools.phpedit.net/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/
使用命令行工具實現代碼的批量修改
WIN2000下:用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
linux:用find -exec 遍曆執行,例如:
find ./ -name *.java -exec astyle --style=ansi {} ;
因此,是否有命令行工具也往往成爲選擇代碼美化工具的指標之一,很多商業化的軟件只采用圖形界面,反而不適合代碼的批量修改。
爲什麽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編輯工具Dreamwaver(≥4)和Frontpage(≥2000)中的格式化工具來實現。比如:對于FRONTPAGE從菜單的工具==網頁選項==HTML源代碼選單裏選擇“使用下面的規則重新格式化源代碼”。
總之,使用HTML和程序在一起的嵌入式腳本語言本身就是一件非常不好的開發習慣。從長遠來開用XML/XSLT等技術實現數據/表現/邏輯的分離是一種更適合大規模開發的模式。
以上工具只是代碼格式縮進的美化,而遵守完整的代碼規範可以參考以下文檔:
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://utvikler.start.no/code/php_coding_standard.html
perlstyle
http://www.perldoc.com/perl5.6/pod/perlstyle.html
HTML XML XHTML CSS...
http://www.w3c.org