加速Java應用開發速度4:使用模板技術加速專案開發速度

發表於2013-07-02

模板,一個我們天天使用的技術, 比如:

  • Java類就是建立Java物件例項的模板;
  • 泛型,引數化型別的模板,如List<User>;常見的如泛型DAO、泛型Service等;
  • Arrays.sort() 一個排序的模板;
  • Spring中的DAO支援設計;可參考《我對SpringDAO層支援的總結》;
  • HttpServlet設計,如service根據http method轉發給各個do開頭的方法(doGet、doPost等);
  • 還有如Struts2的ActionSupport設計,我們繼承後能自動得到如國際化、驗證的支援;
  • JSP、Velocity、Freemarker等模板頁面技術;
  • 等等

模板帶給我們的好處很明顯:約束+重用。通過模板我們可以把變與不變分離,重用不變,變可以交給子類/通過回撥機制完成,而且還具有約束作用,防止亂寫程式碼。

那我們應該利用好這個技術,加速專案的開發速度。接下來我們看看如何利用模板技術來加速我們的開發速度。

接下來,我將介紹下如何利用模板技術加速開發速度,但不會接受如何利用模板技術開發可複用的程式碼;本文以IntelliJ IDEA為原型介紹:

1、程式碼生成

2、Live Template

3、File and code Templates

4、自動程式碼生成

 

1、程式碼生成

如我們要求 i + j,可以先:

int k = add(i, j);

然後按Alt+enter自動生成相關程式碼;而不是自己去敲;其會自動生成相應的變數和方法體;如圖

 

1、按Alt+Enter彈出如建立方法/建立本地變數的提示

2、可以根據生成的模板方法,修改模板引數;

3、還有典型的如生成構造器、getter/setter等,按Alt+Insert得到如下圖:


比如在生成構造器時,可以選擇相關欄位,會自動生成相應的賦值操作:


4、Ctrl+O/Alt+Insert生成覆蓋方法;ctrl+I/Alt+Insert生成實現方法的

 

5、選中程式碼後,Ctrl+Alt+T彈出Surround with,生成包圍程式碼的的程式碼,如if/else:

 

6、在如JSP標籤頁面中,按Ctrl+Alt+J,生成環繞的標籤:

等等。。具體可以參考jetbrains.官網的《Generating Code》部分。

 

2、Live Template

如果用過idea,肯定用過如輸入 psvm 然後按Tab鍵,會自動生成public static void main方法,使我們少輸入很多字元。這個功能在idea中叫做Live Template;接下來讓我們看看有哪些Live Template和如何自定義Live Template。

 

最常見的功能:

1、psvm—–>public static void main(String[] args) {}

2、psfi ——->public static final int

3、ifn   會自動生成如下圖


……

 

大家可以通過 File—>Settings—->Live Templates找到所有模板,如:


如 lazy 生成延遲初始化的程式碼,inn生成if (** != null)

 


如fori —>for (int j = 0; j < ; j++) {}

List list;  itli  —-> for (int i = 0; i < list.size(); i++) { Object o =  list.get(i);}

等等,這個可以去Settings裡檢視。

 

接下來我們看看如何自定義自己的Live Template:

1、輸入“縮寫字首”,即在程式碼中輸入的字首;

2、模板文字;

3、Change:選擇在哪使用;

 

接下來在Java檔案中,輸入test會生成 hello world;

 

此處看到 $END$ 這種變數,接下來解釋下:

1、格式是$變數名$

2、$END$ : 表示展開模板後游標停留的位置,比如我們的test,生成模板後,游標停留在hello world 前邊;

3、$SELECTION$ : 表示對選中的程式碼應用模板;如我們定義test為:



 

此處選中“int i = 1;”,然後按Ctrl+Alt+T 彈出“Surround With” 然後輸入test字首,自動生成:—>hello int i = 1; world

 

還有如 輸入 if for等字首 按Ctrl+Shift+Enter會自動生成 帶()和{} 的形式,非常方便。

 

如果想定義自己的變數,可以直接點選在編寫模板時,模板文字右邊的:“Edit variables” 編寫:如得到返回的變數,方法名,類名等等。

 

大家可以參考官網的《Live Templates》。

 

3、File and code Templates

到此我們使用的都是程式碼塊級別的模板,在工作中我們常見的還需要:

1、生成如Copyright頭;

2、生成類頭Javadoc,如使用者、時間、版本;

3、建立如spring配置檔案,每次可能都是從別的地方複製一份;

4、如我們做企業專案時,都先寫一個CRUD的DAO、Service、Controller等等,但是幾乎每一個模組都是類似的,但是我們每次可能都要重複寫一遍;

 

因為IDEA使用的是velocity模板,所以語法相對來說是比較靈活的,而Eclipse看了下是自創的,所以在建立時沒有IDEA靈活。

 

File—->Settings—>File and Code Templates 開啟模板設定頁面

 

3.1、給Class生成Copyright頭

1、建立Include檔案


1、首先選擇Includes標籤,然後點選建立建立一個;

2、接著Name處輸入名字;

3、Extension部分輸入副檔名;

4、檔案正文;

此檔案包含了我的copyright

 

2、新增到類别範本中

1、 首先選中Class;

2、在頁面頂部使用 @parse(“Coyright.java”)把剛才寫的檔案包含進來

 

接著新建一個Java Class,在頁面的頂部會出現這個copyright;

 

3.3、自定義Service模板

KeyValueService.java為例。

 

1、首先File—>Settings—->File and Code Templates進入模板設定頁面

2、建立模板,如圖所示

1、點選Templates標籤,點選新增按鈕

2、Name處輸入名字

3、Extension處輸入副檔名

4、輸入模板正文,此處我們可以使用${NAME}和${PACKAGE_NAME}分別獲取輸入的檔名和包名

5、語法是velocity語法,所以很強大,按理說很複雜的需求也可以實現

 

3、新增Class

3.1、在包處Alt+Enter彈出新建列表,選擇Java  Class

 

3.2、 接著在彈出的介面中輸入 Service的字首,並選擇Service型別:


4、接著類就建立好了:

非常方便。

除此之外,我們還可以定義如 jsp模板、html模板、配置檔案模板等等,消除開發中的重複工作。

但是此種方式的主要缺點就是:一次只能一個檔案。比如,我們生成Service時,其實DAO、Contoller等最好也自動生成。 接下來就需要自動程式碼生成了。

 

4、自動程式碼生成

估計很多朋友都使用/開發過程式碼生成器;其實開發一個簡單的程式碼生成器花不了多長時間,核心指導思想是:變與不變分離:

  • 不變的是結構;
  • 變的是包名、類名及實體資料。

所以根據這個思想可以很容易寫一個程式碼生成器,可以按照如下步驟完成:

  • 1、自動生成一個模組的DAO、Service、Controller;
  • 2、根據資料庫自動生成一個模組的Entity、DAO、Service、Controller;
  • 3、自動生成一對一、一對多關係的模組程式碼;
  • 4、自動生成公司中常用的程式碼的模組程式碼,如樹;

目前見到的主要有這些型別的自動程式碼生成。

程式碼生成的模板檔案可以使用純文字(即純粹的字串替換),更高階點的可以使用如velocity這種模板語言,更加強大。

如果有朋友不會寫程式碼生成器,可以先建一個Example的示例程式碼,接著做複製、粘帖、修改實體名等等完成,估計30秒鐘也能出一個基本的模組程式碼。但是如果交給程式碼生成器,速度更快。

比如筆者剛開發的新專案,還沒時間開發程式碼生成器,就寫一個一些示例,這樣如果寫新模組就直接複製一份改改即可,尤其樹這塊節省不少時間,點選showcase前往檢視。

程式碼生成器也不是萬能的,如果你做過網際網路專案,不像企業應用那樣有許多的增刪改查,所以這個時候,純粹生成CRUD的程式碼生成器沒有任何意義。

到此我們介紹完了模板,使用模板能提升不少開發速度,但是模板不是萬能的,只有發現有些程式碼是由:變與不變組成,那我們就可以把不變的做成模板,變的部分通過佔位符(即變數)填入。

 

參考資料:

30 Days with IntelliJ IDEA. Quick Popups

IntelliJ IDEA 12.1.0 Web Help

 

相關文章