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);

  }

}

文章標籤
全站熱搜
創作者介紹
創作者 阿洲 的頭像
阿洲

阿洲程式天地

阿洲 發表在 痞客邦 留言(0) 人氣(49)