文章目录

  • 原则
  • 名词
  • 代码示例
  • 保留问题

原则

  • 限制每个代码单元分支点的数量不超过4个。
  • 应该将复杂的单元拆分成多个更简单的单元,避免多个复杂的单元在一起。
  • 该原则能提高可维护性的原因在于,分支点越少,代码单元越容易被修改和测试。

名词

  1. 分支覆盖率:一个代码单元分支点的数量,就是覆盖所有分支点产生的分支路径的最小数量。
  2. 圈复杂度、循环复杂度(McCabe):分支点数量加1。

代码示例

假如有这样一段代码:

public IList<Color> GetFlagColor(Nationality nationality)
{List<Color> result;switch(nationality){case Nationality.DUTCH:result = new List<Color>{ Color.Red, Color.White, Color.Blue};break;case Nationality.GERMAN:result = new List<Color>{Color.Black, Color.Red, Color.Yellow};break;...case Nationality.UNCLASSFIED:default:result = new List<Color>{Color.Gray};break;}return result;
}

通过对象表示方法修改如下:

public interface IFlag
{IList<Color> Colors{get;}
}public class DutchFlag: IFlag
{public IList<Color> Colors{get {return new List<Color>{Color.Red, Color.White, Color.Blue};}}
}
...private static readonly Dictionary<Nationality, IFlag> FLAGS = new Dictionary<Nationality, IFlag>();static FlagFactory()
{FLAGS[Nationality.DUTCH] = new DutchFlag();...
}public IList<Color> GetFlagColors(Nationality nationality)
{IFlag flag = FLAGS[nationality];flag = flag ?? new DefaultFlag();return flag.Colors;
}

保留问题

有个二分查找的示例代码如下:

public static int CalculateDepth(BinaryTreeNode<int> t, int n)
{int depth = 0;if(t.Value == n){return depth;}else{if (n < t.Value){  BinaryTreeNode<int> left = t.left;if(left == null){throw new TreeException("Value not found in tree!");}else{return 1 + CalculateDepth(left, n);}}else{BinaryTreeNode<int> right = t.Right;if(right == null){throw new TreeException("Value not found in tree!");}else{  return 1 + CalculateDepth(right, n);}}}
}

使用卫语句来代替嵌套的条件语句:

public static int CalculateDepth(BinaryTreeNode<int> t, int n)
{int depth = 0;if(t.Value == n){return depth;}if ((n < t.Value) && (t.left != null)){return 1 + CalculateDepth(t.Left, n);}if ((n > t.Value) && (t.Right != null)){return 1 + CalculateDepth(t.Right, n);}throw new TreeException("Value not found in tree!");
}

继续将上面的语句进行提取:

public static int CalculateDepth(BinaryTreeNode<int> t, int n)
{int depth = 0;if (t.Value == 0){return depth;}else{return TraverseByValue(t, n);}
}private static int TraverseByValue(BinaryTreeNode<int> t, int n)
{BinaryTreeNode<int> childNode = GetChildNode(t, n);if(childNode == null){throw new TreeException("Value not found in tree!");}else{return 1 + CalculateDepth(childNode, n);}
}private static BinaryTreeNode<int> GetChildNode(BinaryTreeNode<int> t, int n)
{if (n < t.Value){return t.Left;}else{return t.Right;}
}

如果新提取的方法可重用性比较差,可能就是提取的方法不对应或者过度提取了。

[荷] Joost Visser 著. 张若飞译. 【代码不朽:编写可维护软件的10大要则(C#版)】

代码不朽笔记: 编写简单的代码单元相关推荐

  1. 好书推送-《代码不朽:编写可维护软件的10大要则》

    本书由软件改进组织(SIG)编写,一共是12章,130页.本书的10大原则,是基于SIG经历了长达15年软件质量的咨询工作后总结出来的. 什么是软件的可维护性:软件系统被修改的难易程度. 国际标准IS ...

  2. vb计算机清除菜单代码,用VB编写简单的程序来清空文档菜单 (转)

    用VB编写简单的程序来清空文档菜单 (转)[@more@]文档菜单放的是我们最近使用的的快捷方式,它所对应的目录在 95(或)目录下的Recent目录.当我们不在需要这些快捷方式时,我们可以清空文档菜 ...

  3. python的代码有哪些_简单python代码类型有哪些?

    简单python代码类型有哪些? 简单python代码类型有: 1.[背景] 最近,派大星想要减肥,他决定控制自己的饮食,少吃一点蟹黄堡. 海绵宝宝为了帮助好朋友派大星,和派大星一起制定了一个饮食游戏 ...

  4. ajax简单实例代码,分享Ajax创建简单实例代码

    XmlHttp是一套可以在Javascript.VbScript.Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API.XmlHttp最大的用处是可以更新网页的部分内容而 ...

  5. 随想录(编写简单资源管理代码)

    [声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 不管编写什么软件,我们都会涉及到模块的编写.说是模块,其实就是管理一片资源,这些资源的概念很广, ...

  6. java算法优化_Java学习笔记---Java简单的代码算法优化(例)

    例:用一张1元纸币兑换1分.2分.5分硬币,要求兑换50枚硬币,求出所有组合. package mypackage01; public class demo { public static void ...

  7. 爬虫python代码-一则python3的简单爬虫代码

    不得不说python的上手非常简单.在网上找了一下,大都是python2的帖子,于是随手写了个python3的.代码非常简单就不解释了,直接贴代码. 代码如下: #test rdp import ur ...

  8. 贪吃蛇python语言代码_Python贪吃蛇简单的代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在自学Python的过程中在网上查询资料时发现了一些好玩的东西,python的游戏库模块,它可以自己弄一个小游戏来玩玩,然后我在网上找了一些游戏的代码,, ...

  9. python简单爬虫代码-一则python3的简单爬虫代码

    不得不说python的上手非常简单.在网上找了一下,大都是python2的帖子,于是随手写了个python3的.代码非常简单就不解释了,直接贴代码. 代码如下: #test rdp import ur ...

最新文章

  1. vue tag=“li“ 和event原有样式渲染不出来
  2. 图解分布式系统架构演进之路
  3. 空间谱专题13:联合解算DOA(ML/AP)
  4. 程序员修神之路--分布式系统使用网关到底是好还是坏?
  5. CSS系列讲解-总目录
  6. linux pid t 头文件_linux系统调用相关头文件
  7. 10月23日见?疑似魅族16T预热海报曝光:定位大屏娱乐旗舰
  8. 在 Centos6/RHEL6 上恢复 ext4 文件系统下误删除的文件
  9. SpringMVC中的九大组件
  10. Excel·VBA数组冒泡排序函数
  11. http-server基本使用
  12. kafka 验证_KAFKA:简单的验证码实施
  13. matlab绘制垂线(x轴或y轴)
  14. CodeForces Round #554 Div.2
  15. php面试题和答案整理
  16. 小米MAX开发者选项 以及如何连接MAC开发RN
  17. 什么是数字化?企业如何实现数字化?
  18. javaSE-String,StringBuffer和StringBuilder
  19. 以太坊 solidity在线实时编译器
  20. edge浏览器如何设置无痕浏览 无痕浏览网页方法

热门文章

  1. linux服务器基础知识及工作原理汇总
  2. revit中在三维视图下显示房间文字和“房间集成”
  3. java echarts 生成图片_java如何在后台生成echarts图表?实际代码展示
  4. 20221208 浪客剑心 追忆篇
  5. 通过预先数据标注让AI算法更加精确
  6. WiderPerson行人检测数据集
  7. 《死亡搁浅》如何成了“薛定谔的猫”? 一个小岛秀夫式的乌托邦
  8. java学习笔记(十)—— 抽象类、接口、内部类
  9. a 标签的 target 属性、描点链接
  10. 【C++】C++ 知识点100题