在瀏覽文章的時候發現了一篇敘述有關if-else語句的文章,這篇文章作者是Thai Tran,他原文是用英語寫的,然後看著文章淺顯易懂,便嘗試翻譯成漢語。如有不妥還望指出。
原文連結:https://thaitran.hashnode.dev/how-to-code-like-a-pro-in-2022-and-avoid-if-else#comments-list
如果學習一門程式語言,我們都會知道if...else...、for迴圈等基本語法。
作為一個初學者,我們可以按照書本上一板一眼的學習和使用。
但是,如果要成為高階程式設計師,就需要不斷考慮怎麼更加高效的應用程式語言。
使用if...else...是我們在大學裡學到的程式設計基礎知識之一,剛開始接觸程式設計經常會用到。但是,許多高階開發人員都認為if...else...存在很多問題,而且我們在開發中也要儘量避免過度依賴if...else...。
這篇文章就介紹初級、中級、高階程式設計師如何應對程式中一些類似的問題。
怎樣在2022年像專業人士一樣摒棄if-else來編寫程式碼?
使用if-else語句是我們在大學學習程式設計的基礎之一,它有助於我們開始第一個任務。有趣的是,許多高階開發人員卻很厭惡if-else語句。只要情況允許,就應該避免在程式碼中使用if-else。
我們來看一些例子
初級開發人員如何編寫程式碼:
var input = "Dog";
var output = "";
if (input == "Dog")
{
output = "Bow Wow";
}
else if (input == "Cat")
{
output = "Meow Meow";
}
else if (input == "Chicken")
{
output = "Cluck Cluck";
}
else if (input == "Pig")
{
output = "Oink Oink";
}
這個例子中,開發人員需要根據輸入的動物輸出不同動物的聲音。這個問題可以使用If-Else語句輕鬆地重複邏輯。
中級開發人員將如何編寫此程式碼:
var input = "Dog";
var output = "";
switch (input)
{
case "Dog":
output = "Bow Wow";
break;
case "Cat":
output = "Meow Meow";
break;
case "Chicken":
output = "Cluck Cluck";
break;
case "Pig":
output = "Oink Oink";
break;
}
通過使用switch語句來代替if-else語句並獲得相同的結果,但這仍然不是最佳解決方案。
高階開發人員如何編寫程式碼:
var input = "Dog";
var map = new Dictionary<string, string>
{
{ "Dog", "Bow Wow" },
{ "Cat", "Meow Meow" },
{ "Chicken", "Cluck Cluck" },
{ "Pig", "Oink Oink" }
};
map.TryGetValue(input, out var output);
在這個例子中,將動物的名稱和動物聲音作為鍵值對儲存在字典中,並呼叫TryGetValue()方法獲得輸出,這樣的程式碼更具可讀性。
但事情可能會變得更復雜
例如,我們需要使用比較方法而不是精確匹配,然後採取相應的操作。如果輸入包含關鍵字Dog,則使用它來過濾狗的品種。如果輸入包含關鍵字Cat,則使用它來過濾貓的品種。
初級開發人員可以使用If-Else語句解決此問題:
var input = "Dachshund Dog";
var dogBreeds = new[] { "Dachshund" };
var catBreeds = new[] { "British Shorthair" };
var result = Enumerable.Empty<string>();
if (input.Contains("Dog"))
{
result = dogBreeds.Where(b => input.Contains(b));
}
else if (input.Contains("Cat"))
{
result = catBreeds.Where(b => input.Contains(b));
}
由於他需要更多的條件,他將繼續在程式碼中新增If-else語句。程式碼將變得不可使用且更難閱讀。當此程式碼移交給高階開發人員時,將按以下方式重寫:
var input = "Dachshund Dog";
var dogBreeds = new[] { "Dachshund" };
var catBreeds = new[] { "British Shorthair" };
var result = Enumerable.Empty<string>();
var eval = delegate (string key, string[] array)
{
if (!input.Contains(key))
return false;
result = array.Where(b => input.Contains(b));
return true;
};
var conditions = new[] {
() => eval("Dog", dogBreeds),
() => eval("Cat", catBreeds)
};
conditions.Any(c=> c());
通過將動作移動到delegate(這是一個關鍵字,查閱很多文章發現並沒有特別合適的漢語翻譯),可以在不同的條件下重用相同的方法。將delegate儲存在陣列中,並使用LINQ Any()呼叫這些函數將得到相同的結果。最好的部分是,一旦其中一個函數返回真實條件,比較操作就會退出,這將節省效能。
如果你是一名初級開發人員,你應該學習並使用這些專業技巧。接下來你將成為一名高階開發人員。
要記得:
如果維護你的程式碼的人仍然需要不斷地調整程式碼,那他將變成一個知道你住在哪裡的暴力精神病患者。
這句話原文是:
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.
我的理解是:如果一個人維護你的程式碼需要不斷地重寫編碼,那這個維護者將變成一個帶有暴力的精神病患者,並且他有可能會向你施加暴力。
也就是說盡量寫出一些效率高的,重用性強的,簡潔且精煉的程式碼,為後續的維護者減輕壓力。
這篇文章說的並不是完全拒絕if-else語句,而是說要儘量避免if-else語句帶來的冗雜和難維護性。如果藉助if-else能夠使得語句更有效率,那當然還是用使用。總的來說就是儘量使得程式碼能夠增加複用性、可維護性,使得其簡潔且高效,這樣幫助的不僅是自己,也會使得團隊成員或其他使用者更方便快捷且高效。
公眾號文章地址:https://mp.weixin.qq.com/s/wSRxHPqYqZkwtEwuX9nGOA
歡迎關注公眾號:愚生淺末。