concentrate on c/c++ related technology

plan,refactor,daily-build, self-discipline,

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  37 Posts :: 1 Stories :: 12 Comments :: 0 Trackbacks

常用链接

留言簿(9)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

// 摘自代码大全2第九章
创建类和子程序的步骤概述.
1 开始
2 创建类的总体设计
3 创建类中的子程序
4 复查并测试整个类
5 完成
其中3与4之间要进行交互,这种交互主要是针对审查子程序进行的,并且2与3之间也要进行交互,这种交互主要针对子程序在类中的总体设计.
一个思想是:细化跟迭代,并且即使反馈直到类功能和子程序功能都清晰,再到5.
创建一个类的步骤
1)创建类的总体设计:
设计一个类的过程中包含一些特有的设计任务--定义类的特定职责,定义类所要隐藏的秘密,以及精确地定义类的接口所代表的抽象概念,决定这个类是否要从其他类派生而来,以及是否允许其它类再从它派生,指出这个类中关键的公用方法,标识并设计出类所需用到的重要数据成员.
2)创建类中的子程序
在前述第一个步骤中标识出类的主要子程序之后,还需要创建这些子程序.在编写各个程序时通常还会引出更多的或重要,或次要的子程序,创建这些新加入的子程序的过程往往还会反过来波及类的总体设计
3)复审并测试整个类
通常情况下,子程序在创建的同时也经过了测试,在整个类可以工作之后,应该再对其整体进行复查和测试,以便发现那些在子程序的独立测试层次上无法测出的问题.
在创建类的过程中,2),3)还是要求反复进行的,直到类的总体设计是最优的.
创建子程序的步骤
创建子程序的过程中涉及到的主要活动: 设计子程序,检查设计,编写子程序的代码,检查代码.
1 开始
2 设计子程序(主要借助于伪代码)
3 检查设计(主要是检查伪代码)
4 编写子程序的代码
5 复审并测试代码
6 完成
其中2与3是要进行交互的,主要是保证伪代码的质量,4与5也是要进行交互的,这样主要保证子程序的质量.
伪代码
伪代码的指导原则:
1) 用类似英语的语句来精确描述特定的操作
2) 避免使用目标编程语言中的语法元素
3) 在本意的层面上编写代码,用伪代码去描述解决问题的方法的意图,而不是去写如何在目标语言中实现这个方法.
4) 在一个足够低的层次上编写代码,以便可以近乎自动地从它生成代码.
通过伪代码编程过程创建子程序
检查先决条件
在动手去做子程序本身的任何工作之前,应该先查看一下该子程序要做的工作是不是已经定义好了,是不是能够与整体设计相匹配.另外要结合项目的需求,检查这个子程序是否真正必须的,至少是间接需要的.
定义子程序要解决的问题
陈述出该子程序将要解决的问题,叙述要足够详细,以便能去创建这个子程序,如果高层的设计已经足够详细,那么这项工作可能已经完成了,在这个高层的设计里至少应该详细说明下列信息.
1) 这一子程序将要隐藏的信息
2) 传给这个子程序的各项输入
3) 从该子程序得到的输出
4) 在调用程序之前确保有关的前条件成立(输入数据的取值位于特定范围之中,有关的流已经初始化,文件已经打开或者关闭,缓冲区已经填满或者清空)
5) 在子程序将控制权交回调用方程序之前,确保其后条件的成立(如输出数据位于特定范围之内,流已经初始化,文件已经打开或者关闭,缓冲区已填满或清空)
其中4和5一般通过判断前驱和后继条件来进行的。前者是保证调用的条件是否成立,而后者是保证程序的返回值是否是合法的。
为子程序命名
一般地子程序已经有一个清晰的,无二义性的名字,如果在命名这个子程序的名字的时候,有点困难,那么就说明,对该子程序的设计不是很清楚,而要去改善设计了。
决定如何测试子程序
在编写一个子程序的时候,要想一想怎么才能测试它。这在以后的C/C++测试中都可以部署单元测试工具Xunit.
在标准库中搜寻可用的功能
想用提高代码的质量和生产率,有一个最重要的途径就是重用好的代码。
考虑错误处理
考虑在子程序中可能出错的环节,子程序可以用多种方式来处理错误,应该特别注意去选择处理错误的方式。
考虑效率问题
主要是两个方面的考虑,一是效率,而另一方面是性能。
研究算法和数据类型
如果在可用的程序库里没有所需的功能,它也许会在某本算法书中介绍过,决定从头开始编写一段复杂的代码之前,查一下算法书看看有什么可用的内容。如果采用一个已有明确定义的算法,则要保证这个算法正确地转换为你所用的编程语言。
编写伪代码
前面的那些步骤主要是为确定一个思路,这在真正编写程序的时候是很有帮助的,在完成前面的准备工作以后,就可以开始用高层次的伪代码来写程序。
一般是从写子程序的注释开始进行编制,主要是说明子程序的功能和目的。
考虑数据
在整个过程中的几个不同环节对子程序所用的数据进行设计。
检查伪代码
在写完伪代码并设计完数据之后,花上几分钟时间复杂你写的伪代码,然后抛揩这些代码,想想你该如何向别人解释这些代码。
在伪代码中试验一些想法,留下最好的想法
在你开始编写代码之前,应尽可能用伪代码去尝试更多的想法。
编写子程序的代码
1 以伪代码开始
2 写出子程序的声明
3 编写第一条和最后一条语句,然后将伪代码转换为高层次的注释。
4 每条注释下面填充代码
5 检查代码
6 收尾工作
7 完成
其中3,4,5可以按照需求进行重复。
写出子程序的声明
首先要写出子程序的接口声明,即C++中的函数声明
把伪代码转变为高层次的注释
接下来,把第一条和最后一条语句写出来,在C++中也就是"{"和"}".然后将伪代码转变成注释.
在每条注释下面填充代码
在伪代码注释中的每一句话下面填写代码。
检查代码是否需要进一步分解
方法1:把这段注释下面的代码重构(refactor)成一个新的子程序。
方法2:递归地应用伪代码编程过程。
检查代码
1) 在脑海里检查程序中的错误。
理解每行代码所起的作用,理解为什么需要这行代码,没有什么东西会仅仅因为它看上去可行就是正确的。
编译子程序
完成检查之后,就可以编译这个程序了。
最大地发挥编译子程序所产生的指导建议
1)把编译器的警告级别调到最高,通过让编译器来检测错误,你可以很容易地查出大量细微的错误。
2)使用验证工具,可以通过使用类似lint这样的工具来对C语言这类语言的编译器所做的检查结果进行补充检查。
3)消除产生错误消息和警告的所有根源。
在调试器中逐步执行代码
程序编译通过了之后,要在调试器中逐行执行,以确保每行代码都在按照你所期望的方式执行。
测试代码
使用你在开发该子程序期间计划写的或者已写成的测试用例来测试代码。你可能需要开发一些脚手架来支持你的测试用例
消除程序中的错误
一旦检测到错误,就一定要把它除掉。
收尾工作
检查子程序的接口
确定所有的输入,输出数据都参与了计算,并且所有的参数也都用到了。
检查整体的设计质量
检查子程序中的变量
检查子程序的语句和逻辑
检查子程序的布局
检查子程序的文档
除去冗余的注释。
小结:
之前一直在写程序,但是发现时不时思路很乱,也没有有层次地,有系统地去思考这些类和子程序的设计,只是去实现一个功能,并且能够达到所要的目的就可以了,后来发现经常出问题,很常见的就是考虑不周全,在编制代码以后,才开始反悔,后悔当初的设计,然后对程序产生了消极的情绪,让我感觉不爽,看了代码大全,发现提供了可行的方法.而且思路比以前清晰多了,感觉这个方法很有效,所以记录在这里.


 

posted on 2008-03-01 12:09 jolley 阅读(980) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理