微信号:csharpba

介绍:百度c# (csharp)贴吧,.NET技术交流.

编写更好的C#代码

2015-05-11 14:01 csharp吧

引言

开发人员总是喜欢就编码规范进行争论,但更重要的是如何能够在项目中自始至终地遵循编码规范,以保证项目代码的一致性。并且团队中的所有人都需要明确编码规范所起到的作用。在这篇文章中,我会介绍一些在我多年的从业过程中所学习和总结的一些较好的实践。

举例为先:我们先来看一个 FizzBuzz 示例。FizzBuzz 要求编写一个程序,遍历从 1 到 100 的数字。其中如果某数字是 3 的倍数,则程序输出 “Fizz”。如果某数字是 5 的倍数,则输出 “Buzz”。如果某数字即是 3 的倍数也是 5 的倍数,则输出 “FizzBuzz”。如果数字既不是 3 的倍数也不是 5 的倍数,则只需输出该数字本身。


示例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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:

1
2
3
4
5
6
7
8
9
10
11
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);
}
}

现在感觉如何?还能不能进一步改进?

好,让我们来尝试改进下。代码命名对所有软件开发人员来说都是件非常困难的事情。我们花费了大量的时间来做这件事,而且有太多的需要被命名的元素,例如属性、方法、类、文件、项目等。不过我们的确需要花费一些精力在这些命名上,以使代码中的名称更有意义,进而可以提高代码的可读性。

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,那么将会发生什么?我敢保证他肯定会迷失在你自己编写的恐怖代码中。


从我的个人观点来看,好的代码应该拥有以下几个特征:

1. 代码容易编写,并易于修改和扩展。

2.代码干净,并表述准确。

3.代码有价值,并注重质量。

所以,要时刻考虑先为人来编写代码,然后再满足机器的需要。

如何改进可读性?


首先,你需要阅读学习其他人编写的代码,来了解什么是好的代码,什么是不好的代码。也就是那些你感觉非常容易理解的代码,和感觉看起来超级复杂的代码。然后,进行实践。最后花费一些时间、经验和实践来改进你的代码的可读性。一般来讲仅通过培训这种方式,在任何软件公司中推动编码规范都有些困难。而诸如结对代码评审,自动化代码评审工具等也可以帮助你。目前流行的工具有:

1.FxCop:对 .NET 代码进行静态代码分析,提供了多种规则来进行不同形式的分析。

2. StyleCop:开源项目,其使用代码风格和一致性规范来对分析C#代码。可在 Visual Studio 中运行,也可以集成到 MSBuild 中。StyleCop 也已经被集成到了一些第三方开发工具中。

3.JetBrains ReSharper:非常著名的提升生产力的工具,可以使 Microsoft Visual Studio IDE 更加强大。全世界的 .NET 开发人员可能都无法想象,工作中怎么能没有 ReSharper 的代码审查、代码自动重构、快速导航和编码助手等这些强大的功能呢。

规范是什么?

你应该能说出属性、局部变量、方法名、类名等的不同,因为它们使用不同的大小写约定,所以这些约定非常有价值。通过互联网,你已经了解了很多相应的准则和规范,你所需要的仅是找到一种规范或者建立你自己的规范,然后始终遵循该规范。

下面使用到的源代码是由微软的 Special Interest Group 团队开发的,我只是做了些扩展。

大小写约定

下面是一些关于C#编码标准、命名约定和最佳实践的示例,可以根据你自己的需要来使用。

Pascal Casing

标示符中的首字母,后续串联的每个单词的首字母均为大写。如果需要,标示符的前几个字母均可大写。

Camel Casing

  

标示符的首字母为小写,后续串联的每个单词的首字母为大写。

你应该能说出属性、局部变量、方法名、类名等的不同,因为它们使用不同的大小写约定,所以这些约定非常有价值。通过互联网,你已经了解了很多相应的准则和规范,你所需要的仅是找到一种规范或者建立你自己的规范,然后始终遵循该规范。

下面使用到的源代码是由微软的 Special Interest Group 团队开发的,我只是做了些扩展。


为什么我们需要编码规范?

  

在大型项目中,开发人员会常依赖于编码规范。他们建立了很多规范和准则,以至于记住这些规范和准则已经变成了日常工作的一部分。计算机并不关心你写的代码可读性是否好,比起读懂那些高级的程序语言语句,计算机更容易理解二进制的机器指令。

编码规范提供了很多明显的好处,当然有可能你得到的更多。通常这些项目整体范围的规划,将使能够将精力更多的集中在代码中更重要的部分上。

1.编码规范可以帮助跨项目的传递知识。

2.编码规范可以帮助你在新的项目上更快速的理解代码。

3.编码规范强调组织中关联项目间的关系。

你需要编写可读性高的代码,以此来帮助其他人来理解你的代码。代码命名对我们软件开发人员来说是件非常困难的事情,我们在这上面已经花费了大量的时间,并且有太多的需要命名的元素,例如属性、方法、类、文件、项目等。所以我们确实需要花费一些精力在命名规范上,以使名称更有意义,进而提高代码的可读性。

还有,编码规范可以让你晚上睡得更香。


 

 
csharp吧 更多文章 c#官方微信公众号-首篇语 C# memcache 清除代码异味 有人向我反馈了一个bug 25个Git用法技巧
猜您喜欢 听说 libevent 的并发工作做得很好? 35行代码搞定事件研究法(下) 深度学习及其在淘宝图像应用探讨 前端MVC变形记 iOS调用相册、相机、上传等问题