消除代码中的坏味道,编写高质量代码

Intro

想要写出较好的代码,保证代码的高质量需要时刻警惕代码中的坏味道,今天分享一下,我觉得平时写的代码中可能会出现的坏味道代码的一些示例

常见的坏味道代码

  1. Bug Logically(null check etc.)

严格的来说,这可能是一个 BUG 级别的代码了,最简单的一个实例,你应该明确你的输入数据是不是可能为 null,如果可能为 null 需要检查一下,有一些代码中往往会在代码中写下一些坑,明明这个变量是 null 还是直接用这个变量中的属性或方法

还有一种情况是明确对象不是 null 的情况下就不要 null check 或使用 null 传播符号,下面的这个是一个错误示例:

var list = new List<int>(){1,2,3,-2,3,6,2};
var arr = list?.Where(x=>x>0)?.Where(x=>(x%2)==0)?.ToArray()

上面的代码里 list 是不会为 null 的所以 list 后不需要加 ?Where 这个 LINQ 方法是不会返回一个 null 的,所以 Where 后面也是不需要加 ?

这里特别想说一下,很多人对象 FirstFirstOrDefault 的用法有些不清楚,如果能找到数据并且要找到第一个数据就用 First,如果找不到会有 exception, 而 FirstOrDefault 在不确定有没有的时候用它更合适,如果没有就返回一个默认值。

  1. unnecessary namespace using

代码中没有用到的命名空间引用请移除它,避免不必要的代码

  1. unused code, commented code

没有用到的代码或者被注释的代码直接从代码中删除,不要保留在代码库中,一个是可能会让人很费解,一个是没有任何用处

现在我们的代码基本都会使用源代码版本管理,如果没有,我建议你使用,这样可以保证每次修改都是一个版本,可追溯

  1. exception throw

在应用中主动抛异常的时候应该抛出具体的异常,例如参数为 null 的时候应该抛出 throw new ArgumentNullException("paramName") 而不是 throw new Exception()

还有一些异常应该是系统内部抛出的异常,不应该从用户代码中抛出,例如:IndexOutOfRangeException

  1. obsolete members

对于过时的方法,我们一般会标记一个 [Obsolete],标记的同时应该提供一个 message 提示用户不要使用这个方法或者使用哪一个方法代替

  1. 抽象类

抽象类的构造器方法应该是 protected,因为抽象类是不能实例化的,所以抽象类的构造方法是不是被直接调用的,所以通常来说应该考虑抽象类的构造方法设置为 protected

抽象类中外部要使用的方法才设置为 public,仅内部会用到的成员设置为 protected 即可,体现封装特性,最小化访问权限

  1. 方法重载

方法重载应该放在一起,这样方便我们查找代码,也会更方便了解这个方法的参数

  1. method complexity

减少方法的复杂度,不要让一个方法过于复杂,如果太复杂了就可能需要考虑重构了,方法参数不能太多,方法逻辑不要太复杂,详细可以参考上一篇文章方法重构分析

  1. IEnumerable<T>

对于 IEnumerable<T> 使用 Any() 来代替 Count()==0

对于数组和列表分别使用 array.Lengthlist.Count 代替 Count()

Recommendations

推荐为你的 Visual Studio 安装 CodeMaidReSharper

使用 CodeMaid 来做代码整理,通常我会使用 CodeMaid 来自动整理代码,防止有些地方会有多余的空格,和自动清理命名空间,除此之外 CodeMaid 还有一个比较赞的功能是在使用 region 来区分代码块的时候,CodeMaid 会在 EndRegion 处增加对应的 Region 的描述信息,这样方法较长,region 较多的情况下会比较容易区分哪里是哪一部分的会比较清晰

遵循 ReSharper 的建议编写更整洁的代码,ReSharper 会提供很多实用的建议,比如使用新的 C# 语法来简化代码,移除没有使用的变量等很多很实用的建议,按照 ReSharper 的建议我们就可以比较轻松的写出比较良好的代码,有时候 ReSharper 的命名规则可能会于自己的习惯不符,可以通过定制 editorconfig 来指定命名规范

More

Resharper 也有代码整理的,不过我没用过,习惯了 CodeMaid 了,有兴趣的可以研究一下,一起交流一下哈~~

消除代码中的坏味道,编写高质量代码相关推荐

  1. java 代码坏味道_代码中的坏味道

    前言 在日常生活中,当我们买的水果放久了之后会发出一种难闻的气味("坏味道"),这个时候我们就应该把它扔掉.同样,代码也有"坏味道",当然确定什么是和不是代码& ...

  2. 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...

                 The reasonable man adapts himself to the world; The unreasonable one persists in trying ...

  3. 转载----编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...

    阅读目录 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的类型务必一致 建议4:避免带有变长参数的方法重载 建议5:别让null值和空值威胁到变长方法    ...

  4. 编写高质量代码改善C#程序的157个建议——建议86:Parallel中的异常处理

    建议86:Parallel中的异常处理 建议85阐述了如何处理Task中的异常.由于Task的Start方法是异步启动的,所以我们需要额外的技术来完成异常处理.Parallel相对来说就要简单很多,因 ...

  5. 《编写高质量代码:改善c程序代码的125个建议》——建议14-2:在右移中合理地选择0或符号位来填充空出的位...

    本节书摘来自华章计算机<编写高质量代码:改善c程序代码的125个建议>一书中的第2章,建议14-2,作者:马 伟 更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...

  6. 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...

    建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...

  7. 编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理

    编写高质量代码改善java程序的151个建议--[110-117]异常及Web项目中异常处理 原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保 ...

  8. java 151建议_编写高质量代码改善java程序的151个建议——导航开篇

    前言 系列文章: 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,惨不忍睹是吧.确实,人和代码一样都在成长,都在变好当中.有时候只是实现功能的编程,长 ...

  9. 编写高质量代码的50条黄金守则-Day 01(首选隐式类型转换)

    该文章由本人原创发布,最新版本现已迁移至:编写高质量代码的50条黄金守则-Day 01(首选隐式类型转换) | .Net中文网. 编写高质量代码的50条黄金守则-Day 01(首选隐式类型转换),本文 ...

最新文章

  1. python学习--基础
  2. 程序编辑SHP文件并应用更改到数据源
  3. AngularJS 作用域与数据绑定机制
  4. WM_PAINT消息小结
  5. 建立海盗的天堂:盗贼之海的AI设定(三):巨齿鲨、海怪和骷髅船的AI运行
  6. brew 安装java8_mac使用brew安装Java8
  7. body onload 控制窗口大小 html,如何实现在调整浏览器窗口大小时缩放的网页?
  8. CocoaPods 错误 target overrides the `OTHER_LDFLAGS`...
  9. MySQL数据类型中的二进制类型有_在MySQL数据类型中,常用的数据类型有()。A.()数值类型()B.()字符串类型()C.()日期时间类型()D.()二进制类型...
  10. 简单又帅气的折纸机器人教程_几张纸做出帅气纸飞机,做法简单飞行速度超快,手工折纸飞机...
  11. makefile 生成.o_要学好 C 语言 / C++ ,Makefile 可少不了
  12. python连续小波变换_连续小波变换CWT(2)
  13. zblog php主题,天兴工作室:zblogphp视频站主题(新增会员中心+盈利系统)
  14. 编译原理第一章笔记--绪论
  15. Qt QLabel样式表总结
  16. (最详细)小米手机4c的USB调试模式在哪里开启的教程
  17. 洛谷 P1878 舞蹈课(优先队列 + 双链表)
  18. 【Java】我的世界Java版外挂制作 [0] - 配置环境
  19. python爬虫:模拟登录新浪微博并实现cookies保存,详细讲一下rsa
  20. 阿里云如何将一个域名解析到另一个域名上

热门文章

  1. linux进阶命令2
  2. uwp应用在debug模式下运行正常,编译为release版本的时候抛出异常
  3. iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”
  4. jQuery实现登录提示
  5. Bootstrap入门(八)组件2:下拉菜单
  6. background意识(两)
  7. border:none 与border:0的区别
  8. curl 升级 php,将命令行cURL转换为PHP cURL
  9. 节省大量教科书的三种潜在风险方法
  10. 永不丢失照片:防弹照片备份的完整指南