编写更好的C#代码引言开发人员总是喜欢就编码规范进行争论,但更重要的是如何能够在项目中自始至终地遵循编码规范,以保证项目代码的一致性。并且团队中的所有人都需要明确编码规范所起到的作用。在这篇文章中,我会介绍一些在我多年的从业过程中所学习和总结的一些较好的实践。
举例为先我们先来看一个 FizzBuzz 示例。FizzBuzz 要求编写一个程序,遍历从 1 到 100 的数字。其中如果某数字是 3 的倍数,则程序输出 “Fizz”。如果某数字是 5 的倍数,则输出 “Buzz”。如果某数字即是 3 的倍数也是 5 的倍数,则输出 “FizzBuzz”。如果数字既不是 3 的倍数也不是 5 的倍数,则只需输出该数字本身。
示例1:
12345678910111213141516171819202122
public static void Test(){for (int i = 1; i < 101; i++){if (i % 3 == 0 && i % 5 == 0){Console.WriteLine("FizzBuzz");}else if (i % 3 == 0){Console.WriteLine("Fizz");}else if (i % 5 == 0){Console.WriteLine("Buzz");}else{Console.WriteLine(i);}}}
什么感觉?这段代码需要改进吗?
示例2:
1234567891011
public static void Check(){for (int i = 1; i <= 100; i++){string output = "";if (i % 3 == 0) { output = "Fizz"; }if (i % 5 == 0) { output = output + "Buzz"; }if (output == "") { output = i.ToString(); }Console.WriteLine(output);}}
现在感觉如何?还能不能进一步改进?
好,让我们来尝试改进下。代码命名对所有软件开发人员来说都是件非常困难的事情。我们花费了大量的时间来做这件事,而且有太多的需要被命名的元素,例如属性、方法、类、文件、项目等。不过我们的确需要花费一些精力在这些命名上,以使代码中的名称更有意义,进而可以提高代码的可读性。
1234567891011121314151617181920212223242526
public void DoFizzBuzz(){for (int number = 1; number <= 100; number++){var output = GetFizzBuzzOutput(number);Console.WriteLine(output);}}PRivate static string GetFizzBuzzOutput(int number){string output = string.Empty;if (number % 3 == 0){output = "Fizz";}if (number % 5 == 0){output += "Buzz";}if (string.IsNullOrEmpty(output)){output = number.ToString();}return output;}
这次感觉怎样?是不是比之前的示例要好些?是不是可读性更好些?
什么是更好的代码?首先就是代码要为人来编写,其次是为机器。从长期来看,编写可读性好的代码不会比编写混乱的代码要花费更长的时间。如果你能够非常容易地读懂你写的代码,那么想确认其可以正常工作就更容易了。这应该已经是编写易读代码足够充分的理由了。在很多情况下都需要阅读代码,例如在代码评审中会阅读你写的代码,在你或者其他人修复Bug时会阅读你写的代码,在代码需要修改时也会读到。还有就是当其他人准备在类似的项目或有类似功能的项目中尝试复用你的部分代码时也会先阅读你的代码。
“如果你只为你自己写代码,为什么要使代码更具可读性?”
好,编写易读的代码最主要的原因是,在未来的一到两周,你将工作在另一个项目上。而此时,有其他人需要修复当前项目的一个Bug,那么将会发生什么?我敢保证他肯定会迷失在你自己编写的恐怖代码中。