2014年3月28日 星期五

Spring 3.1.2 & quartz 1.8.6 example

project中常會有需要利用排程的工作,

這邊介紹spring和quartz的整合,

首先先利用mvaen建立,可參閱maven build project

接下來是需要用到的dependencies,

2014年3月26日 星期三

SpringMVC 幾種返回形式(ModelAndView,@ModelAttribute,Model,@SessionAttribute)

在透過@RequestMapping,

將request導入到@Controller內的function後,

function運作完畢後有幾種返回的形式可以選擇:

1.ModelAndView

當返回為ModelAndView時,

其中已經包含了顯示(View)和模型(Model),

2014年3月23日 星期日

Clean Code - Note

在程式中下註解是很常見的,

但在看完clean code後,

我開始思考註解的適當性及必要性,

有些書中提到的要點可以分享一下:

1.用code代替註解

書中有提到一個重要的觀念,

不要用註解拯救糟糕的code,

寧可重新改寫code,
 //to check the member's level is enough
 if(member.level <= office_premium && member.level > office_higher){
  
 }
 
 if(member.hasEnoughLevel()){
  
 }

第一個敘述看了註解之後,

或者你可以了解if中的判斷,

但採用第二種方式之後,

你便可以繼續往下閱讀並了解此段程式碼要做什麼事情。

2.不要留註解的程式碼

以前的code中很常看到這樣的方式,

有時候是為了測試,

有時候是流程或業務內容改變,

但也怕會忘記以前的寫法所以用註解的方式保存,

但現在都有版控的機制,

可以清楚記錄每次的改版,

所以,把註解的程式碼刪除,

避免久了造成不必要的誤會。

Clean Code - function

不論是維護或者是開發時,

常常會遇到幾十、幾百甚至是幾千行的function,

當然再一邊抱怨的同時,

也同時告誡自己不要創造出如此的怪物,

在clean code中有提到一些寫function的建議:

1.只做一件事

每一個function應該只有一個目標,

只要完成一個工作,

例如if、else、while,

也應該只包含一行呼叫function的敘述,

當把握這個原則後,

你的function內也不會有幾百幾千行的code。

2.使用具描述能力的名稱

如同命名原則一樣,

countOfItem()的function應該會比count()這樣的名稱容易理解,

在思考function名稱時,

以能讓別人一眼看到就知道其含意為原則。

3.不要傳遞旗標參數

不要讓你的function接收true/false這樣的參數,

除了代表你的function做了不只一件事外,

也會影響命名function的難度。

4.以物件傳遞代替一串參數

function接收的參數盡量越少越好,

如果需要傳遞一整串的參數(2、3個以上),

可以使用物件來封裝傳遞。

5.使用try/catch代替錯誤代碼

避免使用錯誤處理代碼如error_code_1,

利用try/catch/finally來代替error_code,

就能將錯誤處理代碼的敘述抽出來並簡化,

且try/catch/finally裡面也應該只處理一件事。

2014年3月22日 星期六

SpringMVC RequestParam、CookieValue、RequestHeader

@RequestParam

在呼叫@Controller內的@RequestMapping時,

我們可以在function的地方加入RequestParam綁定對應的參數名稱,
package com.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/param")
public class ParamTestController {

 @RequestMapping("/test")
 public String test(
   @RequestParam(value = "par1", defaultValue = "df") String par1,
   @RequestParam(value = "par2", required = false) int par2) {
  return "/param/test";
 }
}

@RequestParam中有三個參數可以設定,

SpringMVC PathVariable

在@RequestMapping中,

當使用URL對應時還可以使用{}占位符號的方式傳遞參數,
package com.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/item")
public class ItemController {

 @RequestMapping("/{itemNo}")
 public String create(@PathVariable("itemNo") String itemNo) {
  return "/item/create";
 }

}

在ItemController中,

當您呼叫/webapp/item/123456時,

會執行create()並且幫你把123456綁定到itemNo的變數中,

除了可以使用function的占位符外,

也可以使用class的占位符,

SpringMVC Request Mapping

透過dispatcher-sevlet.xml,

利用context:component-scan去掃描package以下的所有@Controller,

那要如何將USER傳送的request對應到符合的控制器,

便是依賴@RequestMapping,

有以下幾種方式可以使用:

1.利用URL對應

可以在function前利用@RequestMapping來對應傳送的URL,

2014年3月9日 星期日

Clean Code - Meaningful Names

在coding的過程中,

命名一直是大家常常討論的事情,

不論是package、class、jar、file、document、properties等等,

這邊分享一些書中提到的觀念,

我想寫程式的方式每個人都有自己的想法,

看到別人提出的論點可以多聽多看多了解,

覺得好的可以學起來用,

但不認同的也可以提出來討論,

畢竟這也不是聖經或是spec,

不會有人逼你一定要用,

在此將一些覺得不錯的條列如下:

1. 名符其實

每一段Code中的所有變數,應該要可以解答所有讀者的疑惑,

可以比較以下兩段程式碼,第二段會比第一段容易理解每個變數代表的涵義,

很常看到在宣告m這種變數後,再寫一段註解解釋m是什麼意思,

如果這樣的話,不如直接宣告為month更顯得淺顯易懂。
        int m;
        String str;
        List<Integer> list=null;
 
        int month;
        String memberName;
        List<Integer> memberList=null; 

2. 有意義的區別

不要使用會讓人搞不清楚的命名,例如Member和MemberInfo兩個類別,

直覺上看起來是一樣的,或是使用a、an、the這種名稱,

像account和theAccount,或Item和ItemObject。

3. 可被搜尋

當一個變數或常數在程式中很常用到,最好給一個容易被搜尋到的名稱來代替,

比較以下兩段程式碼,for迴圈中的數字,

當使用變數名稱取代後,會更好搜尋及了解涵義。
  int sum = 0;
  for (int i = 0; i < 10; i++) {
   sum += i * 2;
  }

  int total_item_count = 10;
  int item_exchange = 2;
  for (int i = 0; i < total_item_count; i++) {
   sum += i * item_exchange;
  }

4. 類別和方法的命名

類別的命名盡量使用名詞,例如Member、Account、Item等等,

方法的名稱則使用動詞,例如save、update、delete、add等等,

取出使用get,設定修改用set,判定或flag使用is。

5. 避免雙關語

有時候你會常常使用add這樣的名稱,

不論是增加、插入、附加等等,

但你可以考慮用add、insert、append等等的命名來區別這其中的差異,

可以幫助讀者更好理解。