在英文裡,連接詞用來連接字、句、詞或段落。而在程式裡也常會用到連接詞,這篇要講的是兩個最常用的連接詞:And及Or。
And和Or在判斷式裡使用頻率非常的高,特別在迴圈及判斷式裡都會使用到,比較常會用到的是他的語法型:|或者&。但這麼常用的語法,如果放在其他地方,卻是一個非常不好的習慣。
我們從一個微軟的常用方法開始說起:string.IsNullOrEmpty()
這是一個檢查字串是否是空字串的方法,如果傳進去的字串是null或是"",他會回傳true
public static bool IsNullOrEmpty(string value)
{
return value == null || value.Length == 0;
}
就算不看原始碼,其實也很容易測試這個方法,因為字串是個很基本的型態。
另外還有一個方法,叫GetStringAndRelease,其實他就是回傳己經接好的字串,然後把放在cache裡。
public static string GetStringAndRelease(StringBuilder sb)
{
string str = sb.ToString();
StringBuilderCache.Release(sb);
return str;
}
因為有這些例子,就表示在方法的命名裡放進And或Or嗎?
其實在名稱裡放And或Or並不是一件被鼓勵的行為,因為他會增加方法的複雜度。
什麼意思呢?假設有一個會員系統,每個會員在登入後,每天都會拿到一個coin當成獎勵,於是工程師就寫了一個方法叫
public void LoginAndGiveCoin();
但當系統運行一陣子之後,規則修改了:拿到coin的會員只有付費會員以及透過Affiliate註冊的會員才能拿到,這時候我們就要開始思考如何修改:
有看出問題了嗎?
原本的方法包含了商業邏輯,然而當邏輯不存在時,工程師並不會思考「這個邏輯己經不存在了」,而會去想「怎麼讓這新的商業邏輯相容在現有的程式片段裡」。這種破片不但會增加程式的複雜度,還會導致維護的人誤解程式的使用。所以And或Or在命名上很容易違反「單一功能原則」,以上面的例子來看,修改LoginAndGiveCoin的原因不是因為Login的規則改變了,也不是因為GiveCoin的規則改變了,而是因為第三個原因:GiveCoin的資格改變了。
回到最一開始的例子,IsNullOrEmpty(),因為他如此的簡單,因此可以接受命名裡有Or,但如果這個方法的規則改變了:例如數字要排除,空白要排除...那同樣的道理,基於「單一功能原則」,這個命名就很不恰當:因為"123 "並不是空白字串,但呼叫這個方法時會得到true。
其實And和Or的名稱真的很常見,但使用上要特別注意,如果不確定是否能合併,最好的方法還是找另一個人一起Pair,討論看看命名的合理性。