【进阶修炼】——改善C#程序质量(9)
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)的更多相关文章
- 【进阶修炼】——改善C#程序质量(1)
这是一个大纲形式的概要,以便自己可以花较少的时间反复阅读.在开发中,多加注意这些有用的建议,让自己成为一个更优秀的程序员.内容主要来自<编写高质量代码-改善C#程序的157个建议>(陆敏技 ...
- 【进阶修炼】——改善C#程序质量(10)
158,不要写冗余注释. 注释应该写代码没有表达的东西. 代码能够自我描述就不要加注释. 159,废弃的注释应该尽早删除. 废弃的注释由于年代太久远,已经和现在的代码逻辑不匹配了,这样的注释只会误导人 ...
- 【进阶修炼】——改善C#程序质量(8)
122,以<Company>.<Component>作为命名空间. 如Microsoft.Windows.Design.也可以用域名作为空间,如www.microsoft.co ...
- 【进阶修炼】——改善C#程序质量(7)
113,声明变量时考虑最大值. Ushort的最大值是65535,用于不同的用途这个变量可能发生溢出,所以设计时应充分了解每个变量的最大值. 114,MD5不再安全. MD5多用于信息完整性的校验.R ...
- 【进阶修炼】——改善C#程序质量(6)
90,不应为抽象类指定public的构造函数. 抽象类即使指定了public的构造函数,也是不能实例化的,编译通不过.抽象类的构造函数应该设定为protected,它的作用应该是初始化自己的成员,以及 ...
- 【进阶修炼】——改善C#程序质量(5)
71, 区分异步和多线程的应用场景. 计算机的很多硬件,如硬盘,光驱,声卡,网卡都有DMA(Direct Memory Access)功能,它可以不占用cpu的资源,而异步的提出恰恰就是基于这个的.而 ...
- 【进阶修炼】——改善C#程序质量(4)
46, 显示释放资源,需要实现IDisposable接口. 最好按照微软建议的Dispose模式实现.实现了IDisposable接口后,在Using代码块中,垃圾会得到自动清理. 47, 即使提供了 ...
- 【进阶修炼】——改善C#程序质量(3)
32, 总是优先考虑泛型. 泛型代码有很好的重复利用性,和类型安全性. 33, 应尽量避免在泛型类中声明静态成员. 静态成员达不到共享的目的.List<int>和List<Strin ...
- 【进阶修炼】——改善C#程序质量(2)
16, 元素可变的情况下应避免用数组. 数组是定长的集合,可以考虑用ArrayList或List<T>集合.ArrayList元素是object类型,有装箱的开销,性能较低.另外Array ...
随机推荐
- stm8 I/O口模式配置
复位后的默认配置 :复位之后,所有的引脚都是悬浮输入模式. However, a few pins may have a different behavior. Refer to the datash ...
- [转]JSON Web Token - 在Web应用间安全地传递信息
JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个场景.在A用户关注了B用户的时候,系统发邮件给B用户, ...
- Java 8 – How to sort a Map
Java 8 – How to sort a Map 1. Quick ExplanationMap result = map.entrySet().stream() .sorted(Map.Entr ...
- python标准库介绍——30 code 模块详解
==code 模块== ``code`` 模块提供了一些用于模拟标准交互解释器行为的函数. ``compile_command`` 与内建 ``compile`` 函数行为相似, 但它会通过测试来保证 ...
- MongoDB索引相关文章-摘自网络
索引类型 虽然MongoDB的索引在存储结构上都是一样的,但是根据不同的应用层需求,还是分成了唯一索引(unique).稀疏索引(sparse).多值索引(multikey)等几种类型. 唯一索引 唯 ...
- iOS 再谈 代理传值,block反向传值
本贴的例子是:有A和B两个界面,要实现的效果就是先让A跳转到B,然后B中有个颜色的参数,当B跳转到A时,把这个颜色的参数传递给A,在A中利用这个颜色改变自己界面的颜色. 第1步:在发送者(界面B)中, ...
- js函数调用二种常用方法的例子
js中函数调用的两种常用方法. 一个js函数 function test(aa){ window.alert("你输入的是"+aa); } 方法一:直接调用 test(" ...
- 腾讯云服务器 - 配置JDK环境以及Tomcat+nginx服务器
安装完ngxin以及fastdfs后,那么jdk和tomcat是肯定要装的,本篇很简单,实在没啥好说的,都是基础,略微带一下,如果是大牛路过可以看看吐槽一下 云服务器上初识环境如果没有选择附带其他软件 ...
- CCShatteredTiles3D
CCSprite* pImgBg = CCSprite::create("1.png"); pImgBg->setPosition(ccp(CCDirector::share ...
- How To Download Youtube Videos Without any software
https://www.quora.com/What-is-the-best-way-to-download-YouTube-videos-for-free There are various met ...