版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 事实上,卓有成效的优秀 程序员们所使用的技术并不神 秘,但由于日常事务的繁重 和工作任务的重压,程序 员们很少有深入思考 互相交流切磋的时间代 码 大 全Kevin Chen2005 02 18 欢迎进入软件创建世界! 编程高手真正的程序员不写使用说明书, 用户应当自己去试出程序的功能真正的程序员不用进度表和流程图真正的程序员几乎不写代码的注释,真正的程序员不写文档也不需要文档, 只有看不懂程序的才用文档,新手才会这样真正的程序员认为自己比用户更明白用户需要什么真正的程序员不接受团队开发的理念真正的程序员的程序不会在第一次就正确运行,但是他 们愿意守着机器进行若干个30小时的调试改错真正的程
2、序员不会在上午9:00到下午5:00之间工作,如果你看到他在上午9:00工作,这表明他从昨晚一直干到现在 具备上述特征越多,越显得水平高! 一.欢迎进入软件创建世界 提高质量与生产率是软件工程要解决的核心问题。高质量程序设计是非常重要的环节,毕竟软件是靠编程来实现的。 高质量的软件的属性包括正确性、健壮性、可靠性、效率、易用性、可读性(可理解性)、可扩展性、可复用性、兼容性、可移植性等质量属性的。 看来,“高质量”可不是干活小心点就能实现的!一.欢迎进入软件创建世界二.利用隐喻对编程进行深刻的理解隐喻的重要性 重大发现往往是从类比中产生的通过把一个你所陌生的事物与你所熟知的事物比较,会对它有进
3、一步的认识,从而形成你对它的独到的深刻理解,这种隐喻方法被称之为“模型化” 如:OMP MP PP间的数据通信二.利用隐喻对编程进行深刻的理解凭运气珍珠养殖式春天播种代码,秋天收获一堆代码诸多的计划,设计和执行写代码 :优秀小说家一样的“自由编程”生成系统:播种,设计一部分,编码一部分, 测试一部分系统积累:建造软件:系统积累:诸多的计划,设计和执行盖一个狗窝 带上锤子,买来木板和钉子,到下午就给你的爱犬造好了一幢,忘了修一个门?推倒重建!盖一个房子 与建筑师确定方案,画蓝图,找承包商,进行建造,进行装艺,买家具,并在各个过程中进行监督?!不要告诉又忘了修门!盖一个别墅 定做全套家具,别具风格
4、的门和窗户,每个工作都 复杂许多,加在一起?!,需要更多的监督和审核。我的工具箱 对编程理解得越深入,工具箱里的工具就越多二.利用隐喻对编程进行深刻的理解现在考虑建一个房子看看?有这么难么?软件创建的先决条件 需求分析 二.利用隐喻对编程进行深刻的理解三.软件设计的先决条件 问题定义 需求分析 结构设计 语言选择 编程约定 检查表三.软件设计的先决条件 需求分析CMM(成熟度模型)中的需求分析PKA内容 需求定义质量要求的识别 需求定义质量特性定义和度量 定义需求跟踪矩阵 度量结果评审 内部测试计划、系统测试方案 注:尽早发现问题的主要性: IBM的研究表明,在设计开始阶段,如详细设计、编码或
5、单元测试阶段就消除错误,其成本要比在后期即系统测试和功能强化阶段低10 到100 倍。和CMM需求分析PKA的对比 正式的需求 需求定义质量要求的识别 稳定的需求 需求定义质量特性定义和度量 检查表 定义需求跟踪矩阵 让每个人都知道需求变化所付出的代价 度量结果评审三.软件设计的先决条件 需求分析三.软件设计的先决条件 结构设计CMM的软件设计PKA定义: 设计策略:分解、迭代增量、基于模式、. 设计方法:面向功能、面向对象、 用例驱动、. 架构设计:体系结构、构件规格、内外接口、 特别问题、. 构件设计:算法、数据、约束、.结构设计中的典型要素 程序的组织形式 变动策略 购买而不是建造的决定
6、 主要的数据结构、关键算法 主要对象 通用功能 错误处理 坚固性 性能 通用的结构设计质量准则三.软件设计的先决条件 结构设计三.软件设计的先决条件 结构设计 程序的组织形式 定义模块,能完成某一高级功能的子程序的组合。此阶段不考虑建立模块级的子程序。如果一项功能由两个或更多的模块覆盖那么它们之间应该是互补的而不是相互冲突。 只完成一项任务并且圆满完成 强内聚 降低模块之间的了解程度 低耦合三.软件设计的先决条件 结构设计 变动策略 在设计中已经考虑到了可能的功能增强变动,而且,应该使最可能的变动同时世是最容易实现的变动 如:条件编译,使用外部文件三.软件设计的先决条件 结构设计 购买而不是建
7、造的决定 从长远观点来看,重新使用旧软件是提高生产率的首要因素。购买代码可以降低计划、详细设计、测试和调试的工作量 使用库和成熟模块、封装三.软件设计的先决条件 结构设计 主要的数据结构、关键算法 给出使用的主要文件、表和数据结构遵循数据守恒定律:每一个进入的数据都应该出去,或者与其它数据一道出去,如果它不出去,那他就没有必要进来 如果结构设计依赖于某一特定算法,那它应该描述或指出这一算法2431三.软件设计的先决条件 结构设计 主要对象 指出要实现的主要对象,它应该规定每一个对象的责任并指出每个对象之间是如何相互作用的。其中应包括对于排序层次、状态转换和对象一致性的描述。34TextText
8、21三.软件设计的先决条件 结构设计 通用功能 用户界面:应该是模块化的, 输入输出:能够定位层面,区域层次 内存管理:建立自己的内存管理系统 字符串存储:保存在数据结构,源文件 消息通讯:建立固定的通讯方法113452三.软件设计的先决条件 结构设计 错误处理 尽量拒绝于系统之外;建立错误提示展现如何对付错误(建设一套错误处理机制);对错误信息进行分类约定;及时处理或提交;无论哪种情况,都应该提示发现了错误 90的代码是为了应付例外的错误处理或者内务处理而编写的,10的代码才是处理正常情况三.软件设计的先决条件 结构设计 坚固性 坚固性是指在发现错误后,一个系统继续运行的能力,即 健壮性 裕
9、度设计 断言:使其自检的可执行语句,如校验 容错性:返回、辅助代码代替、默认值三.软件设计的先决条件 结构设计 性能 性能目标包括速度和内存使用量。结构设计要对这些目标作出估计,并解释为什么这些目标是可以达到的。 结构设计还应该规定每一个模块或目标的时间和存储空间预算三.软件设计的先决条件 结构设计 通用的结构设计质量准则 或许在开发过程中变动结构设计有很多途径。每一变动都应与总体和设计概念相符。结构的目标应该清楚地说明。 一个以可变性为首要目标的设计可能与一个以性能为首要目标的设计差之千里,虽然二者的功能可能是完全一样的。LabelContentLabel三.软件设计的先决条件 语言选择 当
10、程序员使用自己所熟悉的高级语言时,其工作效率要比使用陌生的语言高得多 高级语言指令与低级语言指令比 语言 比值 Bash 1:l Ada l:4.5 Quick/Turbo Basic l:5 C 1:2.5 Fotran 1:3 Pascal l:3.5三.软件设计的先决条件 编程约定 复杂的软件中,结构设计指导方针对程序进行结构性平衡,从而实现指导方式在较低层次上实现程序的和谐统一,要采用的编程约定、约定说明一定要写得非常详尽。本书提供了许多非常详细的约定。 大型系统的完美之处便是它的每一个细节都体现了它的结构设计风格,在给变量和子程序命名、进行格式约定和注释约定三.软件设计的先决条件 检
11、查表 和需求跟踪矩阵一样,在设计之前也要为设计列出一个检查表,供设计完成时功能检查时使用。三.软件设计的先决条件 小结 问题定义 需求分析 结构设计 语言选择 编程约定 检查表四.建立子程序步骤 步骤概述 设计程序 检查设计 子程序编码 检查代码检查设计检查设计编写程序编写程序设计程序设计程序检查代码检查代码开始开始结束结束四.建立子程序步骤 PDL语言 PDL 是在模仿自然语法表达思想 用模拟自然的语句来精确描述每一个特定操作 在稍高层次上设计,然后转成注释,补充代码一个例子Keep track of current number of resource in use If another
12、resource is available Allocate a dialog box structure If a dialog box structure could be allocated Note that one more resource is in use Initialize the resource Store the resource number provided by the caller Endif Endif四.建立子程序步骤 编写子程序 检查先决条件 (问题定义,需求分析,结构设计, 语言选择,编程约定,检查表) 给子程序命名 (清楚的、不容易引起异义的名字)
13、考虑效率 (空间第一,效率第一) 选择算法和数据结构 编写PDL,并逐步细化 根据PDL编码,并将PDL转换成注释 收尾工作 (非正式检查代码,根据检查表进行检查) 编译运行 消除子程序中的错误四.建立子程序步骤 小结 设计程序 检查设计 子程序编码 检查代码五.高质量子程序特点 使用子程序原因 子程序名称恰当 强内聚性 低耦合性 子程序长度 防错处理 子程序参数 宏子程序 检查表五.高质量子程序特点 使用原因 特点: 分隔复杂操作,限制了改动带来的影响,隐含顺序,改进性能,隐含数据结构、变量,可重复利用,提高可读性,增强可移植性。 子程序是计算机科学最重大的发明.使代码非常好读,非常容易理解
14、,编程语言中的任何特性都不及这一点.最大的心理障碍是不情愿为了一个简单的目的而去编写一个简单的子程序五.高质量子程序特点 使用原因注意点: 开发一个程序族: 可将要改动的部分放进子程序中 将非标准语言函数进行封装: 不可移植部分,如硬件依赖,操作系统依赖 简化复杂的布尔测试: 将复杂的布尔测试放入子程序进行五.高质量子程序特点 名称恰当 较强的动词目标 如:_dbCreateFileBuffer 体现返回对象 如:_dbGetDomainZDB 避免模棱两可 如:dbDistribute;dbIO 描述所能做的一切 如:_dbReadTupleZDB 适当的长度,最佳为915个字符 建立用于通
15、用操作的约定 如:get、put 不要仅靠大小来区分 如:RxError Rxerror五.高质量子程序特点 强内聚性 功能内聚:执行一项且仅是一项,类似原子操作, 如:DynSync_CheckCPUStatus() 顺序内聚:顺序内聚性是指在子程序内包含需要按特定 顺序进行的、逐步分享数据而又不形成一个 完整功能的操作,如:TxDataSyncReq() 通讯内聚:子程序中,两个操作只使用相同数据,而不 存在其它任何联系,如RxCommBeginReq() 临时内聚:因为同时执行的原因,几个操作放入同一 子程序中,如:DynSync_init() 五.高质量子程序特点 强内聚性 内聚性是指
16、子程序中,各操作互相联系的紧密程度,功能越专,内部操作关系越紧越好不建议的内聚形式 过程内聚:子程序中的顺序操作使用的不是相同数据。特点是命名困难 逻辑内聚:子程序中含有几个操作,而其中操作又被传进来的控制标志选择, 如: getStatusType(result,typeid)五.高质量子程序特点 低耦合性 数据耦合:非结构化的参数传递,如sin() 结构耦合:结构化的数据参数 控制耦合:子程序通过传入另一子程序的参数 来通知它该作什么,往往和逻辑内聚 紧密联系 公共耦合:两个子程序使用同一全局数据 内容耦合:可以改变对方内部数据,如局部变 量. 五.高质量子程序特点 低耦合性 耦合性和内聚
17、性不同,是指子程序之间的联系程度。低耦合性可以使一个子程序中的错误影响到另一个子程序的机会减少不建议的耦合形式 内容耦合:会导致数据更改不可见 公共耦合:但可以对公共数据采取只读约定来 限制其弊端五.高质量子程序特点 程序长度 如果太长则说明应该进行简化,应当考虑再次进行分解成几个子程序完成 行数标准没有具体限定,因地制宜吧五.高质量子程序特点 防错处理 其思想核心是承认程序中都会产生问题,都要被改动。以这点为依据开发,使一个子程序被传入了错误输入,不至于被破坏功能 类似开车时,在心中要意识到其它驾驶员的行为都是不可预测的五.高质量子程序特点 防错处理使用断言 Assert():在假设不正确时
18、会提示系统错误, 对传入的指针、句柄、布尔变量、 变量值域、全局变量使用断言。 断言可以消除相互矛盾的假设,消除传入子程序的不良数值等。“输入垃圾,输出垃圾”是最糟糕的子程序,断言可以限制垃圾的输入五.高质量子程序特点 防错处理异常情况处理 一个程序有90是处理错误的,有效的使用Case、goto语句会事半功倍,增强结构感 . CASE GOTO EXCEPTION: CASE GOTO EXIT_FUNC: . EXCEPTION: . EXIT_FUNC: . RETURN;五.高质量子程序特点 防错处理条件编译 开发时使用预处理宏,进行编译和调试,在发布时去掉这些宏定义,但保留调试代码#
19、if defined(DEBUG) .#endif#if DEBUEGLEVEL_A#if defined( DEBUG)#define DebugCode( code fragment)code_fragment#else#define DebugCode(code fragment)#endif五.高质量子程序特点 防错处理其他一些防错机制 尽早使用调试工具进行调试 GDB,DBX,BoundsChecker ,softice 使用“防火墙”? 信息隐蔽,松散的耦合 检查函数返回值,输出的不应是垃圾 使用perror()五.高质量子程序特点 程序参数 按照输出修改输入的顺序排列参数 如果几
20、个子程序使用了相似的参数,应相同的顺序排列参数,如fprintf(),printf() 把状态和“错误”变量放在最后 不要把参教当作工作变量 写好参数的接口说明 如果输入参数以值传递的方式传递对象,则宜改用“const &” 五.高质量子程序特点 宏子程序 谨慎的使用宏子程序 如:#define product(a,b)a*b (x1,x2)会变为会变为 x+1*y+2 #define preduct ( a,b) (a)*(b) 如果宏程序过长使用斜线 #define LookupEntry (Key,Index ) Index=(key-10)/5; Index=min(Index,MAX
21、_INDEX); Index=max( Index,MIN_INDEX);五.高质量子程序特点 检查表总体问题 如果把程序中的某些部分独立成子程序会更好? 是否用了明晰清楚的动宾词组对过程进行命名? 是否是用返回值的描述来命名函数? 子程序的名称是否描述了它的所有功能? 子程序是不是只做一个事情,且是较强的功能内聚性? 子程序间是是否松散耦合? 子程序的长度是否它的功能和逻辑决定?五.高质量子程序特点 检查表参数传递问题 形式参数与实际参数匹配吗? 子程序中参数的排列合理吗?与相似子程序中的顺序一致吗? 接口是否进行了说明? 子程序中参数个数是不是7 个或者更少? 是否只传递了结构化变量中子程
22、序用得到的部分? 是否用到了每一个输入参数和输出参数? 是否在所有情况下它都会返回一个值?五.高质量子程序特点 检查表防错性编程 是否使用了断言? 子程序对于非法输入数据进行防护了吗? 子程序是否能很好地进行程序终止? 子程序是否能很好地处理全局变量修改情况? 是否不用很麻烦地启用或去掉调试帮助? 是否信息隐蔽、松散耦合,以及使用输出数据检查? 子程序是否检查返回值? 五.高质量子程序特点 小结 使用子程序原因 子程序名称恰当 强内聚性 低耦合性 子程序长度 防错处理 子程序参数 宏子程序 检查表六.模块化设计 模块化:内聚性与耦合性 信息隐蔽 建立模块的理由 检查表 模块是指可以提供一系列互
23、相联系功能的子程序集合,子程序之间不一定有公共的数据。可以组合,更换。使用单独一个子程序是很难达到这一目的的,这也正是引入模块的原因六.模块化设计 模块化 模块内聚性 一个模块提供一组相互联系的服务 如:静态资料同步,动态资料同步 模块耦合 模块提供一整套功能,并且彼此间留有清晰的接口进行联系 如:告警日志模块六.模块化设计 信息屏蔽一个模块应具备的四个要素 输入和输出 处理功能 内部数据 程序代码 内部数据,程序代码是应进行信息屏蔽,对外相当于黑盒。屏蔽要求较子程序更为严格,特别是内部数据六.模块化设计 信息屏蔽常见需要隐含的信息 容易被改动的区域 如:硬件依赖,规则 复杂的数据 复杂的逻辑
24、 在编程语言层次上的操作 如如:CurrentEmployee = EmployeeListEmployeeID + i; node = node.next; phone = node.data.phone 使用下画线来表示模块程序 如:_dbCreateFileBuffer() 六.模块化设计 建立的理由一些适合使用模块的域: 对硬件有依赖的区域 输入与输出 操作系统依赖部分 数据管理 可再使用的代码 可能发生变动的相互联系的操作六.模块化设计 小结 模块化:内聚性与耦合性 信息隐蔽 建立模块的理由 检查表 信息隐蔽是重要的。其结果是可以产生可靠的易于改进的系统,也是目前流行的设计方法的核心
25、。在结构化设计中,黑盒子思想便来源于信息隐蔽。在面向对象设计中,也是信息隐蔽引发了抽象化和封装化的设计思想七.高级结构设计 软件设计引论 结构化设计 面向对象 对目前流行设计方法的评论 往返设计 七.高级结构设计 设计引论设计的层次: 划分子系统:数据库接口、用户接口 划分模块:如数据存储、数据恢复 划分子程序:实现模块功能 子程序内部设计:把每个模块划分成各种功能七.高级结构设计 结构化设计自顶向下分解 特点是从关于程序功能的粗略说明出发,逐步推进到程序要做的每一项特定的工作,属于逐次迭代逼近的过程 需要把一个程序分解到什么程度呢?要持续不断地分解,直到看起来下一步进行编码要比再分解要容易为
26、止七.高级结构设计 结构化设计自底向上合成 自顶向下方法过于抽象,让人不知从何下手,“系统需要完成什么?”,如果认识清除,就识别出系统需要具备的较低层次的功能 利用这一问题识别出某些低层次功能。识别出这些低层次功能共同的方面,将其组合到一起。不断组合上升七.高级结构设计 结构化设计UlanWhisperArielTideJV BrandsMedia & Commercial ProductionModelModelModelSub systemSub systemSystem自顶向下: 总体功能难识别自下向上: 细节出发,无视大局 在第N次用自底向上方法学到的东西,将在第N+1 次用自顶向下方
27、法设计时起到很大帮助作用七.高级结构设计 面向对象 抽象:将相同的属性和方法概括出来 封装:数据连同函数捆绑实现信息隐藏 对象和类:描述属性和方法,又提供接口 模块化:根据接口,通过消息进行通讯 继承性:原对象加入新的属性和方法 多态性:虚函数,重载和覆盖实现多态性。七.高级结构设计 方法的评论 结构化设计强调功能但不强调数据,适用于具有许多互不作用的独立功能的小型系统 面向对象设计适合处理对象数据变动大,功能变化小,因为它将变动可能性较大的数据独立在目标(模块) “面向结构化的设计人员很难和面向对象的人沟通”,但信息隐藏是共同追求七.高级结构设计 往返设计好的设计: 低复杂性,维护的方便性,
28、易扩展, 可移植性,标准化 最终结果往往看起来是井井有条的,似 乎设计者从未犯过任何设计错误,其实不 然,需要很多的反复和推翻重建的过程, 善于总结,更多实践和经验积累。七.高级结构设计 小结 软件设计引论 结构化设计 面向对象 对目前流行设计方法的评论 往返设计 一个测试 _抽象数据类型 _文字型 _数组 _局部变量 _B 树 _查找表 _位图 _指针 _布尔变量 _队 _字符变量 _记录 _命名常量 _回溯 _双精度 _集合 _枚举流 _堆栈 _浮点 _字符串 _散列表 _结构化变量 _堆 _树 _索引 _联合 _整型 _数值链 _链表 _变体记录 所熟悉的词计1 分。知道但并确切计0.5
29、分一个测试0-14 分 你是个初级程序员,可能是计算机专业一年级的学生, 或者是一个正在自学第一种语言的自学者。15-19 分 你是个中级程序员或是个健忘的富有经验的程序员虽 然你对表中许多概念都已经很熟了,20-24 分 你是个专家级的程序员,你的书架上很可能已经插上很 多有关程序设计的书了。 25-29 分 关于数据结构,你知道的比作者还多!可以考虑写一本 你自己的专著(请别忘了送我一本)。 30-32 分 你是个自大的骗子。“枚举流”、“回溯”和“数值链”并不 是指数据结构的,是故意把它们加进去以增加难度的, 在继续之前,请先阅读关于智力诚实性的内容。八.生成数据 自定义数据类型的原因
30、自定义数据类型的准则 初始化数据的准则 八.生成数据 自定义数据类型 typedef int Boolean_t; typedef struct unsigned short type; unsigned short len; unsigned short pre; unsigned short scale; DESC;八.生成数据 自定义数据准则 建立具有面向功能名称的类型 不要对已定义类型重新定义 避免使用已定义类型 定义替换类型以增强移植性 使用其它类型来建立复杂的新类型八.生成数据 初始化数据准则 使用之前对其进行初始化 在使用变量的位置附近对其进行初始化 要特别注意计数器和累加器 在
31、程序开始初始化工作内存九.数据名称 选择名称 特定数据类型命名 命名约定 非正式命名约定 匈牙利命名约定 短名称 要避免的名称 九.数据名称 选择名称 变量名容易理解 如:x1,xx1,xxx1不容易理解 名字要面向问题 如:inputAge 较长的名字适于较常使用的变量或全局变量。 如:R_BSC_MODULE_MAX 较短的名字适于局部变量或循环变量 一致性可以改善可读性并简化维护 如:EV_DYNSYNC_REQ , EV_DYNSYNC_ACK , 使用强意的反义词,如:add/remove,min/max九.数据名称 特定类型命名 循环变量命名: 避免使用简单容易歧义,使用含义明确
32、如:LoopI 或或 RecordCount 状态变量名尽量使用枚举,或是宏定义: 如:enum PROCESSSTATUS_E P_RUNNING,P_READY,P_BLOCKED 临时变量命名: 表示是“什么”临时变量: 如tmp_age 逻辑变量命名: 如Done、IsError、NotFound 枚举类型命名: 使用相同的前缀或后缀表示同一类型 常量命名: 大写,抽象的实体 如 MAX_CONUTS九.数据名称 命名约定 当同时有几个程序员从事一个项目时。 计划把程序交给另一个程序员进行修改和维护时(这时命名约定是必不可少的)。 当你的程序将由其它程序员来评审时。 当程序规模过大,需
33、要按部分来考虑它时。 当一个项目中要频繁使用某些不常见的词汇,而又要开始编码时。九.数据名称 非正式命名约定 标识全局变量:如 g_ThreadProecessStatus 标识模块变量:如 m_SyncStatus 标识常量: 如 PI_C 标识枚举类型: 如 PROCESSSTATUS_E 标识输入输出参数:如 in_Value,out_Value 名字格式化: 如 Blocked_Process_ID 习惯名称:如 *p, str_九.数据名称 匈牙利命名约定 基本类型 wn 窗口 scr 屏幕区 fon 字体 ch 字符 pa 段落 九.数据名称 匈牙利命名约定 前缀 a 数组 c 数
34、目(如记录、字符个数等) e 数组的元素 g 全局变量 h 处理 i 数组下标 m 模块层次上的变量 p(lp,np) 指针(长指针、近指针)九.数据名称 匈牙利命名约定 限定记号限定词 含义 Min 数组或其它表中绝对的第一个元素 First 数组中需要进行处理的第一个元素。Last 一个数组中需要最后进行处理的元素。Lim 在一个数组中需要处理的元素上界。 通常Lim等于Last 加1 Max 指的是数组或表列中的最后一个元素九.数据名称 匈牙利命名约定匈牙利名称举例ch 字符变量achDelete 要删去的一个字符数组ich 字符数组的下标ichMin 字符数组中绝对第一个元素的下标ic
35、hFirst 字符数组中第一个需要进行某种操作的元素的下标echDelete 字符数组中产生的某一元素,pachInsert 要插入字符数组中的指针ppach 指向某一字符数组指针的指针cchInser 要插入字符的数量cscrMenu 用作菜单屏幕区的数量hscrMenu 对用作菜单屏幕区的操作mhserUserInput 用户输入屏幕区的模块层次上的操作ghscrMessages 为获得信息而对屏幕区进行的全局操作九.数据名称 匈牙利命名约定匈牙利约定优点 匈牙利约定可以使得在命名中容易产生定义的区域和含义变得准确清楚。特别是约定中对First,Min,Last,Max和和Lim的准确区分
36、在实际中是尤其有帮助的九.数据名称 匈牙利命名约定匈牙利约定缺点 忽视了用抽象数据类型作为基本类型。它们以程序语言中整型、长整型、浮点数和字符串为基础来建立基本类型,使抽象类型命名困难 另一个问题是它把数据的意义与其表现联系在一起。比如,说明某一变量是整型的,把它改为长整型的时,不得不改动这一变量的名称。九.数据名称 短名称常用规则 使用标准的缩写(常用缩写)。 去掉所有的非大写元音字母(如Computer写成Cmptr,Screen写成Scrn,Integer写成Inter) 使用每个单词的头一个或头几个字母。 截掉每个单词头一至三个字母后面的其余字母 保留每个音节中最易引起注意的发音部分
37、缩写应保持一致性,保持风格九.数据名称 小结 选择名称 特定数据类型命名 命名约定 非正式命名约定 匈牙利命名约定 短名称 要避免的名称 十.变量 作用域 持久性 何时赋值 数据结构与控制结构的关系 变量功能单一性 全局变量十.变量 作用域 尽可能减小作用域 方便性和可管理性 对某一变量的引用集中处理GetOldData(OldData, &NumOldData);GetNewData(NewData, &NumNewData);TtlOldData = Sum(OldData,NumOldData);TtlNewData = Sum(NewData,NumNewData); PrintOld
38、DataSummary(OldData,TtlOldData,NumO1dData);PirntNewDataSummary(NewData,TtlOldData,NumNewData);SaveOldDataSummary(TtlOldData,NumOldData);SaveNewDataSummary(TtlNewData,NumNewData);GetOldData(OldData, &NumOldData);TtlOldData = Sum(OldData, NumOldData);PrintOldDataSummary(OldData,TtlOldData,NumOldData);
39、SaveOldDataSummary (TtlOldDataNumOldData);.GetNewData(NewData, &NumNewData);TtlNewData = Sum(NewData, NumNewData);PrintNewDataSummary(NewData,TtlNewData,NumNewData);SaveNewDataSummary(TtlNewData, NumNewData );十.变量 持久性变量分配方式探究:从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量在栈上创建。在执行函数时,函
40、数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多十.变量 何时赋值越晚给变量赋值,代码的灵活性越大 TestID = 47; #define MAX_ID 47 . TestID = MAX_ID; TestID = GetMaxIDFromINI(); TestID = GetMaxIDFromUse
41、r();十.变量 数据结构与控制结构YesNoYesNo十.变量 变量功能单一性 使每一个变量只具有一个功能 避免具有隐含意义,如:CustomerID = -1 保证所有变量都被用到十.变量 全局变量 伴随全局变量的常见问题 对全局数据的疏忽改变十.变量 小结 作用域 持久性 何时赋值 数据结构与控制结构的关系 变量功能单一性 全局变量十一.基本数据类型 常数 整型数 浮点数 字符和字符串 逻辑变量 枚举类型 命名常量 数组 指针 十一.基本数据类型 整型 整型数类型 范围 有符号8位 -128到127 无符号8位 0到255 有符号16位 -32768到32767 无符号16位 0到655
42、35 有符号32位 -2,147,483,648到 2,147,483,647 无符号32位 0到4,294,967,295 十一.基本数据类型 字符串 将字符串的长度说明为CONSTANT+1 字符串变量定义后初始化为“0”一个例子 char *p = “world”; / 注意p指向常量字符串 p0 = X; / 编译器不能发现该错误 十一.基本数据类型 枚举类型class A const int SIZE = 100; / 企图在类声明中初始化constconst成员 int arraySIZE; / 错误,未知的SIZE;class A enum SIZE1 = 100, SIZE2
43、= 200; / 枚举常量 int array1SIZE1; int array2SIZE2; 枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,不能表示浮点数(PI=3.14159)。十一.基本数据类型 常量如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦? 程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么 在程序的很多地方输入同样的数字或字符串,难保不发生书写错误 如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错十一.基本数据类型 数组 确保数
44、组访问没有越界 危害最大的错误 注意边界检查 最容易出错的地方 任何数组在定义时都应该赋初值 使用宏进行控制#define ARRAY_LENGTH(x)(sizeof(x)sizeof(x0)int array5 = 0,1,2,3,4;for ( I = 0;I =-EPSINON)&(x=EPSINON) 在等值比较时采用如下顺序,避免隐患 if (NULL = = p) 避免 if (p = NULL) if (MAXID = = x) 避免 if (x = MAXID)十四.条件语句 case 语句 Switch/case要较if/else简明,但是功能没有if/else丰富 每个c
45、ase语句的结尾不要忘了加break 不要忘记最后那个default:break分支。即使程序真的不需要default处理,也应该保留语句 十五.循环语句 确保循环能终止,不在循环内部改变循环变量;注意边界检查 要用有意义的变量名使得循环嵌套易读 如:for(I=0;Itotalnum;I+) 慎用break和continue,特别是循环超过3层,会导致逻辑难理解,若这些语句出现多了,就表明该循环若用许多小循环替代可能更好for ( row=0; row100; row+) for ( col=0; col5; col+ ) sum = sum + arowcol; 十五.循环语句 在多重循环
46、中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数for ( col=0; col5; col+ ) for ( row=0; row100; row+) sum = sum + arowcol; 十五.循环语句 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。如: for (i=0; iN; i+) if (condition) DoSomething(); else DoOtherthing(); if (condition) for (i=0; iN; i+) DoSomething();else for (i=0;
47、i0:找到的名字相同的进程数。找到的名字相同的进程数。*/十九.文档 小结 外部文档 编程风格文档(源代码) 有关注释 注释方法 二十.编程工具 设计工具 源代码工具 执行代码工具 面向工具的环境 建立自己的编程工具 理想编程环境 二十.编程工具 设计工具 现在的设计工具主要包含图形工具图形设计工具通常都会用普通的图形来表示出一种设计,如分层图,分层输入输出图、组织关系图、结构设计图、模块图等 如:ClearCase、PowerDesign、Project、 Mindmap、Visio、Together二十.编程工具 源代码工具 多文件字符串转换程序 UltrerEdit 文件比较程序 Mer
48、ge 源代码美化程序 SourceStyle 分析代码 PCLint 源代码管理工具 CVS VSS二十.编程工具 执行代码工具 编译器 gcc、xlC 、BC、DevC+ 代码库 GiST C+ Lib,STL,GNU/Linux 代码生成程序 C有这样的工具么? 调试器 gdb,dbx,Xmanager,VC 逆向工程 IDA、SoftIce二十.编程工具 工具的环境 Unix SUSE Linux RedHat Linux Solaris Dev C+ VC BC二十.编程工具 自建编程工具 建立自己的编程工具 ?二十.编程工具 理想编程环境 集成环境 语言主持 具体的交叉参考 用查询方
49、式观察程序组织结构 交互式格式化 性能调整二十.编程工具 小结 设计工具 源代码工具 执行代码工具 面向工具的环境 建立自己的编程工具 理想编程环境二一.项目管理 项目大小 项目大小对开发活动的影响 项目大小对错误的影响 项目大小对生产效率的影响二一.项目管理 项目大小 程序长度 程序员人数百分比 2k510 2k16k510 16k64k1020 64k512k3040 512k3040二一.项目管理 项目大小CMM中关于项目估算方法: 主要使用历史项目管理积累沉淀数据 大量依靠成熟的评估技术 针对工作量、成本、时间估算进行估算二一.项目管理 对开发的影响 随着项目的扩大,成员沟通联系的复杂
50、程度会成级数上涨,必须要通过统一的规则和接口进行联系 二一.项目管理 对开发的影响 在处理大型的项目时,CMM提供的是各类的文档,文档是CMM里项目管理的主题需求开发需求开发概要设计概要设计详细设计详细设计编码编码单元测试单元测试集成测试集成测试系统测试系统测试系统设计系统设计验收测试验收测试二一.项目管理 对开发的影响 项目中各种活动的比例变化趋势02040608010012012345系统测试集成测试单元测试单元测试详细设计详细设计编码调试编码调试系统设计二一.项目管理 对开发的影响项目的扩大会导致下面的活动复杂度增加计划管理交流需求开发系统功能设计接口设计和描述总体结构综合错误消除系统测
51、试文档生成二一.项目管理 对开发的影响 用户自行开发的单一“程序” 不仅自己使用,别人也使用的“产品” 要求一群程序员相互协作进行开发,从而实现的“系统” 加装产品外壳(用户界面),并将系统各部分综合起来的“系统产品”“系统产品”所费代价是“程序”的9倍!二一.项目管理 对错误的影响02040608010012345系统分析系统分析编码实现编码实现详细设计详细设计 随着系统的增大各个设计过程出现错误的概率变化二一.项目管理 对效率的影响 项目大小 每日代码行数 小于2k333-2000 2k16k 200-1250 16k-64k 125-1000 64k-512k 67-500 512k或更
52、多或更多 36-250 人员的素质、编程语言、方法、产品复杂性、编程环境、工具支持和其它许多因素都决定效率二一.项目管理 小结 项目大小 项目大小对开发活动的影响 项目大小对错误的影响 项目大小对生产效率的影响二二.创建管理 使用好的代码 配置管理 评估创建计划 度量 程序员视为普通人 如何对待管理 二二.创建管理 使用好的代码 将二人分在计划的每一部分 多人注释 程序员和至少两个其他注释者 代码许可 代码由管理工程师批准和鉴署 引用好的注释作示例 强调代码表是公用财产 同行评审,代码走查 CMM二二.创建管理 配置管理 配置管理是全面地处理各种变化,以便系统随着时间的推移能保证其完整性。 如
53、果不控制设计上的修改 代码和设计的大相径庭,代码不兼容。这时大多恰恰都是最关键的时刻 如果不控制代码的修改 同时更改,会付出更多的测试量 并且没人知道这是怎么回事?!二二.创建管理 配置管理 遵循正规修改控制流程 建立修改控制委员会 版本控制软件 备份计划二二.创建管理 评估创建计划 使用进度软件 使用估计模型 使用外面其它的专家评估 举行预评估会议 评估项目的每一部分,然后再集成这些评估 让人们评估自己的那部分,再进行集成评估 评估完成整个项目所需时间,然后将时间细分到项目的每一部分 参考以前项目的评估二二.创建管理 度量 “度量”这个词指的是和软件开发有关的衡量。代码行数、错误数、每千行代
54、码错误、每个模块的错误、全局变量的数目、完成项目所需的时间等度量任务。二二.创建管理 其他 程序员的时间 个人能力差别 组间差别 个人风格二三.软件质量 软件质量特点 提高软件质量的方法 各种方法的效果 何时应作质量保证 软件质量的一般原则二三.软件质量 软件质量特点 可维护性 修改一个软件系统,提高其性能或修正其错误的能力 灵活性 修改系统使其能适应于不同的用途或环境的能力,而不必对系统进行特定的设计和改造 可移植性 能修改所设计的某一系统使其能在其它环境下运行 可重用性 能将系统的一部分用于其它系统的难易程度 可测试性 对整个系统进行单元或系统测试以证实其满足所有需求性能的测试难易程度 可
55、理解性 能从整个系统水平或细节说明这一级上理解整个系统的难易程度二三.软件质量 提高质量方法 明确质量管理目标 确定质量保证活动 测试策略 软件工程约定准则 技术检查 修改控制过程二三.软件质量 各方法的效果 对设计文件的人工检查 35非正式组内设计检查 40正式设计检查 55正式代码检查 60模型或原型 65人工代码检查 40单元测试(单个子程序) 25功能测试(相关于程序) 35系统测试(整个系统) 45段测试(动态数据) 50二三.软件质量 一般原则质量管理的几个方面: 对系统关键部分的正式设计检查 使用快速原型化技术进行模块化或原型化 代码阅读或检查 运行测试二三.评审 评审在软件质量
56、保证中的地位 检查 其它评审方法二三.评审 保证中的地位 “评审”是检查、初查、代码阅读以及别人查看你的工作的其它方法的总称。 减少错误代价最小的活动 评审传活使用技巧和编程经验 评审质量和进度 对评审结果事例的评审过程令人难忘二三.软件质量 评审过程参与者 协调者,项目主持者,检查者,记录员 管理者评审过程 计划,总览,准备,检查会议,检查报告二三.软件质量 其他评审办法 普查 代码阅读 软件演示二五.测试 测试在软件质量中的作用 测试的一般方法 测试支持工具 提高测试质量 测试记录 二五.测试 测试的作用 测试是尽可能的发现错误和缺陷。 单元测试对单个子程序和模块而不是对整个系统的测试,根
57、据详细设计 集成测试对各个模块进行组装然后测试 根据概要设计 确认测试是检查功能,性能以及其他特征是否和用户的需求一致,根据需求规格书二五.单元测试 一般测试方法白盒测试白盒测试 黑盒测试黑盒测试 语句覆盖 等价划分 判定覆盖 边界分析 条件覆盖 错误猜测 路径覆盖 因果图 二五.测试 工具和提高 建立测试子程序,测试模块 进行回归测试,并记录测试过程以及结果二五.单元测试 测试记录 管理性描述 提交的数据、编写报告的人所修改的数据 对问题的充分描述 对问题的建议处理方法 相关错误 问题的严重性 致命错误,一般错误 错误分类 分析、设计、代码或测试错误 代码错误 边界、数组指针、子程序调用等错
58、误 所确定的错误位置 由修改所引起的模块和子程序错误 改正错误紧急程度和所需时间二五.测试 小结 测试在软件质量中的作用 测试的一般方法 测试支持工具 提高测试质量 测试记录 二六.调试 概述 找出错误 修改错误 调试心理因素 调试工具 二六.调试 概述 调试并不是提高软件质量的一种方法。只用于改正错误 从中对程序加深了解 从别人的角度了解代码质量 了解解决问题的方法二六.调试 找出错误 错误发现 通过不同的方式再生错误,随机错误通常是未初始化或指针出错 生成更多的数据产生更多的假设 缩小可疑代码区域 定位错误 通过调试定位错误的入口处 编译信息不一定准,信息里的错误定位不一定准二六.调试 修
59、改错误 理解错误本质 理解上下游的程序 确诊错误 保存初始源代码 关键处进行中间结果输出 修改错误问题,而不是症状,真正的理解是重要的,拿不准,多和同事证实二六.调试 调试心理因素思维定式 Num/Number errno/errn0 While,for,switch 的条件不一定满足 隐形的强制类型转换 良好编程习惯、好的格式、注释、变量名、子程序名以及其它编程风格,有助于建立编程背景,这样出错概率才能降低二六.调试 调试工具 源代码比较程序 编译警告错误 扩展语法和逻辑检查 单步调试程序 应最大程度利用调试工具。还要好好动脑筋二六.调试 小结 概述 找出错误 修改错误 调试心理因素 调试工
60、具 二七.系统集成 集成方法重要性 分段与递增集成 递增集成法 改进的公布法二七.系统集成 集成的重要性 集成是指一个软件开发过程,在这个过程中你要把各个分离的软件部分合并成一个统一系统 一个例子:足球体育馆的坍塌 所以不能用错误的顺序集成软件,系统编码、测试、调试就不可取。如果只有等到整个系统要上线时,才拼装各部分。这个系统可能永远也不能完成。 完成单元检测和系统连接测试后才能集成二七.系统集成 分段递增集成 分段集成 不必考虑工程中各部分建立的先后顺序。所有部分在同一时间里被集成的所以你可以按照任何一个次序建立他们, 适合小型软件 递增集成 建立小的骨架,不断的添肉,不断的测试,在此基础上
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 加气砼条板安装施工方案
- 商铺管疏通方案范本
- 道路钢板安装方案范本
- 供应肉菜配送方案范本
- 扶贫施工方案
- 投现场勘察方案范本
- 边坡踏步板砌筑施工方案
- 规范发言稿制作指南
- 运动会的主持词(34篇)
- 《汽车构造》习题及答案 项目二十一任务21测试题
- 教育局中小学阅读推广方案
- 水务集团招聘考试笔试试题及答案
- 亮氨酸课件教学课件
- 2025年及未来5年中国DHA行业市场运营现状及投资规划研究建议报告
- 企业内部控制风险评估报告范本
- 五年(2021-2025)高考地理真题分类汇编:专题03 地球上的大气(全国)(解析版)
- 历年通信工程概预算考试试题与答案
- 航运国际合作机制创新-洞察及研究
- 《老年服务礼仪与沟通技巧》全套教学课件
- 2024年安徽省高级人民法院岗位招聘笔试真题
- 药品追溯管理培训试题(附答案)
评论
0/150
提交评论