《Code Complete》ch.7 高质量的子程序

WHAT?

  子程序(routines)是为实现一个特定目的而编写的可被调用的方法或过程。在C++中是函数(function),在Java中是方法(method),在VB中是函数过程(function procedure)或子过程(sub procedure)。

WHY?

  • 降低复杂度
  • 引入中间、易懂的抽象
  • 避免代码重复
  • 支持继承、重写
  • 隐藏实现细节
  • 提高可移植性
  • 改善性能(对明确的子程序进行优化)

HOW?

  • 内聚性(cohesion):是指子程序中各种操作之间联系的紧密程度
  • 编程的目标是让每一个子程序只完成一件事情
  • 内聚性的几个层次,由高到低排列
    • 功能内聚(functional cohesion):最强、最好的内聚,只完成一件事情
    • 顺序内聚(sequential cohesion):子程序做了至少两件事情,且这两件事情有分先后顺序
    • 通信内聚(communicational cohesion):子程序做了至少两件事情,它们使用了同样的数据
    • 临时内聚(temporal cohesion):将一系列操作放到一起执行,如startUp()、shutDown(),应该由这些程序去调动其它子程序,而不是把实现都写在这些程序中
    • bad:过程内聚(procedural cohesion):子程序中操作必须按照特定顺序进行
    • bad:逻辑内聚(logical cohesion):依靠输入参数的标识位来决定执行哪一段逻辑
    • bad:巧合内聚(coincidental cohesion):子程序中各个操作没有关联,一团乱麻

《Code Complete》ch.7 高质量的子程序

时间: 2024-10-14 00:55:59

《Code Complete》ch.7 高质量的子程序的相关文章

代码大全第七章--高质量的子程序

第七章  高质量的子程序 7.1 创建子程序的正当理由 1.降低复杂度 2.引入中间.易懂的抽象:把一段代码放入一个命名恰当的子程序内,是说明这段代码用意最好的方法之一 3.避免代码重复 4.支持子类化 5.隐藏顺序 6.隐藏指针操作 7.提高可移植性 8.简化复杂的布尔判断 9.改善性能 10.确保所有子程序都很小 有些操作似乎过于简单而没有必要写成子程序,但有时考虑到后期扩展和可读性,应该写成子程序 7.2 在子程序上设计 对子程序而言,内聚性是指子程序中各种操作之间联系的紧密程度,我们的目

代码大全学习笔记(四):第7章--设计高质量的子程序

1. 子程序是为实现特定目的而编写的一个可被调用的方法(method)或过程(procedure),例如c++中的函数.java中的方法 子程序避免代码段重复,提高代码可读性,同时方便代码改动 2. 好的子程序名字 (1)   避免使用无意义.模糊不清的动词,例如processInput() (2)   根据需要确定子程序名字的长度,以清晰易懂为标准 (3)   子程序名称一般为 动词加宾语的形式 (4)   准确使用对仗词提供完整接口 3. 子程序的最佳长度 理论上最佳长度为50-150行,一

《Code Complete》ch.25 代码调整策略

WHAT? 本章讨论程序性能调整问题.但是对用户来说,程序员按时交付软件,提供一个清爽的用户界面,避免系统经常死机常常比程序性能更加重要 WHY? 在程序设计这种文化中,编写出能够节省几微秒的代码可以证明你很酷-- HOW? Pareto法则 即80/20法则,指你可以通过20%的努力获取80%的成果 一些无稽之谈 在搞基高级语言中,减少代码行数可以加快代码执行速度 特定运算可能比其他的更快,代码规模也较小:在某个环境下提升程序性能的方法放到另一个环境中可能会损害程序性能.在调整代码的时候你实际

《Code Complete》ch.24 重构

WHAT? 重构(refactoring),Martin Fowler将其定义为“在不改变软件外部行为的前提下,对其内部结构进行改变,使之更容易理解并便于修改”. WHY? 神话:一个管理很完善的软件项目,应该首先以系统化的方法进行需求开发,定义一份严谨的列表来描述程序的功能.设计完全遵循需求,并且完成的相当仔细,这样就让程序员的代码编写工作从头到尾直线型地工作.表明绝大多数代码首次编写后就已完美,测试通过即可被抛诸脑后.代码被修改的惟一时机发生在交付使用后在新版本进行功能的添加 现实:在初始开

《Code Complete》ch.8 防御式编程

WHAT? 主要思想:子程序不应因传入参数错误而被破坏 WHY? 保护程序免遭非法输入的破坏 HOW? 断言 assert denominator != 0 : "denominator should not be 0"; // 启动VM时需要 -ea 参数用以启动assert功能 只用于开发.维护阶段 用错误处理代码来处理预期会发生的状况,用断言来处理绝不会发生的状况 避免把需要执行的代码放入断言中 用断言来注解并验证前条件和后条件 错误处理技术 返回中立值(当对返回结果准确性要求较

《Code Complete》ch.26 代码调整技术

WHAT? 提高代码运行速度的方法,减少代码的资源占用 WHY? 这里提出的都是“可以尝试的”方法,有的或许在你的环境根本不起作用,有的则能实实在在产生很好的效果 HOW? Logic - 逻辑 在知道答案后停止判断 按照出现频率来调整判断顺序:让运行最快和判断结果最肯能为真的判断先行,即,让程序更容易进入常见状况的处理 用查询表代替复杂表达式 惰性求值:lazy loading Loop - 循环 将判断外提 合并:将两个相同计数器的循环合并 展开:循环被完全展开后,将具有更快的速度 尽量减少

《Code Complete》ch.23 调试

WHAT? 调试——发现错误的一种手段 WHY? 相对于不善于调试的程序员,善于调试的程序员只需要前者1/20的时间就可以找出问题所在 HOW? 科学的调试方法 把错误的发生稳定下来:假设-证实/证伪 确定错误原因:二分法 同他人讨论问题 忏悔式调试 抛开问题,休息一下 修正问题 动手之前先要理解问题 理解程序本身,而不仅仅是问题 验证对错误的分析 放松一下 治本,而不是治标 修改代码时一定要有正确的理由:不要随机地修改代码,在没有理解代码时对她做的改动越大,你对她能正确工作的信息就越低 检查自

《Code Complete》ch.11 变量名的力量

What? 如何给变量命名 Why? 易读(你三个月前的代码=别人的代码),易记,恰如其分 整齐的命名具有美感,强迫症患者居家旅行杀人放火之必备 How? 以问题为导向 好名字反映的是问题(what),并非解决方案(how).名字不应体现计算细节 // good Object studentData; int sum; // bad Object inputData; int calcValue; 控制变量名长度 合适的变量名长度为10-16个字符 较长的名字适用于少用到的全局变量,较短的名字适

《Code Complete》ch.18 表驱动法

是什么 一种scheme,用表来做信息存取,代替逻辑语句(if/else) 为什么 简化逻辑语句,避免大量嵌套的 if/else 或者 switch/case 怎么用 三种访问表的方式 直接访问:将源数据作为key 索引访问:构建KV表 阶梯访问:分为连续区间,遍历或者二分查找 例子 // get the full name of weekday // good String[] weekdays = { "Sunday", "Monday", "Tues