代码大全读书笔记(二)

第三部分:变量

      数据通常也指对象和内置数据类型等。在程序中,数据以变量的形式表示。明确定义变量,初始化变量是遵循一定的变量初始化原则;保证变量的作用域尽可能小;缩短变量的生存时间;尽量使得每个变量具有单一用途,以防造成变量的误用。

      良好的变量名应当能够准确反应出程序的意义,帮助代码阅读者准确快速的理解代码含义。变量的名字应当指代的是“什么”而非“如何”;适当的名字长度也是衡量一个变量名好坏的关键;变量的作用域也对变量名的长度存在一定的影响,通常对于全局变量可以采用特定的限定词加以说明。对于用于计算的变量,可以在其名字中加以说明,如:sum, total average, max ,min ,record 等。在协作开发中遵循一个组织或者是一个团队统一的命名规则通常是非常有必要的,另外对于我们一些在开发过程中形成的约定俗成的命名规则我们也应当在开发过程中尽量遵守。没有关于变量命名规则的金科玉律,但通过团队协商和一些约定可以更好的保证开发的效率。标准前缀提供了变量名一般意义下的好处,但同时也使得程序看起来更加紧凑,但标准前缀也容易使得程序员忽略取有意义的变量名,因此在使用时应当谨慎。如何采取适当的变量名缩写以定义可读性的短名字具有相当的技巧性和一些具有指导意义的原则如:缩写一致、创建能读出来的名字等。在变量命名中我们应当竭力避免那些毫无实际含义、相似名字、拼错单词的变量名,总而言之变量名字的含义应当与它所代表的实际含义密切相关最好能够做到见名知意。

      基本数据类型是程序中构建其他数据类型的基本块。基本数据的处理和使用在编码过程中也有许多需要注意的地方。例如使用整数需要检查溢出和检查除法;使用浮点数需要避免数量级相差较大的数之间的加减法,避免等量判断;使用字符串时也应该尽量避免使用神秘的字符和字符串。布尔变量和枚举类型的合理使用能够起到简化程序的作用,布尔变量可以简化条件语句中的判断条件,枚举类型能够提供关于一组同类对象的说明,在switch语句或是通过枚举类型来加强可修改性都具有相当的意义。使用常量可以保证在修改时可以只修改一处,通常常量可以用做循环界限等。使用数组时,应当保证所有的数组小标没有超出数组边界等边界条件。

      在程序中通过基本数据类型来构成的非基本数据类型也在程序中占有重要的地位。结构体作为十分常见的组合数据结构在开发中可以明确数据关系、简化对数据块的操作、简化参数列表等作用。指针作为在C语言中一个让人又爱又恨的数据类型具有高效,便捷的特点,但也极其容易出错,在使用指针之时有许多需要注意的地方,如使用之前先检查指针和指针所引用的变量等。全局数据准确的来说不能算是一种具体的数据类型,而是数据的作用域的一种特殊化,由于其具有全局的使用域,因此在使用时具有一些特需要指出的原则,全局数据破坏代码的可复用性,因此,我们应当尽量减少全局变量的使用,可以通过访问子程序来取代使用全局数据等方式来减少全局数据的使用。

 

第四部分:语句

      从语句的角度来考察编程,我们不难发现语句是组成程序的基本单元,语句的组织形式直接关系到代码的质量和可读性。

      直线型代码是程序中最常见到代码形式之一。在组织这种代码时我们通常应该注意对于相关语句尽量组织在一起,使代码之间的依赖关系在语句的组织形式上就能明确的看出来;对于无相关语句之间的组织可以以方便代码阅读为准则来组织。条件语句包括if、else、switch等语句,这些语句一个典型的特点是需要根据条件来决定程序下一步执行的语句。对于条件语句串的组织,不仅仅是关系到程序的可读性而且还关系到程序排错的难易程度。使用条件语句时,可以遵循以下几个原则:1. 使条件为有意义的语句 2. 把最常见的条件放在最前面,从某种程度上来说这样可以提高程序的性能 3. 使用条件语句时还应该考虑是否考虑到了所有的情况,注意条件边界。Case语句使用时应当注意处理好程序产生的错误问题。

      在程序中通常存在着三种循环种类:for, while, do-while。使用循环通常是程序中最为复杂的控制部分,在需要使用循环时,我们还应当谨慎的选择循环的种类如选择while循环还是do-while循环;使用带退出的循环还是使用不带退出的循环;何时使用for循环何时使用foreach等问题。控制循环通常指控制循环的进入和循环的推出,进入循环时通常有着以下几个指导原则:1. 只从一个位置进入循环 2. 将初始化代码紧放在循环代码之前;3. 通常使用while来表示无限循环4. 尽量多使用for循环,但请分清楚具体使用代码环境。循环体中的代码应当保持整体性,通常可以用{}组织在一块。退出循环分为两种情况:一种是正常推迟,一种是非正常退出。循环退出主要问题是在处理循环结尾,为了能正确处理循环结尾通常在编码时我们应该保证循环能终止,并且使循环终止条件看起来明显,不要为了终止循环而改动for循环的下标。Break, continue, return是三种非正常退出循环体的常用语句,在使用非正常退出时一定要检查非正常退出的条件是否正确,对于散布着很多break语句的循环语句,需要小心。检查一个循环体我们通常只需要检查循环体的两端和中间,但对于存在break语句的循环体来说会存在多个端点,在检查时需要进行额外的检查工作。使用有意义的循环变量名,可以提高循环代码的可读性,对于多层次的循环嵌套更有意义,循环下标的作用域应该限制在本循环体内。循环的嵌套层次通常不应该超过三层,可以通过由内而外的方法来创建循环体。

      程序中除了顺序、条件、循环三种常见的数据结构还存在着一些不常见到控制结构如子程序的多处返回、递归、goto语句等。对于子程序尽量使用return语句正常返回,使用防卫语句来简化复杂的错误处理。使用递归时需要保证递归能够停止防止出现无穷递归,将递归限制在一个子程序内,避免使用递归去计算乘法,如斐波拉契数列。关于goto语句的辩论已经存在了很久,尽管没有准确一致的说法,需要明确的一点是过多的使用goto语句使得程序的结构复杂难懂,为了程序的可读性应当尽量少的使用goto语句除非有迫切的性能需要等具体特殊的应用需求。

      表驱动法是一种编程模式通过使用从表中查找而非使用逻辑语句来控制。使用表驱动法通常能够节省时间但可能会比使用逻辑语句需要额外的空间。同时使用表时还可以根据具体情况来选择是使用直接访问表、访问索引表还是阶梯访问表。对于程序的一般控制性问题,我们还需要注意几个问题,如选用布尔表达式做判断时应尽量减少表达式的长度,尽量使用肯定形式的表达式;使用括号来使表达式更加清晰;按照数轴顺序写布尔表达式等。对于多层嵌套还应该尽量对其做简化。准确的掌握估算代码复杂度的方法和复杂度的概念,通过复杂度来检查代码,以尽量减低代码复杂度为目的能够有效提高代码

第五部分:代码改善

      代码改善通常指的是在编码过程基本结束之后,对代码进行的一系列的如修改、调试以及测试等工作,还可以包含代码的重构。改善代码之前必须明白衡量软件质量的一些特性,通常软件特性可分为内在特性和外在特性两种表现形式。外在特性通常表现为正确性、可用性、效率、可靠性、健壮性等;内在特性通常表现为可维护性、可移植性、可重用性、可测试性等。改善代码可以在整个软件生命周期中进行,不同阶段的不同的质量保障技术具有不同的相对效能。质量保证技术的效能有一定的衡量指标如缺陷检测率、发现缺陷成本、修正缺陷成本等。质量保证工作应当贯穿于整个开发过程中,需要记住的一点是错误发现的越晚,修正所付出的代价越大。

      “协同构建”包括结对编程、正式检查、非正式复查、文档阅读以及其他让开发人员共同承担创建代码以及其他工作产品责任的技术。“协同构建”可以作为其他治疗保证技术的补充也可以帮助公司传授文化和编程经验。“结对编程”简单来说指的是两人共同编写一段代码,需要遵循几点原则来保证,“结对编程“能取得成功,这些原则包括:用编码规范来支持结对编程;不要让结对编程变成旁观;鼓励双方跟上对方的步伐;避免新手组合等。正式检查作为一种特殊的检查在质量保证技术中占有重要的地位,详查的一般步骤:1. 计划 2. 准备 3. 详查会议 4. 详查报告 5. 返工 6. 跟进。除了详查和“结对编程”协同开发中还包括走查、代码阅读和公开演示等技术。

      测试作为最常见的改善质量的活动,通常包括单元测试、组件测试和集成测试以及回归测试和系统测试。测试的目的应该是尽可能多的发现错误,因此测试的前提应该是假设代码中存在错误。推荐的测试方法有对每项相关需求进行测试,对每个相关设计关注点进行测试;通过基础测试来扩充针对需求和详细设计的测试用例。使用检查表记录所犯错误。可以用代码覆盖率和路径覆盖率来衡量测试的完整度;测试时要多用边界值;测试用例可以采用等价类来划分,使用等价划分可以减少测试用例的数量。几类好数据在测试时应当优先选择:1. 正常的情形 2. 最大正常局面3. 最小正常局面 4. 与旧数据的兼容性。测试时需要明白80%的错误是由20%的代码所引起的,因此测试时应当集中测试那些易于出错的代码。测试时需要考虑由于测试代码引入的错误,这样的错误应当尽量避免,会造成不必要的修改。测试时还可能需要引入一些测试用的“脚手架”程序,构建“脚手架”的程序应当同正式代码一样保证质量。通常为了改善测试过程还需要采用回归测试自动化测试等措施。测试记录在测试过程中应当予以清晰的记录。

      调式指确定错误的根本原因并纠正错误的过程。这点应该同测试相区别,前者是发现错误,而后者是修改错误。一些习惯性的调试方法会阻碍调试的进行如:凭猜测找缺陷;将时间浪费在理解问题上;用最简洁直观的方法修正错误。修正错误时应当先理解问题,理解程序本身而不仅仅是问题,同时对问题的分析进行验证,解决问题时应当治本修改代码时应当一次只做一个改动,改动过后应当进行检查。正确的运用调试工具可以提高调试速度和效率。

      在不改变软件外部行为的前提下对其内部结构进行调整,使代码容易理解并便于修改。之所以进行重构主要是因为代码中会存在着代码重复、冗长的子程序、多层嵌套循环等难以理解或者是不利于维护的代码片段。按照重构的不同层级重构可以分为:1. 数据级的重构 2. 语句级的重构3. 子程序级的重构 4. 类实现的重构 5. 类接口的重构 6. 系统级的重构 。为了保证重构的安全进行可以采取几种保障措施保存初始代码、重构步伐控制较小规模、一次只进行一项重构等。

      代码调整主要是针对程序性能的问题对代码所进行的相关的修改。对于系统性能通常在两个方面考虑即策略上和技术上。对性能的考察和设计可以追溯到程序需求中去,系统性能还同程序设计以及代码编译和硬件性能等因素密切相关。代码调整可以用pareto 法则进行指导即80%的性能问题是由20%的代码引起的。因此如何寻找影响系统性能的关键代码是代码调整中的关键任务,调整代码性能应当以保障程序运行正确为前提。代码调整过程是一个反复进行的过程,对性能的准确测量可以方便的对代码调整的效果进行评估对下一次代码调整进行指导。代码调整技术中是不存在通用的技术,但可以遵循一些大体的原则,在逻辑判断中可以巧妙的运用短路原理在知道答案后停止判断;按照出现频率来调整条件语句的顺序;使用表驱动来设计复杂的表达式;惰性求值在一定程度上也可以提高性能。对于循环通过减少循环体内的内容可以提高效率还可以将最忙的循环放置在循环最内层;减少浮点数的使用也可以提高性能;在需要使用运算时尽可能的消减运算强度。用低级程序语言重写代码在某种程度上也可以提高系统性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值