模版代码开发规范.docx
- 文档编号:24285882
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:20
- 大小:79.62KB
模版代码开发规范.docx
《模版代码开发规范.docx》由会员分享,可在线阅读,更多相关《模版代码开发规范.docx(20页珍藏版)》请在冰豆网上搜索。
模版代码开发规范
[项目名称]
开发规范
DevelopmentSpecification
K2公司
2010年11月9日
目录表
1命名空间4
2命名规范5
2.1规范种类5
2.2命名综述5
2.3名称空间6
2.4类6
2.5枚举6
2.6const字段命名6
2.7参数命名7
2.8代码Review配置7
3错误处理8
4日志处理9
5程序配置10
6SQL语句编写规范12
7代码编写12
7.1代码编写规范12
7.2注释14
7.2.1类注释15
7.2.2方法、属性注释15
7.2.3程序注释15
7.3对象状态保持15
7.4数据操作模式16
7.5翻页逻辑17
7.6Cache技术应用17
7.7性能相关问题17
7.8线程设计原则18
7.8.1避免在静态方法中修改静态状态18
7.8.2为服务器环境设计18
7.8.3实例状态不必是线程安全的18
7.8.4静态状态必须是线程安全的18
7.8.5注意非原子操作18
7.8.6注意锁定区域的方法调用19
7.8.7注意’lock’语句的问题19
7.8.8可能的话避免同步19
7.9测试代码规范19
1命名空间
所有组件的父命名空间均为:
Sdp
所有的和SDP集成组件相关的命名空间均为:
Sdp.Itgr
所有的核心组件相关的命名控件均为:
Sdp.Core
所有的组件命名空间如下表所列:
Namespace
ComponentName
Comment
Sdp.WapPortal
WAP门户
Sdp.Subscribe
定购系统
Sdp.CPMgnt
CP管理系统
Sdp.UserMgnt
用户管理系统
Sdp.PortalMgnt
门户管理系统
Sdp.ServMgnt
服务管理系统
Sdp.Mediation
采集系统
Sdp.Settlement
结算系统
Sdp.Billing
计费系统
Sdp.Gateway
鉴权网关系统
Sdp.Account
帐务系统
Sdp.Push
Push核心
Sdp.PushAgent
Push代理
Sdp.Report
常规报表
Sdp.Advertising
广告管理
Sdp.IngrMgnt
接口管理
Sdp.AccessMgnt
权限管理
Sdp.DigitalURI
数字网址
2命名规范
2.1规范种类
PascalCasing
每一个单词的第一个字母大写,例如:
BackColor。
CamelCasing
除了第一个单词以外的每个单词的第一个字母大写,例如:
backColor。
Uppercase
如果缩写字母的个数小于或等于2,那么所有的缩写字母都大写。
3个以上的字母缩写采用PascalCasing。
例如:
System.IO
System.Web.UI
System.CodeDom
2.2命名综述
Type
Case
Notes
Class
PascalCase
Enumvalues
PascalCase
Enumtype
PascalCase
Events
PascalCase
Exceptionclass
PascalCase
以Exception结尾
FinalStaticfield
PascalCase
interface
PascalCase
用大写字母I开头
Method
PascalCase
Namespace
PascalCase
property
PascalCase
PublicInstanceField
PascalCase
很少使用,用在properties
ProtectedInstancesFields
camelCase
很少使用,用在properties
parameter
camelCase
2.3名称空间
Microsoft.Office
PowerSoft.PowerBuilder
不要为名字空间和类名指定相同的名称。
例如不要把Debug设定为名字空间的名称,同时有一个类名称也是Debug。
2.4类
用名词和名次短语作类名
用Pascal命名规则
尽量谨慎地使用缩写
不要用任何类前缀(例如C,T)
不要用下划线作类名
2.5枚举
对于枚举类型名称用Pascal命名规则
对于枚举值类型也使用Pascal命名规则
谨慎地使用缩写
对于枚举类型名称和枚举值不要用任何前缀
例如:
adXXXforADOenums,rtfXXXforrichtextenums,etc.
对于枚举类型名称不要用Enum后缀
对于枚举类型名称使用单数
对于bit字段的枚举类型名称使用复数
如果枚举值被用在函数参数和属性,请显示地定义参数类型为枚举类型。
这样开发工具可以找到所有该属性可能用到的值(Toolbox)
2.6const字段命名
静态字段的命名采用名词、名次短语或名次的缩写
对于静态字段采用Pascal命名约定
不要用匈牙利命名法的前缀
2.7参数命名
参数的名字应该是描述性的,也就是说参数的名称可以描述参数在大多数情况下的含义,参数的类型也是可以从参数的名字推断出来的
参数的名字使用camelCasing(首字母小写)
参数的名字是基于参数的含义而不是参数的类型
如果下一个版本需要更多的参数,那么加一个overload的方法。
不要使用匈牙利命名法
2.8代码Review配置
3错误处理
公用错误处理机制见架构文档《错误处理》一节
所有的文件操作,网络操作,数据库操作,MSMQ,LDAP,都可能失败,任何对上述操作的调用必须用try…cacth…finally保护,如果捕获到了异常,必须将原始异常输出到日志。
注:
为了提高系统的性能,尽量采用If语句捕获可以预料的错误,例如:
文件无法打开,不要采用以下方式:
try{
Openfile…
Writefile
}
Catch{
…
}
上述代码的问题在于,对打开文件的结果没有判断,过于依赖异常处理,过多的异常发生会严重降低性能,在可能的情况下应该尽量避免,采用以下代码会好得多:
try{
if(Openfile…成功){
Writefile
}
else{
…
}
}
Catch{
…
}
对象创建,对象方法的调用,可以视情况而定。
远程对象创建,远程对象方法的调用,必须用try…cacth…finally保护,如果捕获到了异常,必须输出到日志。
4日志处理
公用日志处理见架构文档《日志处理》
注意:
不能采用System.Diagnostics.EventLog的静态方法WriteEntry将各种信息输出到系统日志。
如果要写系统日志,请调用提供的写日志公共模块。
5程序配置
公用配置见架构文档《配置处理》一节
系统配置指的是系统实施过程中确定的数据,例如:
数据库连接,各种外部系统的地址,系统各种参数的优化等等。
系统配置采用配置文件。
ASP.NET的配置
其它的系统采用标准的.Net配置文件。
.Net配置文件对不同的应用具有不同的形式:
1.ASP.NET,对于ASPX应用和WebService而言,配置文件为当前路径下的文件,文件名是:
web.config
2.EXE应用,对于普通EXE的应用,配置文件为当前路径下的文件,文件名是:
ExeFilename.config,ExeFilename是该EXE的文件名,包括扩展名。
DLL,由于Assembly读取的配置文件是与Appdomain相关的,不能为Assembly单独创建如Assmbleyname.config的配置文件。
所以建议Assembly中不要读取配置文件,需要的配置信息应该由外部调用程序传入。
如果Assembly中必须读取配置文件,一定要在Assembly源代码的文件头中说明。
有关配置文件的细节可以参见MSDN,以下是一个配置文件的例子:
xmlversion="1.0"?
>
……
配置文件中自定义的信息
配置文件中可以添加自定义的信息,采用
例如:
xmlversion="1.0"?
>
……
访问自定义配置信息
可以用System.Configuration.ConfigurationSettings.AppSettings来获取自定义的信息。
System.Configuration.ConfigurationSettings.AppSettings是一个Indexer,对于上面的例子,可以按照以下方式获得MyApplication:
System.Configuration.ConfigurationSettings.AppSettings[ApplicationName]
配置信息在AppDomain级别上定义,每个App需要定义该App引用的每个Assembly需要的所有配置信息。
例:
如果一个Sample.aspx页面中引用了一个UserOp.dll的Assembly,而该Assembly中某些方法需要从配置文件中读取参数名为SDP.Core.SysConnectionString的数据库连接串配置信息,在Sample.aspx对应的Web.config文件中必须增加SDP.Core.SysConnectionString的配置信息。
Web.config文件如下所示
xmlversion="1.0"?
>
……
为统一,所有工程的配置文件中核心数据库连接串的参数名应为SDP.Core.SysConnectionString。
6SQL语句编写规范
SQL语句中所有的SQL关键字大写,表名、列名等SQL语句中的对象名的大小写采用数据库设计时名称的大小写规范。
如:
SELECTNameFROMTable1WHEREAge>28
为了提高数据库的性能,所有参数都采用参数的方式传入,不要把参数的内容直接拼在SQL语句中。
如果一个SQL语句中有一个的内容是从界面输入获得的,为了防止SQL注入式攻击,不要把界面上输入的内容直接拼在SQL语句中,而是使用参数传入,遵循上一条标准。
7代码编写
7.1代码编写规范
1.使用异常只是标识错误而不是用来表示状态或者错误代码值
2.所有类以及public方法都使用.NET样式的注释,即///summary格式.注意Summary中说明代码有那些功能,而不是这个功能如何实现的.可以在Remarks块或者代码中说明.
3.所有方法的参数的合法性是否做验证,对非法的参数是否抛出异常?
4.是否使用Debug.Asserts来验证代码中的假设?
“j应该是正数?
“之类的注释应该用Debug.Asserts来重写.
5.不需要实例化的类是否包含私有构造函数?
6.是否利用值类型的类用于参数,方法返回值以及存放在集合中?
7.Assembly特有的类,方法,事件的访问修饰符是否已经标记为Internal?
8.多线程同时访问的单件对象(singleton)是否正确的初始化?
(SeetheEnterpriseSolutionPatternsbook,p263)
9.必须被衍生类重写的方法申明为Abstract了吗?
10.不能重写的类是否标记为Sealed?
11.可能失败的转换是否使用了AS运算符?
12.输出对象的状态的时候应该重写ToString方法而不是加一个类似Dump之类的方法.
13.所有log的消息都有log组建处理,而不是仅仅输出到控制台.
14.finnally代码块用于try后必须执行的代码
15.尽可能的采用foreach而不是for(inti...)
16.是否属性没有实现getter和setter方法
17.只读的属性应该没有setter方法
18.衍生类重写的方法是否都使用了override关键字
19.正确的使用interface和抽象类.
20.接口实现和抽象类继承
21.操作系统资源的类是否实现了IDisposable接口?
22.是否所有实现IDisposable的类初始化的时候使用了Using语句?
23.使用lock语句而不是monitor.enter
24.线程使用事件或者Pulse唤醒,而不是使用sleep主动的唤醒.
25.是否正确的重写了equals
26.==和!
=操作符号被重写,他们被重定向到Equals
28.重载了Equals方法的对象应当也提供一个GethashCode方法重载,两者应当拥有同样的语义。
29.异常类的构造函数是否含有一个参数string,参数string和exception的构造器。
30.自定义异常类的继承层次是否正确的继承基类
31.所有被Marshal或者远程处理的对象有序列化标志
32.所有标记有Serializable属性的类是否有默认的构造函数,包括常见的Exception和EventArgs类.
33.实现Iserializable接口的类是否显式的实现GetObjectData和隐式的构造函数,例如Serializaioninfo和StreamingContext作为参数
34.做浮点运算的时候,所有的常量都是double类型而不是整数
35.委托是否都有void返回值,避免使用out或者ref类型的参数
36.所有的委托又有sender对象作为第一个参数
37.从EventArg继承的类是否是只读的,只读的参数可以避免一个订阅者对参数的修改影响其他的参数订阅者
38.所有的委托是否发布为事件?
这样预防从事件内容触发一个订阅。
39.单元测试(nUint)的时候,常见的驱动代码和测试代码分开.
40.在nUnit测试中使用ExpectedExcetpion来指示异常必须抛出。
7.2注释
程序代码必须对关键部份进行注释,说明被注释部份的主要用途,对于每一个类和每一个方法前面都必须保持一个简要的说明,示例如下:
//===================================================================
//Class:
SystemLog
//Purpose:
Recordthesystemleveleventtosystemlog
//Owner:
xxxx
//LastModifiedBy:
xxxxx
//LastModifiedAt:
2003/03/15
//====================================================================
publicclassSystemLog
{
.....
//-------------------------------
//Method:
WriteLog()
//Purpose:
Writesystemeventmessagetosystemlog
//LastModifiedBy:
Liurx
//LastModifiedAt:
2003/03/15
//-----------------------------------
publicstaticvoidWriteLog(LogSourcesource,stringlogMsg,LogTypetype)
{
......
}
}
7.2.1类注释
在类的开始,应说明类的功能
///
///SummarydescriptionforClass1.
///
classClass1
必须采用以上的方式。
采用(///)和
7.2.2方法、属性注释
在方法、属性的开始,应说明该方法、属性的功能、输入/输出和返回值,如下所示:
///
///
///
publicintTest(inti)
7.2.3程序注释
在程序设计编写中,应对其功能进行说明,如下所示:
Count++;//Addthecountervalue
7.3对象状态保持
所有的方法都必须是无状态的。
即一个方法的调用不能依赖于前一个调用方法的处理结果。
如以下的代码是不允许的:
[C#]
ClassFoo
{
publicconnect_string;
publicFun()
{
...
dc.Open(connect_string);
}
}
必须每次方法调用都传入所有需要的参数。
页面状态不能保持viewstate
7.4数据操作模式
对于系统数据的操作采用分层模式:
前台逻辑->业务逻辑->数据对象->数据库
业务逻辑为封装了业务操作的组件,如客户管理类。
数据对象为封装了数据库对象的组件,如客户数据类,所有对数据库中客户数据的操作都通过客户数据类进行。
数据对象类从Dataset类派生。
对每一个底层数据库表(也可能是相关表的集合)的操作必须定义数据操作层,数据操作层由两个对象组成,一组是数据库表实体对象,从DataSet类派生,一个数据库操作对象,负责提供对数据库表对象的操作,
命名规范为:
数据库表实体对象-
数据库操作对象-
例如:
一组相关表有:
User表,Subscription表
则需要定义两个数据表实体对象:
UserData:
DataSet,SubsciptionData:
DataSet
还需要定义一个数据表操作对象:
UserAccessor
对每一个数据操作,数据表操作对象必须提供如下方法:
每一个读取操作-Get
新增记录操作-Insert
修改记录操作-Update
删除记录操作-Delete
例如,对上述例子,UserAccessor提供如下方法:
UserDataGetUserByID()-按照用户ID号获取用户数据
voidInsertUser()-新增用户
原则上对于每一个操作在数据库中创建一个存储过程,命名方式为:
up
operation-Insert/Update/Delete/Get
7.5翻页逻辑
如果采用直接连接数据库表获取DataSet的方式,每查询返回结果在1000条以内可以直接采用,否则要用服务器端分页技术,详细见架构文档的翻页逻辑。
7.6Cache技术应用
7.7性能相关问题
MakingnumerousservicerequestsacrosstheInternetcanaffecttheperformanceoftheclientapplication.WhendesigningyourXMLWebservice,makeefficientuseofservicerequestsbycreatingmethodsthatgrouprelatedinformationtogether.Forexample,supposeyouhaveanXMLWebservicethatretrievesinformationaboutabook.Insteadofhavingseparatemethodstoretrievethebooktitle,author,andpublisher,createamethodthatreturnsallthisinformationinoneservicerequest.Itismoreefficienttotransferalargeblockofinformationatonetimethanmultiplesmallerblocksofinformation
YoucanalsousetheCacheDurationpropertyoftheWebMethodattributeclasstoenablecachingontheserver.ThefollowingcodeexampledemonstrateshowtousetheCacheDurationpropertyonXMLWebservicemethodstospecifyoutputcachingforaperiodof60seconds.
<%@WebServiceLanguage="C#"Class="MathService"%>
usingSystem;
usingSystem.Web.Services;
publicclassMathService:
WebService{
[WebMethod(CacheDuration=60)]
publicfloatAdd(floata,floatb)
{
returna+b;
}
[WebMethod(CacheDuration=60)]
publicfloatSubtract(floata,floatb)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模版 代码 开发 规范