《构建之法》阅读笔记3

 第4章 两人合作 阅读笔记


 代码规范

       计算机只关心编译生成的机器码,你的程序采用哪种缩进风格,变量名有无统一的规范等,与机器码的执行无关。但是,做一个有商业价值的项目,或者在团队里工作,代码规范相当重要。“代码规范”可以分成两个部分:

       1. 代码风格规范。主要是文字上的规定,看似表面文章,实际上非常重要。

       2. 代码设计规范。牵涉到程序设计、模块之间的关系、设计模式等方方面面的通用原则。


 代码风格规范

       缩进  4个空格

       行宽  100字符

       括号  在复杂的条件表达式中,用括号清楚地表示逻辑优先级。

       断行  与空白的{ }行  每个“{”和“}”都独占一行

       分行   不要把多条语句放在一行上。更严格地说,不要把多个变量定义在一行上。

       命名  匈牙利命名法

       下划线   下划线用来分隔变量名字中的作用域标注和变量的语义

       大小写   由多个单词组成的变量名,如果全部都是小写,很不易读,一个简单的解决方案就是用大小写区分它们。

       注释   注释是为了解释程序做什么(What),为什么这样做(Why),以及要特别注意的地方。


 代码设计规范

        函数     现代程序设计语言中的绝大部分功能,都在程序的函数(Function、Method)中实现。关于函数,最重要的原则是:只做一件事,并且要做好。

        goto     函数最好有单一的出口,为了达到这一目的,可以使用goto。

        错误处理     参数处理在Debug版本中,所有的参数都要验证其正确性。在正式版本中,对从外部(用户或别的模块)传递过来的参数,要验证其正确性。

               如何处理C++中的类    

        注意,除了关于异常(Exception)的部分,大部分其他原则对C#也适用。

              1. 类

       1)使用类来封装面向对象的概念和多态(Poly-morphism)。

       2)避免传递类型实体的值,应该用指针传递。换句话说,对于简单的数据类型,没有必要用类来实现。

       3)对于有显式的构造和析构函数的类,不要建立全局的实体,因为你不知道它们在何时创建和消除。

       4)仅在必要时,才使用“类”。

              2. class vs. struct如果只是数据的封装,用struct即可。

              3. 公共/保护/私有成员(public、protected和private)按照这样的次序来说明类中的成员:public、pro-tected、private。

              4. 数据成员
       1)数据类型的成员用m_name说明。
       2)不要使用公共的数据成员,要用inline访问函数,这样可兼顾封装和效率。
              5. 虚函数(Virtual Function)
       1)使用虚函数来实现多态(Polymorphism)。
       2)仅在很有必要时,才使用虚函数。
       3)如果一个类型要实现多态,在基类(Base Class)中的析构函数应该是虚函数。
              6. 构造函数(Constructors)
       1)不要在构造函数中做复杂的操作,简单初始化所有数据成员即可。
       2)构造函数不应该返回错误(事实上也无法返回)。把可能出错的操作放到HrInit()或FInit()中。

               7. 析构函数(Destructor)

       1)把所有的清理工作都放在析构函数中为0或NULL。

       2)析构函数也不应该出错。

              8. new和delete

       1)如果可能,实现自己的new/delete,可以包装系统提供的new/delete。

       2)检查new的返回值。new不一定都成功。

       3)释放指针时不用检查NULL。

              9. 运算符(Operators)

       1)在理想状态下,我们定义的类不需要自定义操作符。

       2)运算符不要做标准语义之外的任何动作。

       3)运算符的实现必须非常有效率,如果有复杂的操作,应定义一个单独的函数。

       4)当你拿不定主意的时候,用成员函数 ,不要用运算符。

              10. 异常(Exceptions)

       1)异常是在“异乎寻常”的情况下出现的作为逻辑控制来处理程序的主要流程。

       2)了解异常及处理异常的花销,在C++语言中,这是不可忽视的开销。

       3)当使用异常时,要注意在什么地方清理数据。

       4)异常不能跨过DLL或进程的边界来传递信息,所以异常不是万能的。

              11. 类型继承(Class Inheritance)
       1)仅在必要时,才使用类型继承。
       2)用const标注只读的参数(参数指向
的数据是只读的,而不是参数本身)。

       3)用const标注不改变数据的函数。


 代码复审


 结对编程

        在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的那一位。这样,程序中的错误就会少得多,程序的初始质量会高很多,这样会省下很多以后修改、测试的时间。具体地说,结对编程有如下的好处:

        1. 在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作解决问题的能力更强。

        2. 对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
        3. 在企业管理层次上,结对能更有效地交流,相互学习和传递经验,分享知识,能更好地应对人员流动。
        总之,如果运用得当,结对编程可以取得更高的投入产出比(Return of Investment)

原文地址:https://www.cnblogs.com/ning-JML/p/5528360.html