软件开发编码规范DOC.docx
- 文档编号:550062
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:17
- 大小:24.21KB
软件开发编码规范DOC.docx
《软件开发编码规范DOC.docx》由会员分享,可在线阅读,更多相关《软件开发编码规范DOC.docx(17页珍藏版)》请在冰豆网上搜索。
软件开发编码规范DOC
软件开发编码规范(C#)
1引言
1.1编写目的
本规范旨在用规范文件的形式,对全公司使用C#进行的编程过程,进行有效的规范管理,使得最终的软件产品具有良好的风格和统一的结构,且使代码可读性强、易维护。
本规范预期读者是全公司所有参与编程的软件开发人员以及其他相关人员。
本标准适用于VisualC#,其余语言作参考。
1.2背景
公司在上一个项目中由于代码编写风格不统一,可读性较差、较难维护,使得工作效率有所降低。
1.3定义
无
1.4参考资料
PascalStandardsFAQ(E)
JavaDoc(E)
Doc-O-maticDocument(E)
ArtemisAllianceDelphiCodingStandards(E)
《C#基本书写规范》
《C#编码规范纲要》
2基本要求
2.1程序结构要求
程序结构清晰,简单易懂,单个函数的程序行数一般不得超过100行,个别特殊函数除外。
代码中打算干什么,要简单,直接了当,代码精简,避免垃圾程序。
应尽量使用.NET库函数和公共函数(无特殊情况不要使用外部方法调用windows的核心动态链接库)。
一般情况下,不得使用全局变量,尽量使用局部变量。
2.2可读性要求
可读性第一,效率第二。
(这仅对代码本身而言)。
保持注释与代码完全一致。
每个源程序文件,都必须有文件头说明,说明规格见“源程序文档注释规范”一节。
每个函数,都必须有函数头说明,说明规格见“源程序文档注释规范”一节。
主要变量(结构、联合、类或对象)定义或引用时,注释必须能反映其物理含义。
处理过程的每个阶段都必须有相关注释说明。
在典型算法前都必须有注释,同时算法在满足要求的情况下应尽可能简单。
利用缩进来显示程序的逻辑结构,缩进量一致以Tab键为单位,定义Tab为4个
字节。
循环、分支层次不要超过五层。
注释可以与语句在同一行,也可以在上行。
空行和空白字符也是一种特殊注释。
一目了然的语句不加注释。
注释的作用范围可以为:
定义、引用、条件分支以及一段代码。
注释行数(不包括文件头和函数头说明部份)应占总行数的1/5到1/3。
常量定义(const)有相应说明。
2.3结构化要求
禁止出现两条等价的支路。
禁止GOTO语句。
用IF语句来强调只执行两组语句中的一组。
禁止ELSEGOTO和ELSERETURN。
用CASE实现多路分支。
避免从循环引出多个出口。
函数只有一个出口。
不使用复杂的条件赋值语句。
避免不必要的分支。
不要轻易用条件分支去替换逻辑表达式。
2.4正确性与容错性要求
程序首先是正确,其次是优美。
无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。
改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。
所有变量在调用前必须被初始化。
对所有的用户输入,必须进行合法性检查。
不要比较浮点数的相等,如:
10.0*0.1==1.0,不可靠。
程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否逻辑锁定、打印机是否联机等,对于明确的错误,要有明确的容错代码提示用户。
单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。
尽量使用规范的容错语句。
例如:
try
{
}
catch
{
}
finally
{
}
2.5可重用性要求
重复使用的完成相对独立功能的算法或代码应抽象为服务或类。
服务或类应考虑面向对象(OO)思想,减少外界联系,考虑独立性或封装性。
3用户界面设计原则
除标题部分外,所有显示给用户的字体(如BUTTON和LABEL等)使用标准字体:
宋
体、九号、黑色;标题部分可用醒目的字体,如:
宋体、小二号、红色。
采用Windows缺省的风格。
窗体尽量从已有的父窗体继承。
方便用户对信息的输入、修改和阅读。
验证用户输入的有效性和合理性。
具有清晰明确的用户提示信息。
使用Tab键在输入项之间移动输入焦点(可选)。
标准按钮大小必须相同,使用的图像和标题必须与《界面风格规范》一致,如果出现该规范中没有的地方,须与项目负责人和美工协商。
4源程序书写规范
4.1通用源代码格式规则
4.1.1缩进
缩进就是每级间有一个Tab单位。
不要在源代码中放置制表符。
这是因为,制表符的宽度随着不同的设置和代码管理实用程序(打印、文档及版本控制等)而不同。
沿逻辑结构行缩进代码。
没有缩进,代码将变得难以理解,如:
if(expression)
{
//
//此处填写你的代码块;
//
}
if(expression)
{
//
//此处填写你的代码块;
//
}
else
{
//
//此处填写你的代码块;
//
}
缩进代码会产生出更容易阅读的代码,如:
if(expression)
{
if(expression)
{
//
//此处填写你的代码块;
//
}
else
{
//
//此处填写你的代码块;
//
}
}
4.1.2边距
边距设置为80个字符。
源代码一般不会因写一个单词而超过边距,但本规则比较灵活。
只要可能,长度超过一行的语句应当用分行符换行。
换行后,应缩进两个字符。
4.1.3“{}”的使用
“{”或“}”必须单独占一行。
例如:
错误形式:
for(i:
=0;i<10;i++){//错,“{”与for在同一行
}
正确形式:
for(i:
=0;i<10;i++)//对,“{”在另外一行中
{
}
4.1.4注释
通常使用“/*...*/”类型的块注释和“//”类型的行注释。
4.2语句格式与语句书写规范
4.2.1括号
在左括号与下一字符之间没有空格。
同样,右括号与前一字符也没有空格。
下面的例子演示了正确与不正确的空格。
CallProc(aParameter);//错!
CallProc(aParameter);//正确!
4.2.2保留字和关键字
在用户的各种命名中不能单独使用保留字或关键字来进行命名。
4.2.3函数
4.2.3.1格式
函数名要能体现出该函数要实现的功能,应当以大写字母开始,且大小写交错以增加可读性(每个单词的首字母大写)。
下面是一个不正确的写法:
pubilcvoidthisisapoorlyformattedroutinename()
下面是正确的写法:
pubilcvoidThisIsMuchMoreReadableRoutineName()
4.2.3.2形参
1)参数顺序
形参的顺序主要要考虑寄存器调用规则。
最常用的参数应当作为第一个参数,按使用频率依次从左到右排。
输入参数位于输出参数之前。
范围大的参数应当放在范围小的参数之前。
例如:
SomeProc(aPlanet,aContinent,aCountry,aState,aCity).
有些则例外。
例如,在事件处理过程中,Object类型的Sender参数往往是第一个要传递的参数。
2)常量参数
任何值类型参数,只要不加REF标志,都是常量参数;
任何引用类型参数,都不是常量参数,不管加不加标志。
4.2.4变量
4.2.4.1局部变量
局部变量用于过程内部,如果需要的话,应当在过程的入口处立即初始化变量。
4.2.4.2全局变量
一般不鼓励使用全局变量。
不过,有时候需要用到。
即使如此,也应当把全局变量限制在需要的环境中。
例如,一个全局变量可能只在单元的实现部分是全局的。
全局数据如果将由许多单元使用,就应移动到一个公用单元里被所有对象使用。
全局数据可在声明时直接初始化为一个值。
4.2.5语句
4.2.5.1If语句
在if/else语句中,if子句的条件应该直接且易于理解。
为了避免出现许多if语句,可以使用switch语句代替。
如果多于5级,不要使用if语句。
请改用更清楚的方法。
如果在if语句中有多个条件要测试,应按照计算的复杂程度从右向左排。
这样,可以使代码充分利用编译器的短路估算逻辑。
例如,如果Condition1比Condition2快,Condition2比Condition3快,则if语句一般应这样构造:
if(Condition1&&Condition2&&Condition3)
如果Condition3为False的机会很大,利用短路估算逻辑,我们也可以将Condition3放在最前面:
if(Condition3&&Condition1&&Condition2)
有if出现,就必须有对应的else出现。
if语句的三种形式:
1)形式一(不需要else)
if(Condition)
{
Process;
}
//else
//{
//NoElseNeeded
//}
2)形式二(需要else,但是else里面不需要处理)
if(Condition)
{
Process;
}
else
{
//NoNeedProcess
}
3)形式三(if里面不需要处理)
if(Condition)
{
//NoNeedProcess
}
else
{
Process;
}
4.2.5.2switch语句
1)概述
switch语句中每种情况的常量应当按数字或字母的顺序排列。
每种情况的动作语句应当简短且通常不超过4-5行代码。
如果动作太复杂,应将代码单独放在一个函数中。
switch语句的else子句只用于默认情况或错误检测。
2)格式
switch语句遵循一般的缩进和命名规则。
4.2.5.3while语句
所有对while循环进行初始化的代码应当位于while入口前,且不要被无关的语句隔开。
任何业务的辅助工作都应在循环后立即进行。
4.2.5.4for语句
如果循环次数是确定的,应当用for语句代替while语句。
5命名规范
5.1函数命名
函数名应当有意义。
进行一个动作的函数最好在名称前加上表示动作的动词为前缀。
例如:
publicvoidFormatHardDrive()
设置输入参数值的函数名应当以Set为其前缀,例如:
publicvoidSetUserName()
获取数值的函数名应当以Get为其前缀,例如:
publicstringGetUserName()
函数名称第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线间隔,示例如下:
publicvoidPrintTrackData()
publicvoidShowChar(intaIndex,charaszMyChar)
5.2形参
所有形参的名称都应当表达出它的用途。
如果合适的话,形参的名称最好以字母a为前缀,例如:
publicvoidSomeProc(stringaUserName,integeraUserAge)
当参数名与类的特性或字段同名时,前缀a就有必要了。
5.3常量和变量
5.3.1常量和宏定义
常量和宏定义必须具有一定的实际意义;常量和宏定义必须全部以大写
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 开发 编码 规范 DOC