How to code like a pro in 2022 and avoid If-Else

  • 2022 年 8 月 10 日
  • 筆記

在瀏覽文章的時候發現了一篇敘述有關if-else語句的文章,這篇文章作者是Thai Tran,他原文是用英語寫的,然後看著文章淺顯易懂,便嘗試翻譯成漢語。如有不妥還望指出。

原文鏈接://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能夠使得語句更有效率,那當然還是用使用。總的來說就是盡量使得程式碼能夠增加復用性、可維護性,使得其簡潔且高效,這樣幫助的不僅是自己,也會使得團隊成員或其他使用者更方便快捷且高效。

 

公眾號文章地址://mp.weixin.qq.com/s/wSRxHPqYqZkwtEwuX9nGOA

歡迎關注公眾號:愚生淺末。