7抽象封装
7.1抽象思维:减法和除法的学问
1.抽象思维能力是最重要的
2.抽象:去粗取精以化繁为简,由表及里以异中求同,抽象就是做减法和除法。
减法好理解:通过甄选减去非本质和无关紧要的部分,着眼于问题的本质,即除粗取精。
通过现象看本质,发现不同事物之间的相同之处,即异中求同,同类归并,那就是除法
3.抽象有角度之分。相同的实体经过不同的角度抽象的模型也会不同。特定的环境
如:人实体,在拓扑科学家眼里是三维连通的集合
伦理学家眼里是质点,在化学家眼里是碳水化合物
4.抽象还有程度之别,抽象程度越高,细节越少,普遍性越强。
5.模型是抽象的结晶
6.实际编程,常用两种抽象机制:一种是参数抽象,一种是规范抽象
7.参数抽象
int gcd(int a, int b){
while(a != b){
a > b ?a -=b:b-=a;
}
}
请问这个函数式干什么的?
好像是求最大公约数(实际上是求最大公约数)
但这里有一个问题:除了该代码的作者,其他人如何重用此函数?
你不能假设用户的英文程度,知道 gcd是greatest common dinisiro缩写
也不能假设他的数学程度
甚至不能假设他一定能看到源码
短短的两行代码的函数尚且如此,何况更加复杂的函数
那只能靠稳定注释
没有文档的API 如同额没有说明书的产品
合格的文档注释中至少应包括先验证条件和后验条件
前者是客户方的承诺,或者是服务方的承诺
有了文档的注释货规范说明的函数成为使用者与实现者之间的一种契约。这种通过规范使代码的功能与实现相分离的方法便成为规范抽象
他规范了服务提供方的义务,同时保障了服务享受方的权利。
其有好处三:
其一:稳定性,使用者不必阅读代码便可了解其用途并能正确使用它们,即省时有准确
其二:局部性,无论阅读还是改写某个抽象的实现代码,都不必参考其他抽象的实现
其三:可变性,实现者在遵循规范的前提下课自由修改实现代码。不必担心影响客户
说明性的文档规范有两个弱点:一是自然语言不够精确,而是不能确保规范的实施。
8.防御性编程
契约式设计采取的是 先君子后小人
契约式设计强调职责分明,认为先验条件是客户方的责任,服务方无需过问。如果客户违约在先,将后果自负
9.软件开发的实践性很强,有不少主观成分,过分追求定义的准确性是没有必要的,何况许多定义本来就是存在争议
10.抽象的程度越高,越接近设计,越远离实现
11.如果一个程序能合理地设计参数,有效地指定规范,严格地遵循规范。便已是难得之才