140,使用默认的访问修饰符。

如果不加访问修饰符,成员变量的默认是private的,类默认是internal的。为了明确访问的权限,我倒是建议都加上访问修饰符,这省不了多少代码。

141,不知道该不该加大括号的时候就加上。

大括号会多占用两行代码,到底一行语句的代码需不需要加大括号这是一个争论。但是为了避免引入不必要的bug还是加上吧。

142,总是提供有意义的命名。

我们不希望看到如iTemp的命名,类似于i的命名只应该出现在循环中。变量的命名应尽可能表达它应该表达的意思,不要太随意的命名,这会给代码维护制造困难。如果你不想维护糟糕的代码,那就从自己做起吧。

143,方法的抽象级别应该在同一层次上。

如:void LocalInit(){ RemoteInit();} void RemoteInit(){},LocalInit和RemoteInit应该是同一级别的,不应存在调用关系。可以做如下改进,void Init(){LocalInit();RemoteInit();},现在它们的层次就一样了。

144,一个方法只做一件事。

这往往可以从方法的名字上判定方法是不是做了太多的事情,如果是,则考虑拆分成两个方法。

145,避免过长的方法和类。

方法的长度以前曾有人提过控制在50行,甚至更短的30行,这没有一个硬性的要求,原则就是要适合于阅读,我们一般以不超过显示器的一屏为佳。类的长度尽量在300行以内,如太大了可以考虑重构。

146,只对外公开必要的操作。

不要把所有的方法都设定为public,这会增加我们筛选方法的难度,同时也不建议曝露不必要的成员,不公开的成员就显示的设定为private是个好习惯。尽管默认也是private的。

147,重构多个相关属性为一个类。

这一步不是一上来就做的,而是重构的时候发现相关属性超过3个,就可以考虑提取了。

148,不重复代码。

重复代码给维护带来工作量和风险,修改了一处,而另一处没有得到修改。消除重复就能解决这个问题。

149, 使用表驱动法避免过长的if和switch分支。

如基于索引的表驱动,string[] chineseWeek = new string[] { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" }; return chineseWeek[(int)w];

150, 使用匿名方法,Lambda表达式代替方法。

过小的函数体,如3行左右,可以考虑用Lambda表达式来进行简化。 超过3行以上的,可以提取成单独的方法,更利于阅读。

151, 使用事件访问器替换公开的事件成员变量。

public event ColumnClickEventHandler ColumnClick { add { this.Events.AddHandler(this, value); } remove { this.Events.RemoveHandler(this, value); }},上面这段代码比public event ColumnClickEventHandler ColumnClick;有更好的灵活性,可以在add和remove中添加额外的逻辑。如果没有额外的逻辑控制,这样实现就显得多余,大多数情况都可以用后者。

152, 最少,最好不要写注释。

当所有的命名都能表达代码意图时,注释是多余的。如果功力不够,还是建议适量添加注释,至少要重构你代码的人也得看得懂你写的代码。

153, 如果代码抛出异常,则应该给出注释。

注释应该是xml,使用者通过查阅生成的帮助文档就知道要处理怎样的异常。

154, 不要过度设计,在敏捷中体会重构的乐趣。

155, 应该随生产代码一起提交测试代码。

写单体测试代码是必须的,时刻保持代码测试通过,我们才敢放心大胆的进行重构。如果没有它,随着代码维护的进行,新引入的bug就会越来越多。

156, 利用特性为应用程序提供不同的版本。

比如,我们的程序可能分为体验版和完整版,他们能使用的功能是不一样的,我们不可能去分别建立两个不同的程序,利用特性(Attribute)的功能就可以完成这种定制。对方法或类使用[Conditional("ONLINE")]特性,在文件的最顶部定义#define ONLINE,Conditional可以是复数的,即可以标明一个方法同时是ONLINE和OFFLINE的。我们还可以在工程的属性里定义ONLINE,OFFLINE使其对整个工程有效。

157, 从写第一个界面开始,就进行自动化测试。

这一点着重于UI的自动化测试。Code UI Automation是一个Vs自带的UI自动化测试工具,适当的时候应该学习学习。

【进阶修炼】——改善C#程序质量(9)的更多相关文章

  1. 【进阶修炼】——改善C#程序质量(1)

    这是一个大纲形式的概要,以便自己可以花较少的时间反复阅读.在开发中,多加注意这些有用的建议,让自己成为一个更优秀的程序员.内容主要来自<编写高质量代码-改善C#程序的157个建议>(陆敏技 ...

  2. 【进阶修炼】——改善C#程序质量(10)

    158,不要写冗余注释. 注释应该写代码没有表达的东西. 代码能够自我描述就不要加注释. 159,废弃的注释应该尽早删除. 废弃的注释由于年代太久远,已经和现在的代码逻辑不匹配了,这样的注释只会误导人 ...

  3. 【进阶修炼】——改善C#程序质量(8)

    122,以<Company>.<Component>作为命名空间. 如Microsoft.Windows.Design.也可以用域名作为空间,如www.microsoft.co ...

  4. 【进阶修炼】——改善C#程序质量(7)

    113,声明变量时考虑最大值. Ushort的最大值是65535,用于不同的用途这个变量可能发生溢出,所以设计时应充分了解每个变量的最大值. 114,MD5不再安全. MD5多用于信息完整性的校验.R ...

  5. 【进阶修炼】——改善C#程序质量(6)

    90,不应为抽象类指定public的构造函数. 抽象类即使指定了public的构造函数,也是不能实例化的,编译通不过.抽象类的构造函数应该设定为protected,它的作用应该是初始化自己的成员,以及 ...

  6. 【进阶修炼】——改善C#程序质量(5)

    71, 区分异步和多线程的应用场景. 计算机的很多硬件,如硬盘,光驱,声卡,网卡都有DMA(Direct Memory Access)功能,它可以不占用cpu的资源,而异步的提出恰恰就是基于这个的.而 ...

  7. 【进阶修炼】——改善C#程序质量(4)

    46, 显示释放资源,需要实现IDisposable接口. 最好按照微软建议的Dispose模式实现.实现了IDisposable接口后,在Using代码块中,垃圾会得到自动清理. 47, 即使提供了 ...

  8. 【进阶修炼】——改善C#程序质量(3)

    32, 总是优先考虑泛型. 泛型代码有很好的重复利用性,和类型安全性. 33, 应尽量避免在泛型类中声明静态成员. 静态成员达不到共享的目的.List<int>和List<Strin ...

  9. 【进阶修炼】——改善C#程序质量(2)

    16, 元素可变的情况下应避免用数组. 数组是定长的集合,可以考虑用ArrayList或List<T>集合.ArrayList元素是object类型,有装箱的开销,性能较低.另外Array ...

随机推荐

  1. 步进电机驱动器 和H桥

    http://bbs.eeworld.com.cn/thread-489952-1-1.html

  2. nginx location 配置详解 【转载,整理】

    http://www.nginx.cn/115.html NGINX location 配置参考:http://www.cnblogs.com/zlingh/p/6288994.html https: ...

  3. 正则和xpath在网页中匹配字段的效率比较

    1. 测试页面是  https://www.hao123.com/,这个是百度的导航 2. 为了避免网络请求带来的差异,我们把网页下载下来,命名为html,不粘贴其代码. 3.测试办法: 我们在页面中 ...

  4. ElasticSearh更新nested字段(Array数组)。怎么根据查询条件(query)复制一个(index)到新的Index how to update by query a nested fields data for elasticsearch

    GET usernested/_search { "query": { "nested": { "path": "tags&quo ...

  5. HTC T329手机如何删除系统自带的软件?HTC一键解锁、获取ROOT权限、豌豆荚删除系统软件

    手头一部HTC T329T手机,机上默认装载的软件实在太多了,居然占用了4页.用360手机卫士并不能删除系统软件(不能获取ROOT权限).查网上查询,总结要删除系统软件步骤如下(本人不刷机,只是想删除 ...

  6. nodepad++ 正则 替换

    (?<k1>.*?)\=(?<k2>.*?); cookie.Add(new CookieList() { Key = "\1", Value = &quo ...

  7. [SQL in Azure] Provisioning a SQL Server Virtual Machine on Azure

    http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-provision-sql-server/ Provi ...

  8. ny106 背包问题

    背包问题                                                时间限制:3000 ms  |  内存限制:65535 KB                   ...

  9. 在Java中使用SQLite的教程(转)

    简介:这是在Java中使用SQLite的教程的详细页面,介绍了和java,有关的知识.技巧.经验,和一些java源码等. 简单的在Java中使用SQLite的教程 使用SQLiteJDBC封装 www ...

  10. 开发openfire 消息拦截器插件PacketInterceptor

    开发消息拦截器的步骤跟开发简单插件步骤一样,要开发消息拦截器插件,首先继承PacketInterceptor包拦截类,然后在initializelPlugin()方法中注册拦截器,就可以实现inter ...