对一个驱动程序的重构过程(节选)

转载 2004年06月30日 09:34:00

对一个驱动程序的重构过程(节选)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

作者:雷立辉 (个人主页:http://www.coeffort.com)

 

Bad Smell 小解:

1.重复程序代码(Duplicated Code

重复程序代码是程序中最容易出现的臭味。在一个大的工程中,你可以发现同一个操作可能有多种实现

方式,比茴香的“茴”字的写法还要多。只要你在两个以上的地方发现相同的程序代码块你就需要重构

了。其中最简单的是在一个类的两个方法有相同的代码块。你可以使用“提取法(Extract Method)”

提出一个共有的方法,然后让两个地方调用这个函数。其它的如相同的复杂条件表达式,类之间使用的

相同的代码等等都应该提取出共有的方法,共有的类让调用者使用同一份代码。有一个大的原则便是某

一功能的代码实现有且只有一次。否则,这些重复代码不仅会加大可执行程序的大小更重要的是造成阅

读以及修改bug 的困难。

2.长方法(Long Method

Martin 说,生命最长且最有用的是那些短方法。长方法会造成更多的长方法的生成,因为那些蕴含在

长方法中的功能块没有提取出来,而添加的代码只好又去拷拷再改改然后被添加到新的方法中,这又造

成了重复程序代码。短的方法有利于阅读,它的方法名字本身就是功能的描述,它使用的临时变量不会

太多,也有利于阅读和除错,更利于重用。消除长方法的一个诀窍便是看代码中的注释。那些被分段描

述的代码块可能便是一个小的方法。

3.大类(Large Class

当一个类做的事太多时,它就会有非常多的成员变量(instance variables),这些成员变量反过来又

造成了许多重复代码。大类的特点便是责任太多,就像是一个臃肿的机构一样,交流和管理起来便就分

外困难一些。同时,这种大类也像长方法一样,会造成新的大类产生。(如果你想想一个工厂的工人都

负责从产品生产,包装,销售,甚至管理厂务,那还有没有效率?那对工人的要求要有多高?所以,流

水线和分工产生了,它让一个工人只做某一个阶段的工作或者最擅长的工作)

4.长参数列(Long Parameter List

其弊端在于难以理解,难于使用,难以扩展。如果您对Windows 下的CreateProcess Unix 下的fork

做过比较的话,如果您有Windows API 调用恐惧症的话,这不难理解前面两点。

5.分歧的改变(Divergent Change

现象是如果改变一项需求,就必须改变几个方法。举例来说,输出可能有多种不同的格式(如纯文字文

件、HTML 文件或者数据库等),而设计时只针对其中一种设计,但预期可能会有其它种可能性,因此

程序必须预留可能性,或者在增加新功能时使用重构使之具有这种弹性。

6.霰弹式的外科手术(Shotgun Surgery

比喻非常形象。如果消除一个bug,您要多处小改动。不过,如果您忘了一处,那就看其他人的脸色吧。

 

重构介绍:

重构是在不改变可观察行为的前提下,对软件内部结构的改变,目的是使它更易于理解并且能够更廉价地

进行改变。那么重构究竟有什么好处呢?据Martin 讲,有四大好处ii

1.重构改进软件的设计

如果没有重构,程序的结构将会随着新的需求的添加而失去原来的清晰性;由于维护人对原有系统的

片面理解或者只是为了实现短期目标将会造成程序结构失衡,重复代码等等。而且代码加得越多,结

构就会腐蚀得越快,从而使结构更加不易理解。这种恶性循环的结果便是软件不可维护。糟糕的设计

通常都是以重复的代码为特征的。而重构的目标便是让程序恢复一段代码只在整个程序中只出现一次,

从而出现一个清晰的结构。

2.重构让程序变得更易理解

重构支持更小的类、更短的方法、更少的局部变量、更小的系统耦合。重构要求你更加小心自己的命

名机制,让名字反映出你的意图。如果哪一块代码太复杂以至于影响到理解,那就是重构开始的时刻。

3.重构帮助你发现bug

当你发现许多bug 是因为重复代码引起的或是当你重构时发现有些代码是如此的不负常规或者你通过

重构理解了代码,那你就理解了这一句话。

4.重构让你编程效率更高

当你通过重构恢复了程序的高质量、设计、结构、可读性,理解了程序结构之后。使用你构造的可重

用方法,添加新的功能真是变得很容易了。

Martin 还说,重构在添加功能前,修改bug 中及做代码走读(Code Review)时做最好。

 

一个驱动程序对应多个设备

主要讲解一个驱动程序创建两个设备的例子
  • qqliyunpeng
  • qqliyunpeng
  • 2016年08月31日 18:09
  • 1563

Linux SPI总线和设备驱动架构之二:SPI通用接口层

通过上一篇文章的介绍,我们知道,SPI通用jie k
  • DroidPhone
  • DroidPhone
  • 2014年04月18日 17:02
  • 16496

内核怎么通过主设备号找驱动、次设备号找设备

MAJOR宏将dev_t向右移动20位,得到主设备号;MINOR宏将dev_t的高12位清零,得到次设备号。相反,可以将主设备号和次设备号转换为设备号类型(dev_t),使用宏MKDEV可以完成这个功...
  • xy010902100449
  • xy010902100449
  • 2015年04月27日 09:22
  • 2545

linux设备驱动程序的hello模块编译过程

分类: linux驱动程序读书笔记2007-11-06 11:19 3813人阅读 评论(3) 收藏 举报 linuxmakefilemodule虚拟机shellpath 今天把linux设备驱...
  • hwmt2012
  • hwmt2012
  • 2013年10月24日 09:54
  • 425

第一个mini2440led驱动程序--各种过程--(大神请过路,小牛勿喷)

学习驱动要半个月了,学的其实不是很好。上周学完了国嵌的led驱动,使用Ioctl控制。应用的代码和驱动的代码都是使用国嵌的。 问题:使用的驱动代码是国嵌的,驱动相关的内核是国嵌的linux-2.6....
  • u010089238
  • u010089238
  • 2013年06月06日 21:28
  • 1200

驱动程序中USB设备的配置过程(参考Windows XP DDK)

驱动程序中USB设备的配置过程(参考Windows XP DDK) DDK驱动程序写得很规范,USB初始化、数据传输的过程写的很清楚。通过阅读DDK驱动程序,我对原来USB驱动程序中许多不理解的地方...
  • htqlhy
  • htqlhy
  • 2012年11月01日 10:39
  • 816

NDIS网络数据监控程序NDISMonitor(1)-----驱动程序(编译过程与源码讲解)

一、编译过程 弄了半天终于编译通过了,看来驱动的开发确实没有应用来得简单啊。 由于DDK提供的ndis.h有4个,什么时候要调用哪个我确实不清楚: (1)我先用#include 结果报错...
  • cosmoslife
  • cosmoslife
  • 2012年10月09日 19:38
  • 1056

Qt5.1.1 编译 MySql5.6.17驱动程序的过程和注意事项

做一个小软件需要用到Qt和Mysql,然而Qt的官方发布版本是没有带Mysql驱动的,需要我们自己来编译Qt的Mysql驱动程序。 按照网上的参考步骤,走了各种弯路,解决了各种千奇百怪的问题,终于将...
  • zgrjkflmkyc
  • zgrjkflmkyc
  • 2014年05月08日 16:57
  • 5710

NDIS网络数据监控程序NDISMonitor(1)-----驱动程序(编译过程与源码讲解)

转载请标明是引用于 http://blog.csdn.net/chenyujing1234  欢迎大家拍砖!   一、编译过程 弄了半天终于编译通过了,看来驱动的开发确实没有应用来得简单啊。 ...
  • bobopeng
  • bobopeng
  • 2014年06月21日 23:36
  • 454

NDIS网络数据监控程序NDISMonitor(1)-----驱动程序(编译过程与源码讲解)

转载请标明是引用于 http://blog.csdn.net/chenyujing1234  欢迎大家拍砖!   一、编译过程 弄了半天终于编译通过了,看来驱动的开发确实没有应用来得简单啊。 ...
  • chenyujing1234
  • chenyujing1234
  • 2012年08月03日 11:39
  • 5646
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对一个驱动程序的重构过程(节选)
举报原因:
原因补充:

(最多只允许输入30个字)