部分代码规范

1 编程风格 4
1.1 统一编程风格的意义 4
1.2 变量命名规则 4
1.3 函数命名规则 5
1.4 类命名规则 5
1.5 常见语句书写规则 6
1.6 注释风格 7
2 代码组织 7
3 代码优化 8
3.1 代码优化的意义 8
3.2 函数内的代码优化 8
3.3 类内的代码优化 9
3.4 类之间的代码优化 10
4 调试技巧 10
4.1 编译时的错误 10
4.2 运行时的错误 10
4.3 C#常见问题 11

1 编程风格
1.1 统一编程风格的意义
• 增加开发过程代码的强壮性、可读性、易维护性
• 减少有经验和无经验开发人员编程所需的脑力工作
• 为软件的良好维护性打下好的基础
• 在项目范围内统一代码风格
• 通过人为以及自动的方式对最终软件应用质量标准
• 使新的开发人员快速适应项目氛围
• 支持项目资源的复用:允许开发人员从一个项目区域(或子项目团队)移动到另一个,而不需要重新适应新的子项目团队的氛围
• 一个优秀而且职业化的开发团队所必需的素质

1.2 变量命名规则
• 前缀(小写字母加下划线)表明变量的作用域,无前缀则表明是局部变量或函数的参数。如:
 m_xx 表示是类的成员变量,控件变量例外
 g_xx 表示是全局变量,在C#中,也可以理解为在整个项目中都可能用到的静态变量
 c_xx 或者XX 表示是一个常量

• 用数据类型全称中的关键字母代表特定的数据类型(一个或多个小写字母),如下表。
常用数据类型缩写 数据类型
i int
b bool
str string
c char
f float
d double
ob object
lbl Label
txt TextBox
btn Button
cmb ComboBox
mnu Mainmenu
mnuItem MenuItem
chk CheckBox
grd DataGrid
tm Timer
frm Form
pnl Panel
gup GroupBox
tv TreeView
rdo RadioButton
lb ListBox
tlb ToolBar
dt DateTime
cn Connection
cmd Command
ds DataSet
da DataAdapter
dv DataView
dbTable DataTable
dbReader DataReader
param Parameter
dbRow DataRow
dbCol DataColumn
注:如果模块中只有一个类实例对象,则可以只用简写。如Connection对象可以用cn来命名。
1.3 函数命名规则
• 函数名用首字母大写的英文单词组合表示(如用动词+名词的方法),其中至少有一个动词
• 应该避免的命名方式
 和继承来的函数名一样。即使函数的参数不一样,也尽量不要这么做,除非想要重载它
 只由一个动词组成,如:Save、Update。改成如:SaveValue、UpdateDataSet则比较好
• 函数参数的命名规则
 函数参数应该具有自我描述性,应该能够做到见其名而知其意
 用匈牙利命名法命名
1.4 类命名规则
• 类的命名通常以父类的简写开头。如:FrmXXX可看出该类从Form中继承而来
• 类名中尽量不要出现下划线
• 类的每个单词的首字母大写
• 类变量的命名可以参照,如:FrmXXX frmXXX = new FrmXXX(),即首字母小写即可
1.5 常见语句书写规则
如下表所示。
语句 提倡的风格
if if(condition)
{
statements;
}
else
{
statements;
}
for for(initialization; condition; update)
{
statements;
}
foreach foreach(something in collection)
{
statements;
}
switch switch(…)
{
case ..:
break;
case …:
break;
default:
}
while while(..)
{
statements;
}
do-while do
{
statements;
}
while(condition);
try-catch try
{
statements;
}
catch(Exception e)
{
handle exception;
}
同一代码块内的不同逻辑块之间应空一行 {
do statement1;

do statement2;
}
函数与函数之间至少空一行,但不超三行 这一点要注意一下
1.6 注释风格
• 注释应该正确、简洁、有重点
• 应该写优雅的、可读性良好的代码,而不是为玄妙、晦涩的代码写注释
• 原则上应尽量减少程序体内代码的注释,应该保持代码本身的直接可读性
• 函数的注释,可以只对public或者重要的private函数进行注解

1.7 数据库命名规范
• 表名以英文方式表示,从第一个单词开始首字母大写,其余小写
• 字段名要以表名的缩写开头如,UserGrade 以UG开头不加下下划线像UGID,这样写
• 视图名要以V_开头后面的从每个单词开始首字母大家其余小写,最好是V_+表名
• 存储过程名称以数据库缩写开始如Game1515要以G_开头,数据库缩写+_+查询的行数(One,All)+Sql语句类型(Select,delete ,update,insert 等)+表名+条件+条件字段 如要查询User表里的一行数据 G_SelectOneUserByUID
2 代码组织
代码组织是对整个项目的代码进行整理,使之更加有序。实现类似功能的文件应该放在同一个文件夹中或者同一个项目中。例如,可把整个项目分为以下几个层次:

• SystemFramework层
提供一些给其他公用的服务,比如说系统日志、应用程序配置、异常处理、调试类等读取Web.config和*.exe.config一般都在这一层。

• Common层
把逻辑上的tables抽象成一些类,这些类一般从DataSet继承,生成一些strong typed Dataset,类中不涉及任何数据库操作。

• DataAccess层
这一层的类负责与数据库的连接,以Common层对象为媒介读取、更新、添加、删除数据库对象。为Bussiness层提供数据服务。

• Bussiness Logic 层
如果需要的话可以分为以下两层,也可以合为一层。

 Business Rule层
包含各种商务逻辑和规则。

 Business Façade层
提供给UI层所有的系统接口,这一层抽象出了UI层所需要用到的功能。这一层的类可以通过继承MarshalByRefObject类,支持Remoting,配置到专门的应用程序服务器上。

• UI层
只调用Bussiness层和SystemFramework层的接口,实现用户界面。包括:
 WinUI
 WebUI
 WebService(并不是用户界面,但是逻辑上属于这一层)
3 代码优化
3.1 代码优化的意义
• 仅仅对符合功能说明书的要求、能正确运行的代码进行优化是有意义的
• 代码优化能减少冗余代码的数量,用更少的代码来实现同样的功能
• 提高代码的内聚程度,减少耦合程度
• 对代码的抽象能提高代码的重用度,对今后其他项目的进度有非常重要的意义
3.2 函数内的代码优化
• 去掉从来没有用到过的参数
• 始终进行参数检验。不要认为只有我才会调用这个函数,我能够保证参数的有效性。事实上很多运行错误就是没有对参数进行检验。对于传入了非法值的函数调用,可以返回一个对调用无意义的值(如:null,-1),或者干脆抛出一个异常
• 函数的参数不宜过多,如果实在是太多,可以考虑将这些参数封装在一个类中,然后将这个类的某个实例作为参数传入函数
• 如果函数从来不会修改某个参数的值,则应该尽量将参数声明为const
• 如果函数中用到的类成员变量或者其他全局变量可以用传入参数的方式代替,则用参数代替,这样可以减少该函数和外界的关系,提高内聚
• 一个单一的函数的代码量不宜过多。如果实在很多,则可以把它切分成小的函数,例如长的switch语句是最容易切分的
• 单个函数中尽量避免相同的代码,可以用条件语句或者抽取出来作为函数的方法消除这些冗余
• 尽量保持函数只有一个出口,即只有一处return语句,如:

 原始代码
string GetControlText(int nIndex)
{
if(ParameterValid() == false)
return null;
switch(nIndex)
{
case 0:
return txtValue1.Text;
case 1:
return txtValue2.Text;
…….
}
}


 优化过的代码
string GetControlText(int nIndex)
{
string strReturnValue = null;

if(ParameterValid() == true)
{
switch(nIndex)
{
case 0:
strReturnValue = txtValue1.Text;
break;
case 1:
strReturnValue = txtValue2.Text;
break;
…..
}
}
return strReturnValue;
}

3.3 类内的代码优化
• 只有类对外的接口才声明为public
• 在类的成员函数中如果存在着相同的代码,则将其抽取成为private的成员函数,以减少代码的冗余,保持在一个类中没有相同的两份代码的副本
• 尽量减少成员函数之间的依赖,特别是对成员变量值的依赖
3.4 类之间的代码优化
• 类应该是一个实体,具有自己的数据和对这些数据的操作
• 把界面操作和数据处理分离在两个类中是比较好的做法
• 对于不同类之间有相同代码的情况,有以下几种处理方法:
 将相同的代码抽象出来作为父类,其他的类从中继承,由此来共享代码
 将相同的代码抽象出来作为一个新类,其他类中声明一个该类的变量,由此来共享代码
这两种方法各有利弊,前种方法比较适于当共享代码在调用之前必须做特殊的初始化,而这些初始化可能很难用函数调用来完成,这时父类的初始化代码中可以加入一个虚拟函数,所有的子类都重载该函数,做特定的初始化;后种方法可以封装得很彻底,只暴露出对外的接口,和其他类的耦合程度比较小
• 任何重复的代码都可以抽取出来,不仅仅是对数据进行处理的代码,界面代码同样可以抽取出来
• 如果许多类都有做类似事情的函数,名称相同、内部具体的操作不同,这时候可以将这些函数提取出来作为一个接口。其他类都从中继承,然后根据自己的要求来实现之
4 调试技巧
4.1 编译时的错误
• 始终在“输出”窗口中看程序编译的输出,“任务列表”窗口中经常会遗留以前编译后留下来的消息
• 认真查看编译输出的错误消息,掌握正确的错误地点和信息
• 当碰到莫名其妙的编译时的错误应
1) 重新编译整个项目或者解决方案。
2) 关闭Visual Studio.NET,然后再打开。
3) 重新启动计算机。
4) 保证编译出来的程序不在运行中或者所有的输出文件的属性都是可写的。
4.2 运行时的错误
• 首先要读取异常信息,猜测大概的发生地和发生原因
• 仔细读发生异常处源代码
• 在相应处设置断点,然后单步运行
• 如果还是找不出错误,可以请同事帮忙。当着同事的面讲解自己的源代码,旁观者看得最清
• 配置问题和数据库中数据的错误也会导致运行时的错误
4.3 C#常见问题
• C#中控件的消息处理是立即的。也就是说,如果对某个控件的某个消息写了消息处理函数,然后假如当程序中某处的代码A引发了该消息时,程序流程会立即跳转到该消息的消息函数中去,如果这时消息函数中发生异常,即使代码A处于异常块中,该异常也无法捕获。所以如果出现在给控件的某个属性赋值后发生异常的情况,则请找一下是否已经对该控件的该属性写了消息函数(别忘了在父类也许会有),如果有的话,则应在这个消息处理函数中也加上断点
• 注意集成环境中窗体设计器的副作用。对于处在InitializeComponent中的代码,如果需要做修改,尽量先将其搬到函数外面来,否则,不能保证修改过的代码不被集成环境改回来或者删掉
• C#中很多异常都是由于强制转换产生的,所以对强制转换一定要放在异常处理块中

 

 

文章出处:博客园小组讨论:http://home.cnblogs.com/group/topic/31770.html

转载于:https://www.cnblogs.com/angleSJW/archive/2010/02/23/1672265.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nature:揭示大脑中的免疫记忆

来源:生物谷摘要:在一项新的研究中,德国研究人员报道身体中的炎症可能影响小鼠大脑中的免疫细胞的“记忆”。在一项新的研究中,德国研究人员报道身体中的炎症可能影响小鼠大脑中的免疫细胞的“记忆”。如果这一发现在人体中得到证…

辨别 Python 中 load 和 loads 的小技巧

load 和 loads 都是实现“反序列化”,load 通过 json.load(open(*.json)) 这样的格式,从文件句柄中打开文件,加载到Python的变量中,并以字典的格式转换。而 loads 必须对于 Python内存中的序列化对象转换成字符串。 load 和 load…

SpringBoot 自带工具类~断言

SpringBoot 中提供了 Assert 断言工具类,通常用于数据合法性检查 org.springframework.util.Assert // 要求参数 object 必须为非空(Not Null),否则抛出异常,不予放行 // 参数 message 参数用于定制异常信息。 v…

电竞专业与计算机专业,2021电竞专业的大学排名 电竞专业主要上什么课程

2017年教育部下文增设电竞专业,电子竞技人才培养体系正式形成。为了让广大电竞爱好者,从业者,考生及家长全面客观地了解电竞教育现状,电竞专业高校排行榜应运而生!2021年电竞专业大学排行榜1、中国传媒大学南广学院中国…

是精通CSS吗?

经常看到些招聘都要求精通“CSS手写代码”、“通过W3C验证”、“兼容IE5678,FF,opera,safari…”,姑且对其自身认识的准确度不谈,所罗列的这一大堆东西真的觉得是有意义的吗? 难道CSS的最高境界就是熟知各浏览器的对HTML/XHTML,CS…

计算机主机部件与外设的工作原理,计算机组成原理名词解释和简答

第一章名词解释:1.中央处理器:主要由运算器和控制器组成。控制部件,运算部件,存储部件相互协调,共同完成对指令的执行。2.ALU:对数据进行算术和逻辑运算处理的部件。3.数据通路:由操作元件和存储…

Linux 源码安装 Python3 和 pip3

From:https://www.cnblogs.com/Mrhuangrui/p/7722531.html Python 包管理工具 pip 安装 和 使用: https://blog.csdn.net/freeking101/article/details/53445982 安装 Python3 下载源码包https://www.python.org/downloads/解压(以3.64版本为例) wget h…

周志华:满足这三大条件,可以考虑不用深度神经网络

来源: AI科技大本营摘要:4 月 15 日举办的京东人工智能创新峰会上,刚刚上任京东人工智能南京分院学术总顾问的周志华教授做了《关于深度学习一点思考》的公开分享。近年来,深度神经网络在语音、图像领域取得突出进展,以…

浅析C#的事件处理和自定义事件

一、简单的自定义事件(1):无参数 namespace UserInputMonitor { class UserInputMonitor { public delegate void UserRequest(object sender, EventArgs e); //定义委托 public event UserRequest OnUserRequest; //此委托类型类型的事件 public void Run() { bool…

SpringBoot 自带工具类~ObjectUtils

org.springframework.util.ObjectUtils 1、获取对象的基本信息 // 获取对象的类名。参数为 null 时,返回字符串:"null" String nullSafeClassName(Object obj) // 参数为 null 时,返回 0 int nullSafeHashCode(Object obje…

ibatis常用的集中判断语句

<isPropertyAvailable> 属性是存在<isNotPropertyAvailable> 属性不存在<isNull> 属性值是null<isEmpty> 判断Collection.size<1或String.length()<1<isEqual> 等于<isNotEqual> 不等于<isGreaterThan> 大于<isGreaterEqua…

网络计算机显示10,win10电脑网络显示一个球怎么回事

win10电脑网络显示一个球怎么回事&#xff1f;win10上不了网怎么办&#xff1f;其实这个是网络连接图标&#xff0c;只是因为没网络了就会变成地球图标。那么当出现win10网络变成球状怎么办呢&#xff1f;下面小编教下大家win10电脑网络显示一个球的解决方法。方法一&#xff1…

专家观点 | 李德仁:基于云计算的智慧城市运营脑

来源&#xff1a;智慧城市产业与技术创新战略联盟中国科学院、中国工程院院士李德仁发表了“基于云计算的智慧城市运营脑”的主题报告&#xff0c;深度解读了以公共云服务平台为核心的智慧城市运营脑。首先&#xff0c;李院士就智慧城市及其应用发表了自己的见解。他认为&#…

python3 中的 eval 函数

From&#xff1a;http://blog.csdn.net/zhanh1218/article/details/37562167 Python:eval的妙用和滥用&#xff1a;https://blog.csdn.net/zhanh1218/article/details/37562167 python eval()&#xff1a;http://www.cnblogs.com/dadadechengzi/p/6149930.html Python eval 函…

SpringBoot 自带工具类~StringUtils

org.springframework.util.StringUtils 1、字符串判断工具 // 判断字符串是否为 null&#xff0c;或 ""。注意&#xff0c;包含空白符的字符串为非空 boolean isEmpty(Object str) // 判断字符串是否是以指定内容结束。忽略大小写 boolean endsWithIgnoreCase…

C语言中float,double类型,在内存中的结构(存储方式).

从存储结构和算法上来讲&#xff0c;double和float是一样的&#xff0c;不一样的地方仅仅是float是32位的&#xff0c;double是64位的&#xff0c;所以double能存储更高的精度。 任何数据在内存中都是以二进制&#xff08;0或1&#xff09;顺序存储的&#xff0c;每一个1或0被称…

html超链接去虾线,挑虾线别只会用牙签了,渔民都是这样做的,1秒处理一个,超方便...

现在大家的生活条件已经越来越好&#xff0c;所以说人们在城市的时候也是越来越注意饮食这一方面了&#xff0c;但其实大家在做饭的时候都喜欢买上一些营养丰富的食材&#xff0c;就像是在最近几年海鲜也是让大家都非常喜欢的。海鲜是我们日常生活中都非常喜欢的一个美食&#…

AI将成科学家“高级定制”工具

来源&#xff1a;科技日报 作者&#xff1a;房琳琳化学家有了新的实验助手——人工智能&#xff08;AI&#xff09;。随着深度学习算法的进一步应用&#xff0c;AI计算机程序能帮助药物化合物等小有机分子产生所需的反应序列&#xff0c;制定合成路径。《自然》杂志近日发表了…

Xvfb 虚拟现实库 之 Python 虚拟桌面 pyvirtualdisplay

如何在Xvfb中运行Selenium&#xff1f;&#xff1a;https://cloud.tencent.com/developer/ask/107705 命令&#xff1a;nohup Xvfb -ac :7 -screen 0 1366x1024x8 -maxclients 512 >/dev/null & Is there a Windows equivalent to PyVirtualDisplay&#xff1a;https:…

SpringBoot 自带工具类~CollectionUtils

org.springframework.util.CollectionUtils 1、集合判断工具 // 判断 List/Set 是否为空 boolean isEmpty(Collection<?> collection) // 判断 Map 是否为空 boolean isEmpty(Map<?,?> map) // 判断 List/Set 中是否包含某个对象 boolean containsIns…