1、函式要盡可能的簡短。
2、每個函式只做一件事情(只有一層抽象概念)
有些概念偏向高層次(像getHtml()),有些屬於中層次(如String pagePathName = PathParser.render(pagePath)),有些為低階層(如.append("\n")),一個函式只做同一層抽象概念的幾個步驟,因為撰寫函式就是為了將一個較大的概念,分解成下一層抽象概念的數個步驟。
正確:public static String renderPageWithSetupsAndTeardowns(PageData pageData, boolean isSuite) throw Exception{
if(isTestPage(pageData))
includeSetupAndTeardownPages(pageData, isSuite);
return pageData.getHtml();
}
這邊做了三件事,1.判斷此頁面是否為測試頁面,2、如果是測試頁面的話,則納入設定與拆解步驟,將此頁面轉成HTML網頁,很難再把它做意義的收縮。
3、名稱要清楚描述能力
SetupTeardownIncluder.render(設定及拆解的納入者.呈現者)就比testableHtml(可測試的網頁)好。
4、函式的參數:
參數要越少越好,除非有特殊理由,否則不應超過3個參數
不要將布林變數傳遞給函式,這等於讓函式做了兩件事,true時做一件,false時做另一件。如render(boolean isSuite)應該分裂成兩個函式,renderForSuite()和renderForSingleTest()。
writeField(outputStream,name)我們可以將其改寫:1、把writeField方法變成outputStream裡的一個成員,這時能使用outputStream.writeField(name)的語法。2、把outputStream變成類別裡的成員變數,這樣就不必傳遞到方法裡
當一個函式參數超過兩個或三個時,可能要把一些參數包裝到一個類別裡,如Circle makeCircle(double x, double y, double radius)可改成,Circle makeCircle(Point center, double radius)
在單一參數的形式中,函式和參數要形成一個動詞/名詞的良好配對。
5、輸出型參數
appendFooter(s)改成report.appendFooter()較好,整體而言應避免使用輸出型參數,如果函式必須改變物件的某種狀態,就讓物件改變其本身狀態。
6、指令和查詢分離
像if(set("username", "unclebob"))會令人感到困惑,這是在問username是否之前已經設定成unclebob?或者是username成功設定成unclebob?我們應該將指令和查詢分開,改成if(attributeExists("username")){
setAttribute("username", "unclebob");
...
}
7、例外處理和程式碼部分分離:
在正常的程式運作中混入了錯誤處理,會混淆程式的結構,應該將try/catch區塊提取出來,像以下例子delete函式只跟錯誤處理有關,deletePageAndAllReferences只跟刪除頁面有關
public void delete (Page page){
try{
deletePageAndAllReferences(page);
}
catch(Exception e){
logError(e);
}
}
