C#开发规范
来源:互联网 发布:程序员被前妻 编辑:程序博客网 时间:2024/05/03 18:59
一、 项目开发模式
1.开发架构(三层架构)
1) 表现层(UI)
2) 业务逻辑层(BLL)
3) 数据访问层(DAL)
二、 命名规范
1.数据库设计
数据库字段默认值 ( default ) 非必要不设定
1) 数据库名称:系统名称+DB EX: play_data
2) 表:T + 功能模块名 EX: t_member
3) 字段:f + _字段名, EX: f_accounts
3) 视图:view_视图功能名称 EX: view_reports
4) 方法:fun_功能名称 EX: fun_sum
5) 存储过程:pro_功能名称 EX: pro_show_total
6) 触发器:trg_功能名称 EX: trg_update_record
7) 任何牵涉的数据库结构变动/或修改都要在群里面讨论
2.程序集开发
CompanyName.TechnologyName 这样,我们看到的名称空间应该是这样的: Microsoft.OfficePowerSoft.PowerBuilder 注意:这只是一个原则。第三方公司可以选择其它的名字。 避免用公司名称或其它著名品牌的名称作为名称空间的前缀,这样会造成两个公布的名称空间有同一个名称的可能性。例如: 将微软提供的Office自动类命名为Microsoft.Office 使用Pascal大写方式,用逗号分隔逻辑成分。
例如:Microsoft.Office.PowerPoint
如果你的品牌使用的是非传统大写方式,那么一定要遵循你的品牌所确定使用的大写方式,即使这种方式背离了通常的名称空间大写规则。例如:Macrowing.WebObjects ee.cummings
3.类名称
类的命名原则是用名词或名词短语命名类,使用Pascal大写。减少类名中缩写的使用量量。不要使用任何类前缀(比如C),不要使用带下划线的字符,系统生成类库除外。 例如:
public class FileStream { }
public class Button { }
public class String { }
4.接口命名
使用名词或名词短语,或者描述行为的形容词来命名接口,使用Pascal大写。 减少接口名中缩写的使用量,在接口名前加前缀I,以表示这个类型是一个接口。
例如:
IComponent(描述性名词)
ICustomAttributeProvider(名词短语)
IPersistable(形容词)
5. 函数命名
函数和方法的命名应该以动词开始,使用Pascal大写。不要使用带下划线的字符。例如:InitNameArray CloseDialog
6.参数命名
使用描述性参数名。参数名应该具有足够的描述性,这样在大多数情况下参数名和它的种类可以用来确定它的意思。根据参数的意思来命名参数,而不是根据参数的种类来命名。我们希望开发工具可以用很方便的方式提供关于参数种类的信息,这样参数名可以得到更好的使用,可以对语义而不是对种类进行描述。不要使用保留参数。如果在下一个版本中需要更多的数据,可以增加进来。例如:
publicType GetType (string typeName) { ......}
public string Format (string format,object [ ] args) { ...... }
如果该参数是 out 类型,则请在加上 o_ 前缀,例如:
public bool TryGetUserID(out string o_UserID) { ...... }
如果该参数是 ref 类型,则请在加上 r_ 前缀,例如:
public bool TryGetUserName(ref string r_UserName) { ...... }
加上 o_ 与 r_ 的目的是为了提示作用,提醒程序员若修改该参数内容,将会同步改变叫用端传入的引数。
7.属性命名
使用名词定义属性,属性使用Pascal规则,首字符大写。属性和相应字段名称要关联,可以使用“重构”菜单来生成属性。
8.全局变量
静态(static):
s + 下划线 + 名称中各单词首字母均为大写,单词之间需要大写. 例如: s_ProgName
非静态(member field):
m + 下划线 + 名称中各单词首字母均为大写,单词之间需要大写. 例如: m_UserName
举例:
public class LogicInfor
{
private static string s_ProgName;
private string m_UserName;
}
使用 s 与 m 前缀的目的是为了方便识别该变量的作用范围。
9.局部变量
名称中各单词首字母均为小写,单词与单词需大写。 例如:对于string类型定义,使用s前缀 +Pascal命名的方式,int 比如
string sSQL = string.Empty;
int iTotal = 0;
bool bFlag = true;
这是一种典型的命名SQL语句字符串的方式 而对于此外的类型对象定义,
可以使用代表该类的前缀 +Pascal命名的方式,比如:
StringBuilder sbWebAddress = new StringBuilder();
在以下情形下,通常不加代表该类的前缀:
10. 枚举命名
使用 E + Pascal规则命名,名称中各单词首字母均为大写, 枚举值从小到大顺序定义。例如:
public enum ETableType
使用 E前缀 是为了能让后续维护人员能一眼就看出 ETableType 是一个枚举。
11. 常量命名
全大写,各单词以下划线隔开
EX : public const int ADJUST_MULTIPLE_FACTOR = 3;
12. 控件命名
控件前面必须加上代表该控件类之缩写。缩写方式请参考“名称缩写” 之章节
1) asp:HiddenField àhdf +名称 例:hdfUserID
2) asp:TextBox àtxb+名称 例:txbUserName
3) asp:DropDownList àddl +名称 例:ddlUserType
4) asp:CheckBox àckb+名称 例:ckbUserType
5) asp:CheckBoxList àcbl +名称 例:cblUserLanguage
6) asp:RadioButtonList àrbl +名称 例:rblUserLanguage
7) asp:Image àimg +名称 例:imgUserIcon
8) asp:ListBox àltb +名称 例:ltbGames
13.名称缩写
在一般情况下,我们都不要使用缩写命名,我们从来不害怕长的变量命名,而却担心看不懂的命名。变量命名的原则是,尽最大努力让其他人在看到我们的变量/函数/„等的第一时间,大概能猜出它是做什么的,以及它属于什么类。 比如:
int iProductTypeCount= 0;
我们在第一时间就能知道它是记录产品数量的变量。
而对于糟糕的命名方式:
int ptc = 0;
它是productTypeCount的简写,但是其他人或者我们在长时间以后还能知道它是做什么的吗?也许我们不得不查阅相关文档或跟踪代码前后文以明白其意义。
我们应该认为:最优秀的代码它本身就是注释。我们需要做的,并不在于当时潦草的去实现些什么,而是要让我们的代码具备让他人维护或今后扩充的能力。
但经常使用的单词是可以缩写的,因为大家都知道,若不能确保大家都知道,则必须加上注释,或者就不要使用缩写,缩写时必须遵守以下原则:
a. 长单词缩写方式有三种:
I. 去掉母音,比如:passwordà pwd,listà lst
II. 取前几个字母,比如:
command à comm, connectionà conn,arrayà arr, dictionaryà dict
III. 取首尾字母,中间加 x ,比如: transactionà txn
b. 多个单词组合缩写:去每个单词的首字,比如:CheckBoxListà cbl
三、 注释规范
1.文件头注释
在代码文件的头部进行注释,标注出创始人、创始时间、修改人、修改时间、功能描述,这在团队开发中必不可少,它们可以使后来维护/修改的同伴在遇到问题时,在第一时间知道他应该向谁去寻求帮助,并且知道这个文件经历了多少次迭代、经历了多少个程序员的手。样本: /***************************************************************************
** 作者: 大明
** 创始时间:2010-10-20
** 描述:主要用于产品信息的资料录入,„
**
** 修改时间:2010-10-21
** 修改人:小明
** 修改描述:XXXXXXXX
*************************************************************************/
我们甚至可以在这段文件头注释中加入版权信息、文件名、版本信息等。
2.类、函数、属性、接口等注释
请使用///三斜线注释,这种注释是基于XML的,不仅能导出XML制作帮助文档,而且在各个函数、属性、类等的使用中,编辑环境会自动带出注释,方便你的开发。以protected、protected、Internal、public声明的定义注释请都以这样命名方法。例如:
/// <summary>
/// 比赛结果
/// 创建人:lzy
/// </summary>
public classTS_GameResult_Ajax : AjaxBase
{
}
3.逻辑点注释
注釋 統一都加 code 裡 不加在 html 裡。
在逻辑性较强的地方需加入注释,说明这段程序的逻辑是怎样的,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG。在注释中写明我们的逻辑思想,对照程序,判断程序是否符合我们的初衷,如果不是,则我们应该仔细思考耀修改的是注释还是程序了„
4. 善用 #region #endregion
当一段相当复杂的逻辑使用多行源代码实现时,除了必要的注释外,若没有将该段代码整理独立成一函数时,则必须使用 #region #endregion 来示意该段代码是一完整之逻辑。
四、 代码规范
1.排版
1)每行语句至少占一行,如果语句过长(超过一屏),则该语句断为两行显示
2)把同一个功能模块或者同一功能的内容放在一起,比如数据成员、属性、方法、事件等,
并适当的使用#region„#endregion.
3) 使用空格
a)双目操作符的前后加空格(+,=, && 等),index = index + 1;
b) 单目操作符前加空格(!, ++, ~等),index ++;
c)逗号、分号只在后面加空格
4) 使用空行,在一段功能代码、或者函数、属性之间只能插入一行空行.
2. 代码可读性规划
1)注意运算符的优先级,我们应该尽量使用括号明确表达式的操作顺序,避免使用默认优先级,给我们以及维护人带来困扰.
2) 避免使用不易理解的数字,用有意义的标识来替代(枚举和常量)
例如: if (intProductType == 0)
…
elseif (intProductType == 1)
…
需要替换成:
if (productType == EProductType.Normal)
…
else if (ProductType == EProductType.Customize)
…
3) 代码中关系较为紧密的代码应尽可能相邻.
例如:使用objProductType.Name,而不是objProductType. Name
4) 在界面层中尽量使用异常处理try语句,不要将错误的消息直接暴露给用户,而更应该的是把系统抛出的错误信息记录到LOG日志文件中去,告诉用户友好的提示信息
3. if , for 条件式皆必须使用 { } ,即使内容只有一行。
比如: if (productType != EProductType.Normal)
{
DoAlarmAction();
}
for (inti = 0; i < lstUsers.Count;++i)
{
LogUser(lstUsers[i]);
}
4. 全局变数(static data) 或 类成员(field)不可为public,比如:
public class VIPUser : UserBase
{
// 不可为 public
protected override string m_UserName;
// 此方法可让外界间接修改 field: m_UserName 之值
public string UserName
{
get { return m_UserName; }
set { m_UserName = value;}
}
}
此目的是为了防止外界直接修改该类成员(field),因此而丧失了扩充性。
如果想让外界间接修改该类成员(field),则可以搭配使用属性的方式来进行变更。
5. 函数内容必须与函数名称一致
函数内容不可以做出函数名称未表达的其他事,比如:
// 检查指定使用者是否有指定权限
public boolCheckUserAuthority(string sUserID, string sProgramID)
{
List<string> lstAuth = GetUserAuthorityList(sUserID);
for (int i = 0; i < lstAuth.Count; ++i)
{
if (lstAuth[i].ProgramID == sProgramID)
{
RecordUserAccessProgram(sUserID, sProgramID); ß 不可做出函数名称未表达的事
return true;
}
}
return false;
}
如同上例,当使用者有权限执行指定程序时,会额外 记录使用者存取该权限,但此记录动作并没有体现到函数名称上面!正确的方式可采用
a. 修改函数名称以体现 记录使用者存取该权限 之动作
b.让叫用此 CheckUserAuthority(…) 之呼叫端 来进行此记录动作,比如:
bool isUserHavingAuth = CheckUserAuthority(sUserID,sProgID);
if (isUserHavingAuth)
{
RecordUserAccessProgram(sUserID,sProgramID);
}
如此,各个函数名称就完整体现出各自的功用,这样才能带来后续便利的维护与有弹性的扩充。
五、 JS说明
1. JS命名规范
1) 方法: 大写字母开头,多个单词第一个字母大写。 例(ProductName)
2) 变量:小写,多个单词取各单词第一字母大写,首字母小写。例(sProductName)
3) 类:用大写开头,多个单词第一个字母大写。例(BrowerType)
4) 全局变量:用大写字母,多个单词用下划线隔开。 例(PRODUCT_ARGS)
1、定义变量或者常量应分行定义,避免一行定义多个变量造成混淆:
Var iNumberA = 1;
Var iNumberB = 2;
2、在if 语句中,即使只有一行也要包含在大括号中;
大括号在使用时要单独占一行,例如:
IF (iNumber > 100){
iNumber =100;
}
ELSE{
iNumber =200;
}
- C#开发规范
- C#开发编码规范
- C#开发编码规范
- C#开发编码规范
- C#开发编码规范
- C#开发编码规范
- C#开发编码规范
- C#开发编码规范
- C#开发规范
- C#项目开发规范
- C# 开发编码规范
- C#开发编码规范
- C#开发编码规范
- c#开发规范
- C#开发编码规范
- C#开发规范
- C#开发命名规范
- C#开发命名规范
- [省选前题目整理][BZOJ 3680]吊打XXX(模拟退火)
- DWR3常见错误解决方法
- Codeforces 55D Beautiful numbers 数位dp(入门
- 各种软件开发模式简介
- php底层深度探索(一)
- C#开发规范
- 输入n个数,输出最小的k个数,java实现
- jQuery性能优化的28个建议
- 学习PrintWriter类
- (CDOJ) UESTC 606 Palindrome Again 后缀数组二分 + Manacher + Hash
- golang struct
- 基于Python socket的端口扫描程序
- webSocket使用
- [省选前题目整理][POJ 2069]Super Star(爬山搜索)