全面的编码标准包含代码结构的所有方面

来源: 作者: 2005-08-02 出处:pcdog.com

.net  xml  错误代码  多线程  数据库  

全面的编码标准包含代码结构的所有方面。虽然开发人员在实现标准时应慎重,但只要应用了就应该坚持。完成的源代码应该反映出一致的样式,就像一个开发人员在一个会话中编写代码一样。在开始软件项目时,建立编码标准以确保项目的所有开发人员协同工作。

当软件项目并入现有的源代码时,或者在现有软件系统上执行维护时,编码标准应说明如何处理现有的基本代码。

源代码的可读性对于开发人员对软件系统的理解程度有直接影响。代码的可维护性是指为了添加新功能、修改现有功能、修复错误或提高性能,可以对软件系统进行更改的难易程度。尽管可读性和可维护性是许多因素的结果,但是软件开发中有一个特定的方面受所有开发人员的影响,那就是编码方法。确保开发小组生产出高质量代码的最容易方法是建立编码标准,然后在例行代码检查中将执行此标准。

使用一致的编码方法和好的编程做法来创建高质量代码在软件的品质和性能中起重要作用。另外,如果一致地应用正确定义的编码标准、应用正确的编码方法并在随后保持例行代码检查,则软件项目更有可能产生出易于理解和维护的软件系统。

尽管在整个开发周期内执行代码检查的主要目的是识别代码中的缺陷,但检查还可以以统一的方式执行编码标准。只有在整个软件项目中从开始到完成都遵从编码标准时,坚持编码标准才是可行的。在即成事实之后强加编码标准既不切合实际也是不明智的。

编码方法

编码方法合并了软件开发的许多方面。尽管它们通常对应用程序的功能没有影响,但它们对于改善对源代码的理解是有帮助的。这里考虑了所有形式的源代码,包括编程、脚本撰写、标记和查询语言。

不建议将这里定义的编码方法形成一套固定的编码标准。相反,它们旨在作为开发特定软件项目的编码标准的指南。

编码方法分为三部分:

命名

对于理解应用程序的逻辑流,命名方案是最有影响力的一种帮助。名称应该说明“什么”而不是“如何”。通过避免使用公开基础实现(它们会发生改变)的名称,可以保留简化复杂性的抽象层。例如,可以使用 GetNextStudent(),而不是 GetNextArrayElement()。

命名原则是:选择正确名称时的困难可能表明需要进一步分析或定义项的目的。使名称足够长以便有一定的意义,并且足够短以避免冗长。唯一名称在编程上仅用于将各项区分开。表现力强的名称是为了帮助人们阅读;因此,提供人们可以理解的名称是有意义的。不过,请确保选择的名称符合适用语言的规则和标准。

以下几点是推荐的命名方法。

例程

变量

杂项

注释

软件文档以两种形式存在:外部的和内部的。外部文档(如规范、帮助文件和设计文档)在源代码的外部维护。内部文档由开发人员在开发时在源代码中编写的注释组成。

不考虑外部文档的可用性,由于硬拷贝文档可能会放错地方,源代码清单应该能够独立存在。外部文档应该由规范、设计文档、更改请求、错误历史记录和使用的编码标准组成。

内部软件文档的一个难题是确保注释的维护与更新与源代码同时进行。尽管正确注释源代码在运行时没有任何用途,但这对于必须维护特别复杂或麻烦的软件片段的开发人员来说却是无价的。

以下几点是推荐的注释方法:

格式

格式化使代码的逻辑结构很明显。花时间确保源代码以一致的逻辑方式进行格式化,这对于您和必须解密源代码的其他开发人员都有帮助。

以下几点是推荐的格式化方法。

·                for (i = 0; i < 100; i++)

·                {

·                   ...

}

还可以使用倾斜样式,即左括号出现在行尾,右括号出现在行首,如:

for (i = 0; i < 100; i++){

   ...

}

无论选择哪种样式,请在整个源代码中使用那个样式。

·                If ... Then

·                If ... Then

·                ...

·                Else

·                End If

·                Else

·                ...

End If

缩进代码会产生出更容易阅读的代码,如:

If ... Then

   If ... Then

   ...

   Else

   ...

   End If

Else

...

End If

·                SELECT FirstName, LastName

·                FROM Customers

WHERE State = 'WA'

1.         是否使用异常来显示错误而不是返回状态或错误代码

2.         所有的类和公共方法是否使用.NET样式的注释?注意,<summary>注释应该论述公共方法是什么。对于怎么使用则应该放在<remarks>块中或是内嵌于正被讨论的代码中

3.         如果方法的参数不正确,是否使用一个异常来进行确认和拒绝?

4.         Debug.Asserts是否被用来验证关于代码功能的假定?注释例如:"j will be positive"应该被作为断言(Asserts)重写

5.         那些不应该被初始化的类是否有一个私有的构造函数?

6.         那些被声明为值类型并极少使用为方法参数的类是否从方法中返回或是存放在集合(Collections)中?

7.         那些被只应用在一个程序集中的类是否被标记为internal

8.         那些能被多线程访问的单态类(Singletons)是否能够被正确地初始化?参考 the Enterprise       Solution Patterns book, p. 263.

9.         必须被继承类重载的方法是否被标记为abstract

10.     不应该被重载的类是否标记为sealed

11.     “as” 是否可能被不正确的使用?

12.     是否类重载 ToString 而不是定义另外一个方法来输出对象的状态?

13.