讀了Jeffrey Palermo 的隨筆How to design a single method後,對他所述的方法(Method)設計的準則大部分比較贊同。方法的設計是類的設計的一部分(在物件導向設計的前提下),是比較細節的問題,但也是關乎設計是否優秀的細節。
Jeffrey Palermo 提到了下面的一些準則(斜體部分是我的理解):
1、方法的命名應清楚地表達出此方法所做的事情。
命名其實也是一門學問——看起來簡單,但往往比較有經驗的設計師才能作出比較合適的命名。不當的命名常常讓他人誤會,帶來理解上的困難。一般方法的命名使用動詞或者動詞+名詞。比如Append、Push、ShowDialog、GetName等。
2、一個方法做且只做一件事情。
有人常常一個方法中好幾件事情,這是沒有正確劃分各個方法職責的結果。做一件比較複雜的事情,可能需要分為幾個步驟來完成,我們把它拆為幾個方法(一般為private的方法),每個方法完成其中一個步驟。當然,這需要根據實際情況做合適的劃分。
3、一個方法要麼做一些事情,要麼返回一些東西。如果該方法返回一些東西的話,調用它無數次也不應當產生負面影響。
4、一個方法所佔的篇幅不應超出一屏。
這是經驗之談,如果一個方法裡面你寫了大量的代碼(比如超過50行),那該方法需要重構了。Jeffrey Palermo 甚至說一個方法最好少於10行。
5、方法的參數要少。
如果一個方法必須大量的參數,那可以將這些資訊封裝到一個Object中,現成的例子是.net framework中的ProcessStartInfo。個人認為一個方法的參數最好不超過5個。
6、方法僅僅依賴於方法的參數,或者由建構函式傳入的類成員。
7、在合適的地方捕捉異常。
在需要對異常進行處理的地方捕捉異常,否則讓其傳播。
對於方法的設計準則,在不同的語言中可能會不盡相同。比如在.net中會對傳入的參數做一些檢查,而在native C/C++的代碼中(比如wcscpy函數)總是認為調用者會保證參數正確,而根本不作任何檢查,看下面代碼:wchar_t * __cdecl wcscpy(wchar_t * dst, const wchar_t * src)
{
wchar_t * cp = dst;
while( *cp++ = *src++ )
; /**//* Copy src over dst */
return( dst );
}
而在c#中:
public static string Copy(string str)
{
if (str == null)
{
throw new ArgumentNullException("str");
}
string text1 = string.FastAllocateString(str.Length);
string.FillString(text1, 0, str);
return text1;
}
準則歸準則,在實際開發中,還是要看具體情況。
原文連結:http://jiezhi.cnblogs.com/archive/2006/04/20/380376.html: