以前跟别人讨论问题时,有一些概念或思想无法表达。但在这本书里找到了比较到位的理解,记录下来。
黑体 - 原文
斜体 - 自己的想法,不代表作者观点
为什么要抽象
人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。
最NB的抽象莫过于周易。道即原理、规律。道本身就是抽象。周易是对抽象的抽象,所以能占卜天地,无所不知吗?
什么是对象
建模方式 | 语言代表 | 建模方法 | 优点 | 缺点 |
---|---|---|---|---|
“命令式”语言 | FIRTRABM\BASIC\C | 建立机器模型和实际待解问题模型之间的联系 | 难以编写,维护代价,需要“编程方法” | |
另一种 | LISP\APL\PROLOG | 只针对待解问题建模 | 善于解决特定问题 | 超出特定领域则力不从心 |
OOP | 将问题空间中的元素在其解空间中的表示称为“对象” | 通过添加新类型的对象使自身适用于某个特定的问题 |
OOP的挑战之一,就是问题空间和元素和解空间的对象之间创建一对一的映射。
OOP仍然没有跳出“建立机器模型和实际待解问题模型之间的联系”的圈子,只是用了一种更方便的方法。
过程程序与对象程序
面向过程:程序 = 数据结构 + 算法
面向对象:程序 = 对象 + 消息
对象具有状态、行为和标识。
状态 - 内部数据
行为 - 方法
标识 - 内存中唯一的地址
开发或理解一个程序设计
最好的方法之一就是将对象想像为“服务提供者”。程序本身将向用户提供服务,它将通过调用其他对象提供的服务来实现这一目的。你的目的是创建(或者最好是在现有代码库上寻找)能够提供理想的服务来解决问题的一系列对象。
被隐藏的部分通常代表对象内部脆弱的部分。
访问控制库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员。
如果组合是动态发生的,那么它通常被称为聚合。
在建立新类时,应该首先考虑组合(相对于继承来说)。
多态的原理
编译 | 链接 | 运行时 | |
---|---|---|---|
早捆绑 | 对特定的函数名产生调用 | 把调用解析为要执行代码的绝对地址 | |
晚捆绑 | 保证被调用的函数存在 | 确定被调用的代码 (通过存放在对象中的信息,计算出被调函数的地址) |
1.1.1. 控制对象生命周期的方式
方式 | 方法 | 目的 | 缺点 |
---|---|---|---|
静态方式 | 将对象置于栈 | 将存储空间分配和释放置于优先考虑的位置 | 在编写时知道对象的数量、类型和生命周期,牺牲了灵活性 |
动态方式 | 堆 | 动态管理对象,灵活 | 慢 |
动态方式有这样的一个一般性的逻辑假设:对象趋向于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大的冲击。动态方式所带来的灵活性正是解决一般编程问题的要点所在。