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

欢迎关注公众号:愚生浅末。