代码不朽笔记: 编写简单的代码单元
文章目录
- 原则
- 名词
- 代码示例
- 保留问题
原则
- 限制每个代码单元分支点的数量不超过4个。
- 应该将复杂的单元拆分成多个更简单的单元,避免多个复杂的单元在一起。
- 该原则能提高可维护性的原因在于,分支点越少,代码单元越容易被修改和测试。
名词
- 分支覆盖率:一个代码单元分支点的数量,就是覆盖所有分支点产生的分支路径的最小数量。
- 圈复杂度、循环复杂度(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#版)】
代码不朽笔记: 编写简单的代码单元相关推荐
- 好书推送-《代码不朽:编写可维护软件的10大要则》
本书由软件改进组织(SIG)编写,一共是12章,130页.本书的10大原则,是基于SIG经历了长达15年软件质量的咨询工作后总结出来的. 什么是软件的可维护性:软件系统被修改的难易程度. 国际标准IS ...
- vb计算机清除菜单代码,用VB编写简单的程序来清空文档菜单 (转)
用VB编写简单的程序来清空文档菜单 (转)[@more@]文档菜单放的是我们最近使用的的快捷方式,它所对应的目录在 95(或)目录下的Recent目录.当我们不在需要这些快捷方式时,我们可以清空文档菜 ...
- python的代码有哪些_简单python代码类型有哪些?
简单python代码类型有哪些? 简单python代码类型有: 1.[背景] 最近,派大星想要减肥,他决定控制自己的饮食,少吃一点蟹黄堡. 海绵宝宝为了帮助好朋友派大星,和派大星一起制定了一个饮食游戏 ...
- ajax简单实例代码,分享Ajax创建简单实例代码
XmlHttp是一套可以在Javascript.VbScript.Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API.XmlHttp最大的用处是可以更新网页的部分内容而 ...
- 随想录(编写简单资源管理代码)
[声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 不管编写什么软件,我们都会涉及到模块的编写.说是模块,其实就是管理一片资源,这些资源的概念很广, ...
- java算法优化_Java学习笔记---Java简单的代码算法优化(例)
例:用一张1元纸币兑换1分.2分.5分硬币,要求兑换50枚硬币,求出所有组合. package mypackage01; public class demo { public static void ...
- 爬虫python代码-一则python3的简单爬虫代码
不得不说python的上手非常简单.在网上找了一下,大都是python2的帖子,于是随手写了个python3的.代码非常简单就不解释了,直接贴代码. 代码如下: #test rdp import ur ...
- 贪吃蛇python语言代码_Python贪吃蛇简单的代码
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在自学Python的过程中在网上查询资料时发现了一些好玩的东西,python的游戏库模块,它可以自己弄一个小游戏来玩玩,然后我在网上找了一些游戏的代码,, ...
- python简单爬虫代码-一则python3的简单爬虫代码
不得不说python的上手非常简单.在网上找了一下,大都是python2的帖子,于是随手写了个python3的.代码非常简单就不解释了,直接贴代码. 代码如下: #test rdp import ur ...
最新文章
- vue tag=“li“ 和event原有样式渲染不出来
- 图解分布式系统架构演进之路
- 空间谱专题13:联合解算DOA(ML/AP)
- 程序员修神之路--分布式系统使用网关到底是好还是坏?
- CSS系列讲解-总目录
- linux pid t 头文件_linux系统调用相关头文件
- 10月23日见?疑似魅族16T预热海报曝光:定位大屏娱乐旗舰
- 在 Centos6/RHEL6 上恢复 ext4 文件系统下误删除的文件
- SpringMVC中的九大组件
- Excel·VBA数组冒泡排序函数
- http-server基本使用
- kafka 验证_KAFKA:简单的验证码实施
- matlab绘制垂线(x轴或y轴)
- CodeForces Round #554 Div.2
- php面试题和答案整理
- 小米MAX开发者选项 以及如何连接MAC开发RN
- 什么是数字化?企业如何实现数字化?
- javaSE-String,StringBuffer和StringBuilder
- 以太坊 solidity在线实时编译器
- edge浏览器如何设置无痕浏览 无痕浏览网页方法
热门文章
- linux服务器基础知识及工作原理汇总
- revit中在三维视图下显示房间文字和“房间集成”
- java echarts 生成图片_java如何在后台生成echarts图表?实际代码展示
- 20221208 浪客剑心 追忆篇
- 通过预先数据标注让AI算法更加精确
- WiderPerson行人检测数据集
- 《死亡搁浅》如何成了“薛定谔的猫”? 一个小岛秀夫式的乌托邦
- java学习笔记(十)—— 抽象类、接口、内部类
- a 标签的 target 属性、描点链接
- 【C++】C++ 知识点100题