引言
代碼編寫風格主要包括變量、方法、類等語言實體的命名和代碼排版布局兩方面。評價代碼質量的高低不僅取決於算法和數據結構,代碼排版布局也是一個不可或缺的方面。隨著現代軟件規模的擴大,團隊開發在所難免,好的代碼編寫風格增強了代碼可讀性和維護性,提高了團隊協作的效率。
JBuilder被譽為java航空母艦級的開發工具,目前的最高版本是10,命名為JBuilderX。本文著重介紹如何在JBuilderX中美化代碼,格式化代碼排版布局,同時還將介紹JBuilderX加速代碼編寫的一些實用技巧。
代碼美化工具
市面上已經有很多代碼美化的工具軟件,比較著名的有Indent、astyle、jalopy、SourceFormatX 等,其中SourceFormatX是一個多語言的代碼美化工具。但這些工具沒有和開發工具很好的集成,且不易操作,功能也不夠強大或不針對專門的java語言。JBuildeX集成了一個強大的代碼排版布局格式化工具,在您編寫好代碼後,可以通過它來美化您的代碼。它可以對代碼做以下7個方面的格式化工作:
1) 縮進:java代碼以"{}"劃分的不同代碼子域,裡層的域比外層的域需要縮進一些,以使代碼有層次感,通過該工具可以定義裡層相對外層代碼縮進的空格數,Tab鍵對應的空格數;
2) 分行:類定義、方法定義以及控制代碼,如if..else, while ,try.. catch等都有對應的"{}",以組織其代碼區域,您可以指定"{"和"}"是否另起一行;
3) 空格:指定在操作符、小括號"()"、中括號"[]"、分號";"等符號和操作代碼之間是否需要空格;
4) 空行:允許您指定代碼裡哪兒需要加入空行以及空行數,使不同的代碼域之間區分得更加清晰;
5) 換行對齊:指定代碼行的最大列數,超過列數的代碼行會被智能拆分成多行,只有包含了操作符或逗號的代碼行才可以被換行。您可以指定換行點是在這些符號前面還是後面,同時,您還可以設定換行後多行的對齊方式;
6) 代碼生成規則:控制自動事件句柄、變量可視域及javaBean實例化的代碼生成規則;
7) import代碼優化規則:控制類中import代碼引入的包和類如何生成及它們排序的先後順序,以優化import代碼段。
創建java工程後,在主窗口左上角的工程面板的工程文件(xxx.jpx)上點擊鼠標右鍵,按以下操作調出代碼美化工具設置界面:
選擇Properties->在彈出窗口左邊的樹中選擇Fomatting,得到如圖1的操作窗口界面:
圖1. 代碼格式化窗口
窗口的右邊有7個頁標簽,分別對應上面所談到的7個方面的代碼設置。每一個設置頁左邊對應若干個設置項,右邊是代碼格式化的預覽效果,這樣您就可以即時了解設置項是如何影響代碼的排版布局。下一節我將以具體的例子示范如何使用這個代碼美化工具。
使用代碼美化工具美化代碼
下面是一個簡單的java類代碼,其功能非常簡單,是將兩個雙精度數按要求相加或相減,再將其結果值四捨五入為一個整數,該例子只是為了演示代碼格式化,您大可不必追究代碼的功能。
package format;
import java.lang.Math;
import java.util.*;
public class FormatSample {
private int i;
private int j;
public FormatSample() {}
public long add(double i,double j,boolean isAdd){
double k ;
if(isAdd){k=i+j;}
else{k=i-j;}
System.out.println("today is "+((new Date()).toString())+"the operation of"+i+(isAdd?"+":"-"+"")+j+" equals "+k);}}
這段代碼的排版布局非常差,雖然只是一小段,也會給閱讀者造成暈旋效果。這一小段代碼在布局上的症結可以歸納為以下幾項:
1)裡外層代碼域處於相同列,沒有用縮進形成層次布局
2) if..else的代碼塊的大括號"{"及"}"和代碼處於同一行
3) 操作符和操作數之間沒有用空格分開
4) import代碼塊 和 class定義以及方法和方法代碼塊之間沒有空行分隔,擠成一團
5) System.out.println那行太長,在IDE窗口中需要移動水平滾動條才可以看到隱藏的代碼
6) import 的代碼行引入了過多的類,FormatSample類只需要引入java.util.Date這個類就可以了。
對以上這些排版布局缺陷進行修正我們希望得到了以下版本的的代碼:
package format;import java.util.Date;public class FormatSample
{
private int i;
private int j;
public FormatSample()
{
}
public long add(double i, double j, boolean isAdd)
{
double k;
if (isAdd)
{
k = i + j;
}
else
{
k = i - j;
}
System.out.println("today is " + ( (new Date()).toString())
+ "the operation of" + i
+ (isAdd ? "+" : "-" + "") + j + " equals " + k);
return Math.round(k);
}
}
我們通過以下設置步驟來格式化FormatSample類的代碼,在設置代碼格式化後,必須在代碼頁面中點擊鼠標右鍵,選擇Format All按鈕格式化代碼。你也可以在項目窗口的樹中選擇<Project Source>項,並點擊右鍵,選擇Format package" <Project Source>"...來格式化整個項目的所有代碼:
圖2. 格式化整個項目的代碼
1) 使代碼裡外層代碼區域形成層級縮進的布局
切換到代碼美化工具設置界面的Basic標簽頁,設置block indent的縮進空格數,默認的裡層代碼比外層代碼縮進2個空格,這對於使用拉丁語系的國家是比較適合的,對於使用漢語的編程者應用調成4個空格會更好一些,因為2個空格才對應一個漢字的長度。
2) 使代碼塊的正反大括號"{"和"}"放置在新行中,並且使對應的大括號在列上對齊。
切換到Blocks的標簽面,將左邊樹的所有復選框都鉤選,這樣所有大括號都會另起一行,而且成對的大括號會在列上對齊。通過在列上對應的成對大括號,我們能夠非常容易劃分出代碼塊。將所有大括號(除數組初始化的大括號外)另起一行放置比不另起一行放置的代碼可讀性更強。我認為在下面的兩種代碼布局形式中,右邊的代碼比左邊的代碼具有更好的可讀性:
if(true){
/**do sth*/
}
else{
/**do sth*/
}
if(true)
{
/**do sth*/
}
else
{
/**do sth*/
}
3) 操作符和操作數之間插入空格
切換到Spaces標簽頁,該頁面左邊選項樹從上到下分為5個設置項組,分別設置代碼中分號";"前後的空格,小括號"()"和方法名、關鍵詞及裡面嵌套小括號之間的空格,逗號","前後的空格,小括號和中括號和其包含的代碼之間的間距空格,歸為Others的一些雜項空格項目的設置。通過點擊設置項前的復選框,右邊的預覽窗口將給出設置後的代碼效果。下圖是我們代碼格式化所用的設置:
圖3. 空格設置界面
4) 在代碼不同部分之間插入空行
java語言的結構化相比於C,Pascal等其他語言的結構都要清晰嚴謹。代碼組織結構按先後順序依次是包定義、引用類加載、類聲明、全局變量聲明和方法聲明。可以在這些不同部分的代碼間插入空行,使代碼不同部分看起來一目了然。空行的設置在Blank Lines的標簽頁中,在這個頁面中你不但可以設置在哪兒插入空行,還可以設置插入空行的數目。如您可以在import代碼部分和類定義代碼部分之間加入兩個空行,全局變量定義代碼之間可不插入空行,方法和方法之間插入一個空行。
5) 讓太長的代碼行自動換行
代碼編寫窗口大小有限,太長的代碼行需要移動水平滾動條才可以查看。將代碼窗口滾動到右邊時,左邊的代碼又看不到了,造成"神龍見首不見尾"的現象,嚴重影響代碼的可讀性和閱讀效率。JBuilderX在Fomatting窗口的Wrapping標簽頁中提供了智能換行的設置功能。您可以在Wrap after column中設置代碼行的長度,還可以設置代碼行換行的依據符號。代碼行中的逗號,操作符是代碼行自動換行的依據符。
JBuilderX在自動換行中提供的另一個精制的功能:可以指定單行拆分成多行後,這些行的對齊方式,你可以指定多行頭部和"("對齊或和"="對齊,建議將兩者都鉤選。格式化後,例子中的System.out.println("…")代碼行變成了三行,後兩行代碼和"("對齊。
6) 優化import代碼塊
切換到Formatting窗口的最後一個Imports標簽頁,對import代碼塊做優化設置。JVM會自動加載java.lang.*包,所以例子中的import java.lang.Math;是多余的,此外類中只用到java.util.*包中的一個類java.util.Date,無需引入包中的其他類。JBuilderX的import代碼優化功能允許你設置一個阈值,在當前類中引用到包中的類數目小於這個阈值時,它就會將包名後的"*"替換成具體的類名。您也可以通過鉤選設置頁面中的Always import classes復選框使import在任何時候都將包後的"*"替換成具體的類名。(注意:通過在代碼窗口中點擊右鍵選擇Format All格式化代碼,不執行import代碼的優化設置,你可以在代碼窗口中按Ctrl+I快捷鍵或用圖2的操作步驟來執行import代碼的優化)
其他加速代碼編寫及排版布局的技巧
1) 用模板加速代碼的錄入,保證排版布局上的一致性
JBuilderX提供了豐富的代碼模板,通過代碼模板可以快速地錄入常用的代碼塊。JBuildeX的代碼模板庫提供了大量的常用的代碼模板,代碼模板庫允許你對代碼模板進行維護:對已有模板進行更改或新增自定義的代碼模板。您可以通過以下操作調出代碼模板庫:Tools->Preferences....->選擇彈出窗口左邊樹的Templates,如:
圖4. 代碼模板維護窗口
您可以在這個界面中對java,HTML以及其他通用的代碼模板進行維護,一個模板定義包括3項內容:模板名字、模板描述以及模板定義體。如圖4中的if..else模板的名字是ife,描述為if else,模板體為:
if (|) { |}else { |}
其中字符"|"是代碼模板調用後光標所在的位置,光標停在第1個"|"處,可以按Tab鍵移動光標到不同的"|" 處。在代碼編輯窗口按Ctrl+J再鍵入模板的名字就可以調用模板代碼,模板ife調出後在編輯器中的顯示效果如下圖:
圖5. 按Ctrl+J調用代碼模板(再按Enter選擇)
圖6. 代碼模板ife的編輯效果圖
2) 同步編輯模式
如果一段代碼中一個標識符出現多次,當需要更改這個標識符時,同步編輯模式可以給您帶來極大的方便。如下面是一段遍歷Iterator的代碼:
Iterator iter = .iterator();
while (iter.hasNext())
{
Object item = (Object)iter.next();
}
如果您需要將iter名字改為myIter,你可以先選中這段代碼,然後按Ctrl+Shift+J,這個代碼段就進入了同步編輯模式,在同步編輯模式下只要更改其中任何一個標識符其他相同的標識符也會同步更改。在編輯窗口中,這段代碼顯示效果如下:
圖7. 同步編輯模式
這段代碼中iter變量出現了3次,第一個iter呈選中狀態,您只要將任何一個更改為myIter,其他的iter也跟著更改過來。如果你想退出同步編輯模式,請點擊編輯窗口左邊標有行數欄中的 按鈕。
3) 代碼段整體移動
在一般的編輯器中(如UltraEdit,EditPlus)都提供了整段代碼整體左移和右移的操作,操作的方式是選中需要移動的代碼段,然後按Tab向右移或按Shift+Tab向左移。JBuilderX也提供了這個功能,但操作鍵略有不同,向右移的按鍵是Ctrl+Shift+I,向左移可以通過Shift+Tab或Ctrl+Shift+U兩種操作方式來實現。代碼整體移動對於縮進的排版特別有幫助。
總結
JBuilderX是一個功能強大的java智能開發環境,它提供的代碼美化工具可以對代碼進行高效的美化排版布局,大大地減輕了開發人員代碼排版布局的工作,保證了團隊不同成員間編輯代碼布局風格的一致性。使用好這個工具必將給您的java開發帶來效率上的提升和質量上的優化。