代 码 设 计 规 范
一、注释规范
1、自建代码文件注释
对于自己创建的代码文件(如函数、脚本),在文件开头,一般编写如下注释:
/*************************************************
作者:
说明:
创建日期:
版本号:
**********************************************/
2、标准注释
在模块、类、属性、方法前一行添加注释,以便调用的时候提示用户,下以方法声明做例子:
///<summary>
///<对该方法的说明>
///</summary>
///<paramname="<参数名称>"><参数说明></param>
///<returns>
///<对方法返回值的说明,该说明必须明确说明返回的值代表什么含义>
///</returns>
3、代码中的注释
代码间注释分为单行注释和多行注释:
单行注释:
//<单行注释>
多行注释:
/*多行注释1
多行注释2
多行注释3*/
代码中遇到语句块时必须添加注释(if,for,foreach,……),添加的注释必须能够说明此语句块的作用和实现手段(所用算法、循环条件、不同分支的意义等等)。
二、异常处理
1、数据层及服务层异常必须要记录到服务日志中
try
{ }
catch (DbEntityValidationException ex)
{ throw new SerivceException ("");}
catch (SerivceException ex)
{throw ex; }
catch (Exception ex)
{throw new SerivceException (""); }
2、业务层及客户端异常要记录在文件中
原则异常msg描述清楚所发生错误原因、关键必要的参数,已便于客户端使用者、测试人员及相关研发人员明白错误原由。
三、Web页面
1、出现超出半屏幕的html标签时需要加注释 例:<!-- BEGIN 描述 --> <body></body> <!-- End 描述 -->
2、Js命名规则
函数: fn 例: fnMethod
事件: on例: eventBeforeSave
3、单行的 IF - ELSE,WHILE 或者 FOR 语句也 必须 加入括号,不过他们可以这样写:
if (condition){ statement; }
while (condition){ statement; }
for (intialization; condition; update){ statement; }
4、
foreach(var item in list){
foreach(var item1 in list){
foreach(var item2 in list){
}
}
}
三、命名规范
1、程序集命名、命名空间、类(全部为中文名)
1)程序集:项目域名+项目名称+模块名 例:六月版.供应商.业务层
2)命名空间:六月版.供应商.业务层.单据管理 (业务逻辑后缀'管理')
3)类名:订单
2、方法命名
1)业务层、服务方法命名
以混合命名法为主,常用动词单词+中文词描述+'_'+精确描述
Get*** //'获取***'
Create*** //'创建***'
Update*** //'更新***'
Del*** //'删除***'
Save*** //'创建或修改***'
Fill*** //'填充***' 多用于业务逻辑处理
Add*** //'添加***' 多用于业务逻辑处理
Remove*** //'移除***' 多用于业务逻辑处理
例:public VM.订单 Get订单信息(string 订单编号)
public void Update订单状态_已出库(string 订单编号, string 操作人)
对于获取多条记录的方法名要加以 '集'结尾
例:public List<VM.订单> Get订单信息集(string 关键字)
- Mvc Controllers 方法命名(全英文) 开头大写,文件名开头大写
3) 方法参数全部为中文名,Mvc Controllers方法参数(全英文)//开头字母小写
4) MVC 分布视图 _开头加开头大写单词
3、变量命名
命名空间引用缩写
业务层: 例:using BS供应商=六月版.供应商.业务层 ;
数据层: 例:using DAO供应商=六月版.供应商.数据层 ;
服务层: 例:using Server供应商=六月版.供应商.服务 ;
视图模型: 例:using VM供应商=六月版.供应商. 视图模型
公共类库: 例:using Comm=DotNet.Common;
变量命名以混合命名法为主
Sbyte: sbte |
Char: chr |
Short: sht |
Object: obj |
Int: int |
String: str |
Long: lng |
DateTime: dte |
Byte: bte |
IntPtr: intptr |
Ushot: usht |
临时变量: tmp |
Uint: uint |
Guid: g |
Ulong: ulng |
(s、dao)实体模型: model |
Float: flt |
类的私有变量: m |
Double: dbl |
静态变量: st |
Decimal: dcl |
常量: const |
Bool: is |
全局: p |
StringBulider: sb |
List:lst |
Array: arr |
枚举: e |
数组: a |
对象来自视图:vm |
DbContext:db |
|
总体原则以中文表示所要表示的内容,以变量类型做为前缀。变量类型做为前缀是为了索引方便,使用中文名是为了意义容易理解。
注:方法的参数变量命名不使用以上规则,返回值变量使用以上规则
Html命名规则
命名 |
说明 |
标准命名举例 |
doc |
Document |
|
wnd |
Window |
|
frm |
Form |
|
btn |
input type=button |
|
ckb |
input type=checkbox |
|
file |
input type=file |
|
hid |
input type=hidden |
|
img |
input type=image|img |
|
pwd |
input type=password |
|
rdb |
input type=radio |
|
rst |
input type=rest |
|
smt |
input type=submit |
|
txt |
input type=text |
|
sel |
select |
|
tar |
textarea |
|
Table |
tbl |
|
常用命名规则
登录条:loginBar |
加入:joinus |
主导航:mainNav |
标志:logo |
指南:guild |
顶导航:topnav |
侧栏:sidebar |
服务:service |
边导航:sidebar |
广告:banner |
热点:hot |
左导航:leftsideBar |
导航:nav |
新闻:news |
右导航:rightsideBar |
子导航:subNav |
下载:download |
标语:banner |
菜单:menu |
注册:register |
菜单内容1:menu1Content |
子菜单:subMenu |
状态:status |
菜单容量:menuContainer |
搜索:search |
按钮:btn |
子菜单:submenu |
滚动:scroll |
投票:vote |
边导航图标:sidebarIcon |
页面主体:main |
合作伙伴:partner |
注释:note |
内容:content |
版权:copyright |
容器:container |
标签页:tab |
外套:wrap |
登陆:login |
文章列表:list |
主导航:mainNav |
购物车:shop |
提示信息:msg |
子导航:subnav |
当前的curren |
小技巧:tips |
商标:label |
|
页脚:footer |
整个页面:content |
|
友情链接:friendLink |
页眉:header |
|
|
标题:title |
|
定制:Customized |
ID:Id |
编号:Number |
|
|
|
四、编码优化
1.使用String.Compare()字符串比较
不要使用UpperCase或LowerCase转换字符串的大小写,再进行比较
使用String.Compare()可忽略字符串大小写进行比较
String strTemp = "Active";
If(String.Compare(strTemp,"active",true)==0){
Consolt.Write("Equal");
}
2.避免在循环体里声明变量,应该在循环体外声明变量,在循环体内初始化变量
//避免
For(int i=0;i<10;i++){
SomeClass obj = new SomeClass();
//…
}
//推荐
SomeClass obj = null;
For(int i=0; i<10; i++){
obj = new SomeClass();
//…
}
3.关于this的使用
this可以让人直接看出来调用的是参数或局部变量,还是类的成员
3.设计原则
-
单一职责原则(SRP) - 就一个类而言,应该仅有一个引起它变化的原因
-
开-闭原则(OCP)- 软件实体(类,模块,函数等)应该是可以扩展的,但是不可以修改
-
里氏替换原则(LSP)- 子类必须能够替换它们的基类型
-
依赖倒置原则(DIP)- 抽象不应该依赖于细节。细节应该依赖于抽象。
-
接口隔离原则(ISP)- 不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。
-
重用发布等阶原则(REP)- 重用的粒度就是发布的粒度。
-
共同封闭原则(CCP)- 包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成影响。
-
共同重用原则(CRP)- 一个包中所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
-
无环依赖原则(ADP)- 在包的依赖关系图中不允许存在环。
-
稳定依赖原则(SDP)- 朝着稳定的方向进行依赖。
-
稳定抽象原则(SAP)- 包的抽象程度应该和其稳定程度一致。
-
合成/聚合复用原则(CARP)- 要尽量使用合成/聚合,尽量不要使用继承
补充:
2014/10/08
关于项目中Id或编号的变量、参数等 命名需要注意结名称尾要加上 **Id **编号 例: 商品Id 商品编号