函數要短。短才方便閱讀、維護和設計。 函數只做一件事。依照單一職責原則(一個類只會因為一個原因改變)設計函數。一個函數要麼進行流程式控制制或邏輯判斷,要麼改變某事物的狀態,要麼計算並返回結果,要麼調用多個下一抽象級的其他函數(另一種流程式控制制而已)。不要有多餘功能。 我們可以把函數分解成多個抽象層級來設計 ...
- 函數要短。短才方便閱讀、維護和設計。
- 函數只做一件事。依照單一職責原則(一個類只會因為一個原因改變)設計函數。一個函數要麼進行流程式控制制或邏輯判斷,要麼改變某事物的狀態,要麼計算並返回結果,要麼調用多個下一抽象級的其他函數(另一種流程式控制制而已)。不要有多餘功能。
- 我們可以把函數分解成多個抽象層級來設計,在調用時最好只同時調用同一層級的函數,依照倒樹狀圖來設計函數。個人認為類似於面向過程編程的思想。在使用時,同一層級的操作可以分解為多個小函數,前一動作函數操作完成後,去調用後一動作的函數,一次鏈接,完成一個層級的操作。
- 函數不應該有作為標識的參數,這意味著函數有至少兩種執行方式違反了第2條原則。
- 函數參數最多有兩個,除非多個參數是作為一個整體傳入的。如:坐標系的x,y,z作為一個整體。並且這種多個參數構成的整體最好能封裝成類來傳入。
- 函數真的最好只做一件事,不要在函數里為了方便當前調用加入其它功能。如web登錄驗證時,函數用來驗證username和password,在驗證之後順便初始化session,這會導致除了登錄時能調用驗證函數,其它時候這函數沒有任何作用或者強制刷新了session導致未知錯誤。
- 不要有輸出參數,如果想改變某類的狀態,就把該函數加入該類,讓它自己調用函數。如:把改變類x的狀態的函數調用addFooter(x),改為x.addFooter()。
- 函數不要返回錯誤碼,這需要你有錯誤碼的枚舉類,並且違反了開放封閉原則(你需要加入新錯誤碼來擴展新錯誤),直接拋出異常就好了。(可以通過繼承父異常來擴展)
- 最好用函數名稱就描述清楚函數作用,避免頻繁去看函數文檔,這對於短小的函數來說不難辦到,如果很難命名可能需要思考函數是否有依照以上原則設計。並且名稱的命名應該不容易與其他函數名稱形成混淆。如:add()在calculator中意思是加,而在List中就不應該用add表示插入集合了,應該用insert或append。簡單來說就是一個概念對應一個詞,並且始終如一。