2012年9月29日 星期六

Groovy 的一些好用語法(一) *.

 Groovy 可以和Java語法混用,這一點真的是很有趣的事。
在很不熟Groovy的時候,甚至可以把 Java 的寫法套進來。但是久了之後就會發現,Java 在一件簡單的事上,往往要很重覆的不斷寫上一樣的東西。

有些人會不屑的回應說,只是語法上的甜頭,不足掛齒。
其實這只看到表面。語法上的簡化、行數減少這是事實,不能否認,但好處為何?


  • 行數少,bug 就少。100行出錯的機率一定比10行來的高。
  • 行數少,程式的「自我描述性」就高。在 Java 中的五行,其實是在說一件事,但因為這5行會消耗你閱讀上的力氣,當行數越來越多的時候,你會很難抓住程式本身的重點。行數少,程式可以集中力氣在「表達」上,也就是易讀性會大大提升。
  • 等下的例子會十分明顯。


假設我們需要得到全部的「書」,然後把他的 id 傳到 jsp 供應用…不管你程式寫幾行,或用任何的程式語言,中文來說就是這二件事,以傳統的Java 來說:

List<Book> book = session.createQuery("from Book").list(); 
//do something....
List<Integer> list_id = new ArrayList();
for(Book b : book){
   list_id.add(b.getId());
}
request.setAttribute("id_list",list_id);

這個是我們每天在寫程式的時候做的事,雖然很囉嗦但是久了也習慣了。
Groovy 怎麼處理?

def book = Book.list()
//do something
["id_list", book*.getId() ]

啥?
對,就是你眼睛看到的。
*. 是什麼 ? 其實望文生義,就是「在這個集合裡的所有物件,都都呼叫這個方法,得到的值紀錄起來用List傳出來」。
這裡的 book 如 Groovy 第一行來說,已經是List  <Book> 了
book*.getId() 在這裡就是說「 book裡全部的物件都呼叫getId() 並塞到另一個新的List 中」
於是這個繁瑣的過程就這樣結束了。如果臨時 ui 又需要 book 裡所有的作者

["author_list" , book*.getAuthor()] 

馬上一行就可以解決並傳到前端去…
再一次說明,語法上的甜頭,並不是不重要的事,語法上的精簡,可以大大增加

  • 易讀性
  • 開發速度
  • 減少出錯機率







沒有留言:

張貼留言