建站之星官网登陆,改进网站的建议,软件项目管理是做什么,湘潭网站设计公司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 调试技巧…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,AllSql语句类型(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