第三次读书笔记——《代码大全》(续)

什么是封装和抽象?抽象是说:“可以让你从高层的细节来看待一个对象。”而封装则说:“除此之外,你不能看到对象的任何其他细节层次。”封装帮助你管理复杂度的方法是不让你看到那些复杂度。当继承能简化设计时就继承。信息隐藏是减少重复工作的强大技术。它强调隐藏复杂度。对系统的非重大改动可能会影响到某个类中的几个子程序,但它们不应该波及到接口外面。类的接口应该尽可能地少暴露其内部工作机制。封装和抽象是面向对象编程的一个很重要的思想,工程和项目越大,其重要性就越凸显。
封装的一个比较重要的功能就是信息隐藏。信息隐藏说的两个秘密就是:一、隐藏复杂度,这样你就不用再去应付它,除非你要特别关注的时候,二、隐藏变化源,这样当变化发生时,其影响就能被限制在局部范围内。复杂度非根源包括复杂的数据类型、文件结构、布尔判断以及算法。信息隐藏要避免信息过度分散,在软件设计中,人机交互界面的设计要特别注意,最好将其统一到一个单独的类、包或者子系统中,还要避免循环以来,即两类程序互相调用,因为这将导致无法单独测试。
要养成一个自问的习惯:“我该隐藏些什么?”
来说说全局数据,全局数据会面临一些问题,其中一种是可能会同时有多个子程序在全局数据上执行操作,所以全局数据有时候要避免使用。
对优秀的设计师的一份研究表明,他们所共有的一项特指就是都有对变化的预期能力,要找出看起来容易变化的地方,把它分离出来,并隔离。在考虑状态变量时,要用枚举类型二不要用布尔变量。
之前在看java语言的时候看到松散耦合这个词,并不理解。这本书提到了一下,现在的理解就是使模块之间的连接关系尽可能的简单。一个很棒的比喻:让模块之间的关系像商业合作者一样彼此分离,而不是像连体婴儿那样紧密相连。衡量模块之间的耦合度可采用的标准有:规模:模块之间的连接数,越少越好。可见性:两个模块之间的连接的显著程度;灵活性:模块之间的连接是否容易改动。
耦合种类当中的语义上的耦合就是一个模块不仅使用了另一模块的语法元素,而且还使用了有关那个模块内部工作细节的语义知识。语义上的耦合是非常危险的,因为更改被调用的模块的代码可能会破坏调用它的模块,破坏的方式是编译器完全无法检查的。类似这样的代码崩溃时,其方式是非常微妙的。如果一个模块的使用要求你同时关注好几件事——其内部工作的细节、对全局数据的修改、不确定的功能点——那么就失去了抽象的能力和意义。
有一些常用的设计模式,设计模式通过提供现成的抽象来减少复杂度、设计模式通过把常见解决方案的细节予以制度化来减少出错、设计模式通过提供多种设计方案而带来启发性的价值。常见的设计模式有:Abstract Factory; Adapter; Bridge;Composite;Decrorator;Facade;Factory Method;Iterator;Observer;Singleton;Strtegy;Template Method.应用模式的一个潜在的陷阱是强迫让代码适用于某个模式。有时候,对代码进行一些微小的更改以便符合某个广为认知的模式,会使这段代码更容易理解。但是,如果一段代码做出巨大改动,迫使她去符合某个标准模式,有时反而会把问题复杂化,代码是灵活的。
 
原文地址:https://www.cnblogs.com/HelenL/p/8676807.html