模版代码开发规范_第1页
模版代码开发规范_第2页
模版代码开发规范_第3页
模版代码开发规范_第4页
模版代码开发规范_第5页
免费预览已结束,剩余18页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 项目名称 开发规范Development SpecificationK2 公司2010 年 11 月 9 日目录表命名空间命名规范2.1规范种类命名综述名称空间枚举const字段命名参数命名代码Review配置错误处理日志处理程序配置SQL语句编写规范代码编写代码编写规范注释.211111113类注释方法、属性注释程序注释对象状态保持.7.2.314141414数据操作模式翻页逻辑Cache技术应用性能相关问题线程设计原则...67

2、.1515161617避免在静态方法中修改静态状态为服务器环境设计实例状态不必是线程安全的静态状态必须是线程安全的 注意非原子操作注意锁定区域的方法调用注意IOC语句的问题可能的话避免同步测试代码规范181717171717181818Page 3 of 18 K21命名空间所有组件的父命名空间均为:SdpSdp .ItgrSdp .Core所有的和SDP集成组件相关的命名空间均为: 所有的核心组件相关的命名控件均为: 所有的组件命名空间如下表所列:Names paceComponent NameComme ntSdp.WapP ortalWAP门户Sdp .Subscribe

3、定购系统Sdp .C PM gntCP管理系统Sdp .UserMgnt用户管理系统Sdp.P ortalMgnt门户管理系统Sd p.ServMgnt服务管理系统Sdp .Mediation采集系统Sdp .Settlement结算系统Sd p.Billing计费系统Sdp .Gateway鉴权网关系统Sdp. Account帐务系统Sdp.P ushPush核心Sdp.P ushAgentPush代理Sdp .Report常规报表Sdp. Advertising广告管理Sdp .IngrMgnt接口管理Sd p.AccessMgnt权限管理Sd p.DigitalURI数字网址P age

4、5 of 182命名规范2.1规范种类Pascal Casing每一个单词的第一个字母大写,例如:BackColor 。Camel Casing除了第一个单词以外的每个单词的第一个字母大写,例如:backColor 。Upper case如果缩写字母的个数小于或等于Casing。例如:2,那么所有的缩写字母都大写。3个以上的字母缩写采用PascalSystem.lOSystem.Web.UI System.CodeDom2.2命名综述TypeCaseNotesClassPascalCaseEnum valuesPascalCaseEnum typePascalCaseEventsPascalC

5、aseExce pti on classPascalCase以 Exception 结尾Final Static fieldPascalCasein terfacePascalCase用大写字母1开头MethodPascalCaseNames pacePascalCasepropertyPascalCaseP ublic In sta nee FieldPascalCase很少使用,用在propertiesProtected In sta nces FieldscamelCase很少使用,用在propertiesp arametercamelCaseP age 9 of 182.3名称空间Mi

6、crosoft.Office Po werSoft. Po werBuilder例如不要把Debug设定为名字空间的名称,同时有一个类名称不要为名字空间和类名指定相同的名称。也是Debug。2.4类用名词和名次短语作类名用Pascal命名规则尽量谨慎地使用缩写不要用任何类前缀(例如C,T)不要用下划线作类名2.5枚举对于枚举类型名称用P ascal命名规则对于枚举值类型也使用P ascal命名规则谨慎地使用缩写对于枚举类型名称和枚举值不要用任何前缀例如: adXXX for ADO en ums, rtfXXX for rich text en ums, etc.对于枚举类型名称不要用Enum

7、后缀对于枚举类型名称使用单数对于bit字段的枚举类型名称使用复数如果枚举值被用在函数参数和属性,请显示地定义参数类型为枚举类型。这样开发工具可以找到所有该 属性可能用到的值(Toolbox)2.6 const字段命名静态字段的命名采用名词、名次短语或名次的缩写对于静态字段采用Pascal命名约定不要用匈牙利命名法的前缀2.7参数命名参数的名字应该是描述性的,也就是说参数的名称可以描述参数在大多数情况下的含义,参数的类型也是可以从参数的名字推断岀来的参数的名字使用 camelCas ing (首字母小写)参数的名字是基于参数的含义而不是参数的类型如果下一个版本需要更多的参数,那么加一个overl

8、oad 的方法。不要使用匈牙利命名法2.8 代码Review 配置I bile 已廿尸-t1 onl-FD H3 k .Analyze 刃Targets Huies I圏 Design Rule? 阖 GlobaJizatkn FkJes g IntcropMidrty Rules 甬 F'flobitty "Rules 3 国 Naming回薙 Avoid language specific type name? in parameter® 回电 Avokl type nmes in paramtftcre- Cofnpound words ihwJd bt ta

9、ssd coweft; " 回电 Oq not rime erium Rjeserved'05 Do not prefix «nuni valuaB wth t>pfl rarrw Events stlOiJd not hive before or dftcrfireftt Flags enumj shedd have piuni natnes shi)(闵 be ca仙 oofrectly Idflrtrfiera shodd be epeJlad carreerty ktertlfiera sho</d differ mort lhan ow匕 id

10、erttfisf stvM have conwt prefK Idertrtiera shJd harve cotbcI sJfK rfier ahodd not oontah u-dfrfcorvs rfifirt shodd not have rt»rnKl prttfbt -回Q idertfrefj shftAi not have 卯correct sufftK "IdertrtiefB shqtJd not irdch keyuwds回举 Long acronyms should b« pascal caoad :-匡隐 Oiy Rajs闭tribJfr

11、 Crturts itvM h&vi SK丹I narnes Paometer rwes sh«Jd not match menMs er nances "opeflyriamEB- ahoJd not ma ch get ma hods ReaDunza etring comptusd wards- shoiJd be cased com Rtioufte firings should bt spded conwlty- 回电 5iort ECfwynis shaJd be uppw®鶉Type namet ahouid not malch rarres

12、paces圜 Periormarae RlJce圖 PortobSty FU« 珂 5ffiunty FU« 固U阿日3错误处理公用错误处理机制见架构文档错误处理一节所有的文件操作,网络操作,数据库操作,MSMQ , LDAP,都可能失败,任何对上述操作的调用必须用try-cacthfin ally保护,如果捕获到了异常,必须将原始异常输岀到日志。注:为了提高系统的性能,尽量采用If语句捕获可以预料的错误,例如:文件无法打开,不要采用以下方式:try Openfile WritefileCatch上述代码的问题在于,对打开文件的结果没有判断,过于依赖异常处理,过多的异常发生

13、会严重降 低性能,在可能的情况下应该尽量避免,采用以下代码会好得多:try if (Openfile 成功)Writefile elseCatch try cacthfin ally保护,如果捕获到了异常,必须输岀对象创建,对象方法的调用,可以视情况而定。 远程对象创建,远程对象方法的调用,必须用 到日志。Page # of 184日志处理公用日志处理见架构文档日志处理注意:不能采用 System.Diagnostics.EventLog的静态方法WriteEntry将各种信息输岀到系统日志。如果要写系统日志,请调用提供的写日志公共模块。P age 11 of 185程序配置公用配置见架构文档

14、配置处理一节系统配置指的是系统实施过程中确定的数据,例如:数据库连接,各种外部系统的地址,系统各种参数 的优化等等。系统配置采用配置文件。ASP.NET的配置P age 17 of 18其它的系统采用标准的.Net配置文件。.Net配置文件对不同的应用具有不同的形式:1 . ASP.NET,对于ASPX应用和Web Service而言,配置文件为当前路径下的文件,文件名是:web.c onfig2 . EXE应用,对于普通EXE的应用,配置文件为当前路径下的文件,文件名是:ExeFile name.co nfigExeFile name是该EXE的文件名,包括扩展名。DLL,由于Assembl

15、y读取的配置文件是与 Appdomain相关的,不能为 Assembly单独创建如 Assmbleyname.config的配置文件。所以建议 Assembly 中不要Assembly中必须读取配置文件,一定读取配置文件,需要的配置信息应该由外部调用程序传入。如果 要在Assembly源代码的文件头中说明。有关配置文件的细节可以参见MSDN,以下是一个配置文件的例子: <?xml versio n="1.0"?> <con figurati on></c on figurati on>配置文件中自定义的信息配置文件中可以添加自定义的信息,

16、采用<app Sett in gs> 标签和 R <add> 标签例如:<?xml versio n="1.0"?><con figurati on><app Setti ngs><add key="A pp licatio n Name" value="MyA pp licati on" /></a pp Sett in gs></c on figurati on>访问自定义配置信息可以用 System.C on figurati on.

17、Con figurati on Sett in gs.A pp Setti ngs来获取自定义的信息。System.C on figurati on.Con figurati on Sett in gs.A pp Sett ings是一个Indexer,对于上面的例子,可以按照以下方式获得 MyApp licati on :System.C on figurati on.Con figurati on Sett in gs.A pp Sett in gsA pp licati on Name配置信息在AppDomain级别上定义,每个App需要定义该App引用的每个Assembly需要的所有配

18、置信息。例:如果一个 Sample.aspx 页面中引用了一个 UserOp.dll的Assembly,而该 Assembly 中某些方法需要从配置文件中读取参数名为SDP .Core.SysCo nn ectio nStri ng的数据库连接串配置信息,在Samp le.as px 对应的 Web.co nfig 文件中必须增加SDP .Core.SysCo nn ectio nStri ng的配置信息。Web.co nfig文件如下所示<?xml versio n="1.0"?><con figurati on><app Setti ngs

19、><add key="SDP .Core.SysConnectionString" value=""/></a pp Sett in gs></c on figurati on>为统一,所有工程的配置文件中核心数据库连接串的参数名应为SDP .Core.SysCo nn ecti on Stri ng6 SQL语句编写规范SQL语句中所有的 SQL关键字大写,表名、列名等SQL语句中的对象名的大小写采用数据库设计时名称的大小写规范。如:SQL语句中。SELECT Name FROM Tablel WHERE Ag

20、e > 28为了提高数据库的性能,所有参数都采用参数的方式传入,不要把参数的内容直接拼在如果一个SQL语句中有一个的内容是从界面输入获得的,为了防止SQL注入式攻击,不要把界面上输入的内容直接拼在 SQL语句中,而是使用参数传入,遵循上一条标准。7代码编写7.1代码编写规范1.使用异常只是标识错误而不是用来表示状态或者错误代码值Summary 中说明2.所有类以及 public方法 都使用.NET 代码有那些功能,而不是这个功能如何实现的样式的注释,即/ summary 格式.注意.可以在Remarks块或者代码中说明.3.所有方法的参数的合法性是否做验证对非法的参数是否抛岀异常4.是否

21、使用 Debug.Asserts 来验证代码中的假设?“ j应该是正数?"之类的注释应该用Debug.Asserts 来重写.5.不需要实例化的类是否包含私有构造函数6.是否利用值类型的类用于参数,方法返回值以及存放在集合中7. Assembly 特有的类,方法,事件的访问修饰符是否已经标记为In ter nal ?8.多线程同时访问的单件对象(singleton )是否正确的初始化? (See the Enterprise Solution Patternsbook, p263)9.必须被衍生类重写的方法申明为Abstract 了吗?10.不能重写的类是否标记为Sealed?11.

22、可能失败的转换是否使用了AS运算符?12.输岀对象的状态的时候应该重写ToString方法而不是加一个类似Dump之类的方法.13.所有log的消息都有log组建处理,而不是仅仅输岀到控制台.14. finnally代码块用于try后必须执行的代码15.尽可能的采用 foreach 而不是for(int i.)16.是否属性没有实现getter和setter方法17.只读的属性应该没有setter方法18.19.正确的使用in terface和抽象类.20.接口实现和抽象类继承21.操作系统资源的类是否实现了IDisposable接口 ?22.是否所有实现IDisposable的类初始化的时候

23、使用了Using语句?23.使用lock 语句而不是monitor.enter24.线程使用事件或者Pulse唤醒,而不是使用 sleep主动的唤醒.25.是否正确的重写了equals26.=和匸操作符号被重写,他们被重定向到 Equals28.重载了 Equals方法的对象应当也提供一个GethashCode方法重载,两者应当拥有同样的语义。29.异常类的构造函数是否含有一个参数string,参数string和exception的构造器。30.自定义异常类的继承层次是否正确的继承基类衍生类重写的方法是否都使用了override关键字31.32.类.33.所有被Marshal或者远程处理的对象

24、有序列化标志所有标记有Serializable属性的类是否有默认的构造函数,包括常见的Exception 和EventArgs实 现Iserializable 接口的类是否显式的实现 GetObjectData 和 隐 式的构 造函数,例如Serializaioninfo和R StreamingContext作为参数34.做浮点运算的时候,所有的常量都是 double类型而不是整数35.委托是否都有void返回值,避免使用 out或者ref类型的参数36.所有的委托又有sender对象作为第一个参数37.数订阅者从EventArg继承的类是否是只读的,只读的参数可以避免一个订阅者对参数的修改影

25、响其他的参38.所有的委托是否发布为事件?这样预防从事件内容触发一个订阅。39.单元测试(nUint)的时候,常见的驱动代码和测试代码分开40.在nUnit测试中使用 ExpectedExcetpion来指示异常必须抛岀。7.2注释程序代码必须对关键部份进行注释,说明被注释部份的主要用途,对于每一个类和每一个方法前面都必 须保持一个简要的说明,示例如下:=/ Class: SystemLog/ Purp ose: Record the system level event to system log/ Owner: xxxx/ Last Modified By: xxxxx/ Last Mod

26、ified At: 2003/03/15=p ublic class SystemLog/ Method: WriteLog()/Purp ose: Write system event message to system log/ Last Modified By: Liurx/ Last Modified At: 2003/03/15/p ublic static void WriteLog(LogSource source, string logMsg, LogT ype type) Page # of 18Page 23 of 187.2.1类注释在类的开始,应说明类的功能/ <

27、summary>/ Summary descri pti on for Classi./ </summary>class Classi必须采用以上的方式。采用(/ )和summary标签7.2.2方法、属性注释在方法、属性的开始,应说明该方法、属性的功能、输入/输岀和返回值,如下所示:/ <summary> test ' s function </ summary >/ <p aram n ame="i">i must not > 10</param>/ <retur ns>retu

28、r n i + 1. </retur ns>P ublic int Test(i nt i)7.2.3程序注释在程序设计编写中,应对其功能进行说明,如下所示:Coun t+;/ Add the cou nter value7.3对象状态保持所有的方法都必须是无状态的。即一个方法的调用不能依赖于前一个调用方法的处理结果。如以下的代 码是不允许的:C#Class Foop ublic connectString; p ublic Fun()dc. Op en(connect_string); 必须每次方法调用都传入所有需要的参数。页面状态不能保持viewstate7.4数据操作模式对于

29、系统数据的操作采用分层模式: 前台逻辑-> 业务逻辑-> 数据对象-> 数据库业务逻辑为封装了业务操作的组件,如客户管理类。数据对象为封装了数据库对象的组件,如客户数据 类,所有对数据库中客户数据的操作都通过客户数据类进行。数据对象类从Dataset类派生。对每一个底层数据库表(也可能是相关表的集合)的操作必须定义数据操作层,数据操作层由两个对象 组成,一组是数据库表实体对象,从DataSet类派生,一个数据库操作对象,负责提供对数据库表对象的操作, 命名规范为:数据库表实体对象<table name>Data数据库操作对象 <Busi ness Objec

30、t Name>Accessor例如:一组相关表有: User表,Subscription 表则需要定义两个数据表实体对象:UserData:DataSet, Subsc ip tio nData:DataSet还需要定义一个数据表操作对象:UserAccessorIn sertvtable nameUp date<table nameDelete<table name对每一个数据操作,数据表操作对象必须提供如下方法: 每一个读取操作Get<table name>By<ke yn ame> 新增记录操作- 修改记录操作- 删除记录操作-例如,对上述例子,

31、UserAccessor提供如下方法:UserData GetUserByID()按照用户ID号获取用户数据 void In sertUserO 新增用户原则上对于每一个操作在数据库中创建一个存储过程,命名方式为:up<op erati on> <table nameop erati on In sert/ Up date/Delete/Get7.5翻页逻辑如果采用直接连接数据库表获取DataSet的方式,每查询返回结果在1000条以内可以直接采用,否则要用服务器端分页技术,详细见架构文档的翻页逻辑。7.6Cache 技术应用7.7性能相关问题Mak ingnumerous

32、service requests across the Internet can affect the performanee of the client app licati on. When desig ning your XML Web service, make efficie nt use of service requests by creati ng methods that grou p related in formatio n together. For exa mp le, supp ose you have an XML Web service that retriev

33、es in formati on about a book. In stead of hav ing sep arate methods to retrieve the book title, author, and p ublisher, create a method that retur ns all this in formati on in one service request. It is more efficie nt to tra nsfer a large block of i nformatio n at one time tha n mult ip le smaller

34、 blocks of i nformatio nYou can also use the CacheDurati on prop erty of the WebMethod attribute class to en able cachi ng on the server. The followi ng code exa mple dem on strates how to use the CacheDurati on prop erty on XML Web service methods to sp ecify out put cach ing for a p eriod of 60 se

35、c on ds.<% WebService Language="C#" Class="MathService" %> using System;using System.Web.Services;p ublic class MathService : WebService WebMethod(CacheDuration=60) public float Add(float a, float b) return a + b;WebMethod(CacheDuration=60)p ublic float Subtract(float a, fl

36、oat b)return a - b;0)WebMethod(CacheDuration=6p ublic float Multi ply(float a, float b)return a * b;WebMethod(CacheDuration=60)p ublic float Divide(float a, float b)if (b=0) return -1;return a / b;7.8线程设计原则7.8.1避免在静态方法中修改静态状态 一般在服务器环境下,静态状态被请求共享,即多个线程能同时执行其代码。考虑使用不被请求共享的 实例来封装数据的设计模式。7.8.2为服务器环境设计7.8.3实例状态不必是线程安全的缺省情况下,代码库不是线程安全的。通过加锁实现线程安全

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论