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

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

Intro

想要写出较好的代码,保证代码的高质量须要时刻警戒代码中的坏味道,今天分享一下,我以为平时写的代码中可能会出现的坏味道代码的一些示例数组

常见的坏味道代码

  1. Bug Logically(null check etc.)

严格的来讲,这多是一个 BUG 级别的代码了,最简单的一个实例,你应该明确你的输入数据是否是可能为 null,若是可能为 null 须要检查一下,有一些代码中每每会在代码中写下一些坑,明明这个变量是 null 仍是直接用这个变量中的属性或方法spa

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

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 在不肯定有没有的时候用它更合适,若是没有就返回一个默认值。it

  1. unnecessary namespace using

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

  1. unused code, commented code

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

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

  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 了,有兴趣的能够研究一下,一块儿交流一下哈~~