2014 December 25 读书笔记
《代码大全》读书笔记
- 在有必须执行顺序的函数中,可以通过函数的输入输出参数来显示出依赖关系,不要出现大量无参数,且有关联的函数p349
- 在使用条件语句时,首先处理正常流程或者最常见流程,如果流程级别相同,可以按照字母顺序这样将来容易查找。
- 在子程序中提前return返回处理异常情况可以让代码可读性增强。——防御式编程?
- 使用表驱动法可以减少很多if的情况,把对应的键与值(甚至是结构描述)放入表中表可以是数组,map。 阶梯访问表可以处理有范围评级类似的情况,简化代码.
- 复杂的逻辑判断可以写成布尔判断函数。
- 如果出现空语句case中最好用个#define Donothing()明确表明,在while中出现空语句最好避免,显示的写出while的目的。
- 避免深层次的if嵌套,可以合并判断条件,增加逻辑复杂读方法,或者用if else来减少嵌套。复杂的代码表明没有充分的理解你的程序,所以无法简化它。
- 在面向对象的程序里,出现case语句,说明代码没有做好分解,因此实际上极少有必要使用case语句。最简单的,可以把一个case语句转变成一个使用多态方法调用的对象工厂。
- 如果一个子程序的决策点超过十个,那么这个子程序有必要重新设计。If,while,and,or,case每个都可以增加决策点.决策点是度量复杂度的一种方法,其他度量方法包括,所用的数据量,控制结构中的嵌套层数,代码行数,对同一变量的先后引用之间的代码行数,变量生成的代码行数(生命周期),以及输入和输出的量.
- 结构化编程的核心思想很简单,那就是一个应用程序应该只采用一些单入单出的控制结构.单入单出的控制结构就是指一个代码块它只能从一个位置开始执行,并且只能结束于一个位置,除此之外再无其他入口或者出口。一个结构化的程序将按照一种有趣且有规则的方法执行,不会做不可预知的随便挑传,你可以自上而下的方式阅读它,而它执行起来大体是遵循这个顺序的。结构化编程的中心论点是,任何一种控制流都可以有顺序选择和迭代这三种结构生成。在结构化编程出现之前使用goto,能够方便地控制应用程序流,但是那样写出的代码已被证明是难以理解并且不好维护的,我的观点是对于三种标准的结构化编程结构之外的任何控制结构的使用,也就是说使用Break,continue,return,throw Catch都要保持一种批判的态度。
- 类的接口应该展现一致的抽象层次。
- 让阅读代码并编写代码更方便。
- 要格外警惕从语义上破坏封装性。当你发现自己是通过查看类的内部实现来得知该如何使用这个类的时候,你就不是在针对接口编程了,而是在透过接口,针对内部实现编程了。如果仅仅根据类的接口文档还是无法得知如何使用一个类的话,正确的做法不是拉出这个类的源代码,从中查看其内部实现,而是联系其作者,让其修改类的接口。
- 警惕超过有七个数据成员的类。研究表明人们在做其他事情时能够记住的离散项目的个数是7±2。如果一个类包含有超过约七个数据成员,请考虑要不要把它分解为几个更小的类。如果数据成员都是整形或者字符串这种简单的数据类型,你可以按七加减二的上限来考虑,反之如果数据成员都是复杂对象的话,就应该按七加减二的下限来考虑了。
- 如果没国内并未设计为可被继承就应该把他的成员函数定义成非虚,或者final.
- 派生类必须能够通过基类的接口而被使用,而使用者无需了解两者之间的差异。换句话说对于基类中定义的所有子程序,用在它的任何一个派生类时的含义应该是相同的。
- 尽可能让接口可编程而不是表达语意。——通过函数的参数个数,参数类型来强制用户输入“想要的参数”,不要让用户去猜想该函数到底干了什么,输入输出是什么。
- 避免把私用的实现细节放入类的接口中。然而包括C++在内的 一些流行编程语言却从语言结构上,要求程序员在类的接中透露实现细节,例如把Private段的声明放到类的头文件中,看上去似乎只是小小的违背了原则,但他实际是在鼓励程序员查看实现细节,解决这个问题的一个惯用技法是,merers建议把类的接口与类地实现隔离开,并在类的声明中包含一个指针,让该指针指向类的实现但不能包含其他实现细节。
- 阅读代码的次数要比编写代码多得多,不要为了程序书写时调用方便,就把某个子程序抽象为接口。
- 让类中子程序的数量尽可能少。减少类所调用的不同子程序的数量。对其他类的子程序间接调用要尽可能少,例如a.b.c(),必须避免。
- 创建类的理由有,为现实世界中的对象建模,降低复杂度,隔离复杂度,隐藏实现细节,限制变动的影响范围(容易变动的部分有硬件依赖性,输入输出,复杂数据类型,业务逻辑等),让参数传递更顺畅,建立中心控制点,让代码更易于重用,把相关操作包装到一起(比如三角函数统计函数)。
- 子程序命名避免使用无意义的,模糊,或表述不清的动词。例如Handle calculation(),Performservice(),Processinput(),Dealwithoutput()等,这样的子程序名字根本不能说明子程序是做什么的,最多就是告诉你这些子程序所做的事情与计算,服务,输入,输出有关。
- 子程序的参数应该按照输入修改输出的顺序排列,这种排列方法暗含了资中心内部操作所发生的顺序,先是输入数据,然后修改数据最后输出结果。
- 把子程序的参数个数,限制在大约七个以内。对于人的理解力来说,七是一个神奇的数字,心理学研究表明,通常人类很难同时记住超过七个单位的信息。
- 为子程序传递用以维持期接口抽象的变量或对象。关于如何把对象的成员传给子程序这一问题存在两种互不相让的观点,是只传递特定几个数据还是传递整个对象。如果子程序需要的数据只是碰巧是一个对象提供的,那么就应该单独传递。要关注的是程序表达何种抽象,两种方法并没有绝对的好坏。对于维护接口的稳定性与保持封装性要平衡考虑。