面向对象编程导论 An Introduction to Object-Oriented Programming (Timothy 著)

第1章 面向对象思想

第2章 抽象

第3章 面向对象设计

第4章 类和方法

第5章 消息,实例和初始化

第6章 案例研究: 八皇后问题

第7章 研究研究: 台球游戏

第8章 继承与替换

第9章 案例研究: 纸牌游戏

第10章 子类和子类型

第11章 静态行为和动态行为

第12章 替换的本质

第13章 多重继承

第14章 多态及软件复用

第15章 重载

第16章 改写

第17章 多态变量

第18章 泛型

第19章 容器类

第20章 案例研究: 标准模板库

第21章 框架

第22章 框架实例: AWT和Swing

第23章 对象互连

第24章 设计模式

第25章 反射和内省

第26章 分布式对象

第27章 实现

参考文献

 

第1章 面向对象思想

 

第2章 抽象

 

第3章 面向对象设计

 

第4章 类和方法

 

第5章 消息,实例和初始化

 

第6章 案例研究: 八皇后问题

 

第7章 研究研究: 台球游戏

 

第8章 继承与替换

 

第9章 案例研究: 纸牌游戏

 

第10章 子类和子类型

 

第11章 静态行为和动态行为

 

第12章 替换的本质

 

第13章 多重继承

 

第14章 多态及软件复用

 

第15章 重载

 

第16章 改写

 

第17章 多态变量

 

第18章 泛型

 

第19章 容器类

 

第20章 案例研究: 标准模板库

 

第21章 框架

 

第22章 框架实例: AWT和Swing

 

第23章 对象互连

一种考虑对象互连的方式就是研究可视性(visibility)依赖性(dependency)这两个概念.可视性这个软件工程术语描述了关于名称的特性----通过该名称句柄可以存取对象.如果对象的名称是合法的且代表该对象,那么在这个特定的环境下,该对象就是可见的.通常,用于描述可视性的相关术语还包括标识符的范畴(scope)

可视性与连通性的关系体现在: 如果我们能够控制并降低作为标识符的名称的可见性,那么就能更加容易确定应该如何使用标识符.

依赖性这个概念将两个对象或者类联系起来.在不存在另外一个对象的条件下,如果一个对象的存在无任何意义,我们就说该对象依赖于另外那个对象.例如,子类几乎总是依赖于它的父类.

  23.1 耦合和内聚

耦合(coupling)内聚(cohesion)的思想提供了一个框架,用于评价对象和类的应用是否有效.耦合描述了类之间的关系,而聚合描述了类内部的关系.因此,如果想要降低类之间的互连性,可以通过减少类之间的耦合来实现.另一方面,设计良好的类应该具有特定的目的;所有元素都应该与一个任务相关.这意味着在一个良好的设计中,类内部的元素应该具有内部的内聚性

    23.1.1 耦合的种类

类之间的耦合可以有各种原因,其中某些耦合比另外一些耦合更可接受或更理想.从最差到较好的耦合如下面所示

  内部数据耦合

  全局数据耦合

  控制(或顺序)耦合

  组件耦合

  参数耦合

  子类耦合

内部数据耦合发生在当一个类的实例直接修改另外一个类中的本地数据值(实例变量)时.

class SneakyModifier {
public:
    void sneaky() {
        // change my friends name
        myFriend->name = "Lucy";
    }
    Person * myFriend;
};

class Person {
public:
    Person() {
        name = "Larry";
    }
    string name;
};
View Code

内部数据耦合这种做法非常不好的原因在于,这种方式使得想要独立理解类变得非常复杂.如果某个开发者只负责当前的类,那么如果这个类的内部数据字段戏剧性地被外部的某种行为所修改,该开发者将如何知道这一行为呢?这种做法将使程序非常难以理解和推断,应该尽可能地避免.

全局数据耦合发生在两个或者更多个类都依赖于公用的全局数据结构而绑定到一起的时候

double todaysDow;

class One {
public:
    void setDow() {
        todaysDow = 9473;
    }
};

class Two {
public:
    void printDow() {
        cout << "Today the Dow hit " << todayDow;
    }
};
View Code

同样,这种耦合形式不好的原因在于独立理解类会变得非常复杂.每个类自身都是不完整的,只有同时研究多个类定义时,才能够理解这些类之间的相互作用.但是,全局数据耦合有时是不可避免的

在实践中,如何区分下面这两种全局变量非常重要.在涉及多文件的程序中,某些全局变量具有文件范畴(file scope),这意味着只能在一个文件中使用这些变量.另一种全局变量则具有程序范畴(program scope),这意味着可以在程序中的任何位置对其进行修改.了解具有程序范畴的全局变量的使用比了解具有文件范畴的全局变量的使用要困难得多

许多语言都提供了用来在单独类与整个程序之间控制名称可视性的技术.这方面的实例包括C++语言中的名称空间,Java语言中的包以及Object Pascal语言中的单元等.这些特征支持某些名称具有超过一个单独类但却小于整个程序的范畴.当对象之间通过这种数值进行交互时,程序之间发生作用的部分减少了,因此这种做法将比对象之间通过真正的全局变量进行交互的做法要更好,但是,这种耦合仍然难以理解,并且也应该尽可能地避免

在面向对象框架中,可能存在的代替全局数据耦合的方法就是建立新类,整个类负责"管理"数据值,所有对全局数值的存取都需经过这个类(这种方法类似于我们使用存取函数来屏蔽在对象内部直接存取本地数据的做法).这种技术将全局数据耦合降低到参数耦合级别上,而参数耦合更容易理解和控制.在Java语言中,不存在全局变量,所有的数值都必须通过类来管理

class MyClass {
public:
    void mustDoFirst() { ... }
    void doSecond() { ... }
    void doThird() { ... }
};
View Code

控制或者顺序耦合发生在一个类必须以一种由任意位置控制的特定的顺序来执行操作时.数据库系统可能会顺序经历以下几个步骤:执行初始化阶段,读取当前记录,更新记录,删除记录,以及产生报告等.但是,每个阶段都通过不同的例程来调用,并且调用顺序依赖于不同位置上的代码.控制耦合的存在说明类的设计者只需跟随低级别的抽象即可(每个步骤都对应一条指令,“处理数据库”).即使控制耦合不可避免,通常也会谨慎地要求正被顺序化的类必须确保其自身能够以正确的顺序实现操作,而并不依赖于调用者的正确处理

组件耦合发生在一个类包含的数据字段或数值为另外一个类的实例时.组件耦合的这种关系是一种理想的耦合方式.容器显然知道它所包含的数值所属的类,但是它所包含的元素却不应该知道关于它所处的容器的情况

class Set {
    .
    .
    .
private:
    List data;
};
View Code

参数耦合发生在一个类必须调用另外一个类的服务和例程时,此时两个类之间所发生的唯一关系就是一个类需要为另一个类提供参数数目,类型和返回值类型.这种耦合形式很常见,容易理解,并易于验证(例如,使用检查参数调用与定义不匹配的工具);因此,这是一种最良好的耦合方式

class MyClass {
public:
    void doSomething(Set aSet) {
        // do something using the argument value
        .
        .
        .
    }
}
View Code

子类耦合是面向对象编程所特有的.它描述了一个类与其父类之间的关系.通过继承,子类的实例可以被看成父类的实例

class Parent {
    .
    .
    .
}

class Child extends Parent {
    .
    .
    .
}
View Code

    23.1.2 内聚的种类

类的内部内聚性是该结构之中各个元素之间绑定程度的量度.与耦合类似,从最弱的内聚(最少期望的)到最强的内聚(最期望的)依次排列的结果如下所示

  随机内聚

  逻辑内聚

  时间内聚

  通信内聚

  顺序内聚

  功能内聚

  数据内聚

随机内聚发生在没有明显原因而对一个类的元素进行分组时.通常这都是对一个大型程序随意划分成多个部分(类似于模块化)的结果.这往往是设计不好的一个标志.在面向对象框架中,当类由多个无关的方法组成时,我们就称这种情况为随机内聚

逻辑内聚发生在每个数据或控件中,类的各个元素之间存在着逻辑的联系但并不存在实际的联系时.如果算术函数库(正弦, 余弦等函数)中的各个函数都在不参照其他函数的条件下独立实现各自的功能,那么该函数库就展示了一种逻辑内聚

时间内聚发生在由于多个元素几乎同时使用而绑定到一起时.典型的例子就是用来实现程序初始化的类.这里,更好的设计是通过不同的类来实现不同的初始化活动,使每个类都负责更具体的后续行为

通信内聚发生在一个类的所有方法由于需要存取相同的"输入/输出"数据或设备而组合到一起时.类将扮演数据或者设备的"管理者"的角色

 

    23.1.3 德墨特尔法则

 

    23.1.4 类级别可视性与对象级别可视性

 

    23.1.5 活动值

 

  23.2 子类客户和用户客户

 

  23.3 存储控制和可视性

 

    23.3.1 Smalltalk语言中的可视性

 

    23.3.2 C++语言中的可视性

 

    23.3.3 Object Pascal语言中的可视性

 

    23.3.4 Java语言中的可视性

 

    23.3.5 Objective-C语言中的可视性

 

第24章 设计模式

 

第25章 反射和内省

 

第26章 分布式对象

 

第27章 实现

 

参考文献

 

转载于:https://www.cnblogs.com/revoid/p/10385912.html

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  本书是一部独具特色的面向对象技术作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言、持久存储、分布式计算和客户/服务器技术等。   本书内容精炼,示例简单明了,适合各层次面向对象开发人员阅读,也是高校相关专业面向对象课程的理想教学参考书。 第1章 面向对象概念介绍 1 1.1 过程式程序设计与OO程序设计 2 1.2 从过程式开发转向面向对象开发 4 1.2.1 过程式程序设计 5 1.2.2 OO程序设计 5 1.3 对象到底是什么 5 1.3.1 对象数据 5 1.3.2 对象行为 6 1.4 类到底是什么 9 1.4.1 类是对象模板 9 1.4.2 属性 11 1.4.3 方法 11 1.4.4 消息 11 1.5 使用UML完成类图建模 12 1.6 封装和数据隐藏 12 1.6.1 接口 12 1.6.2 实现 13 1.6.3 接口/实现范型的一个实际例子 13 1.6.4 接口/实现范型的模型 14 1.7 继承 15 1.7.1 超类和子类 16 1.7.2 抽象 16 1.7.3 is-a关系 17 1.8 多态 18 1.9 组合 20 1.9.1 抽象 21 1.9.2 has-a关系 21 1.10 小结 21 1.11 本章使用的示例代码 21 1.11.1 TestPerson示例:C#.NET 21 1.11.2 TestPerson示例:VB.NET 22 1.11.3 TestShape示例:C#.NET 23 1.11.4 TestShape示例:VB.NET 25 第2章 如何以对象方式思考 27 2.1 了解接口与实现之间的区别 28 2.1.1 接口 29 2.1.2 实现 29 2.1.3 接口/实现示例 29 2.2 设计接口时使用抽象思维 33 2.3 尽可能为用户提供最小接口 35 2.3.1 确定用户 35 2.3.2 对象行为 36 2.3.3 环境约束 36 2.3.4 明确公共接口 36 2.3.5 明确实现 37 2.4 小结 37 2.5 参考书目 38 第3章 高级面向对象概念 39 3.1 构造函数 39 3.1.1 何时调用构造函数 39 3.1.2 构造函数中有什么 40 3.1.3 默认构造函数 40 3.1.4 使用多个构造函数 41 3.1.5 构造函数的设计 44 3.2 错误处理 44 3.2.1 忽略问题 45 3.2.2 检查问题并中止应用 45 3.2.3 检查问题并尝试恢复 45 3.2.4 抛出异常 45 3.3 作用域概念 47 3.3.1 局部属性 48 3.3.2 对象属性 49 3.3.3 类属性 50 3.4 操作符重载 51 3.5 多重继承 52 3.6 对象操作 53 3.7 小结 54 3.8 参考书目 54 3.9 本章使用的示例代码 54 3.9.1 TestNumber示例:C#.NET 54 3.9.2 TestNumber示例:VB.NET 55 第4章 类剖析 57 4.1 类名 57 4.2 注释 58 4.3 属性 59 4.4 构造函数 60 4.5 访问方法 62 4.6 公共接口方法 63 4.7 私有实现方法 64 4.8 小结 64 4.9 参考书目 64 4.10 本章使用的示例代码 65 4.10.1 TestCab示例:C#.NET 65 4.10.2 TestCab示例:VB.NET 66 第5章 类设计指导原则 68 5.1 真实世界系统建模 68 5.2 明确公共接口 69 5.2.1 最小公共接口 69 5.2.2 隐藏实现 69 5.3 设计健壮的构造函数(和析构函数) 70 5.4 在类中设计错误处理 70 5.4.1 对类建立文档以及使用注释 71 5.4.2 构建类要以合作为出发点 71 5.5 设计时充分考虑重用 72 5.6 设计时充分考虑到可扩展性 72 5.6.1 名字要有描述性 72 5.6.2 抽出不可移植的代码 72 5.6.3 提供一种复制和比较对象的方法 73 5.6.4 让作用域尽可能小 73 5.6.5 类应当对自己负责 74 5.7 设计时充分考虑可维护性 75 5.7.1 使用迭代 76 5.7.2 测试接口 76 5.8 使用对象持久性 78 5.9 小结 79 5.10 参考书目 79 5.11 本章使用的示例代码 79 5.11.1 TestMath示例:C#.NET 79 5.11.2 TestMath示例:VB.NET 80 第6章 利用对象实现设计 81 6.1 设计指导原则 81 6.1.1 完成适当的分析 84 6.1.2 建立工作陈述 84 6.1.3 收集需求 84 6.1.4 开发用户界面的原型 85 6.1.5 明确类 85 6.1.6 确定各个类的职责 85 6.1.7 确定类如何相互合作 85 6.1.8 创建类模型来描述系统 85 6.2 案例研究:blackjack示例 86 6.2.1 使用CRC卡 87 6.2.2 明确blackjack类 88 6.2.3 明确类的职责 90 6.2.4 UML用例:明确协作关系 95 6.2.5 第一轮CRC卡 98 6.2.6 UML类图:对象模型 99 6.2.7 建立用户界面原型 100 6.3 小结 101 6.4 参考书目 101 第7章 掌握继承和组合 102 7.1 重用对象 102 7.2 继承 103 7.2.1 一般化和特殊化 105 7.2.2 设计决策 105 7.3 组合 107 7.4 为什么封装在OO中如此重要 109 7.4.1 继承如何削弱封装 109 7.4.2 多态的一个详细例子 111 7.4.3 对象职责 111 7.5 小结 115 7.6 参考书目 115 7.7 本章使用的示例代码 115 7.7.1 TestShape示例:C#.NET 115 7.7.2 TestShape示例:VB.NET 117 第8章 框架与重用:使用接口和抽象类实现设计 119 8.1 代码:重用还是不重用 119 8.2 什么是框架 119 8.3 什么是契约 121 8.3.1 抽象类 122 8.3.2 接口 124 8.3.3 集成 125 8.3.4 编译器的证明 127 8.3.5 建立契约 128 8.3.6 系统插入点 130 8.4 一个电子商务例子 130 8.4.1 电子商务问题 130 8.4.2 非重用的方法 131 8.4.3 一个电子商务解决方案 133 8.4.4 UML对象模型 133 8.5 小结 137 8.6 参考书目 137 8.7 本章使用的示例代码 138 8.7.1 TestShape示例:C#.NET 138 8.7.2 TestShape示例:VB.NET 140 第9章 构建对象 143 9.1 组合关系 143 9.2 分阶段构建 144 9.3 不同类型的组合 146 9.3.1 聚集 146 9.3.2 关联 146 9.3.3 结合使用关联和聚集 148 9.4 避免依赖性 148 9.5 基数 149 9.5.1 多个对象关联 151 9.5.2 可选关联 151 9.6 集成示例 152 9.7 小结 152 9.8 参考书目 153 第10章 用UML创建对象模型 154 10.1 什么是UML 154 10.2 类图的结构 155 10.3 属性和方法 156 10.3.1 属性 156 10.3.2 方法 157 10.4 访问指示 157 10.5 继承 158 10.6 接口 159 10.7 组合 160 10.7.1 聚集 160 10.7.2 关联 161 10.8 基数 161 10.9 小结 162 10.10 参考书目 163 第11章 对象和可移植数据:XML 164 11.1 可移植数据 164 11.2 XML 165 11.3 XML与HTML 166 11.4 XML和面向对象语言 166 11.5 两个公司间共享数据 167 11.6 用DTD验证文档 168 11.7 将DTD集成到XML文档 170 11.8 使用层叠样式表 175 11.9 小结 177 11.10 参考书目 177 第12章 持久对象:串行化和关系数据库 178 12.1 持久对象基础 178 12.2 将对象保存到平面文件 179 12.2.1 串行化文件 180 12.2.2 再谈实现和接口 182 12.2.3 方法如何保存 183 12.3 串行化过程中使用XML 183 12.4 写到关系数据库 186 12.5 加载驱动程序 189 12.5.1 建立连接 189 12.5.2 SQL语句 190 12.6 小结 192 12.7 参考书目 192 12.8 本章使用的示例代码 192 12.8.1 Person类示例:C#.NET 193 12.8.2 Person类示例:VB.NET 195 第13章 对象与因特网 197 13.1 分布式计算的演进 197 13.2 基于对象的脚本语言 197 13.3 JavaScript验证示例 200 13.4 Web页面中的对象 202 13.4.1 JavaScript对象 202 13.4.2 Web页面控件 204 13.4.3 声音播放器 205 13.4.4 电影播放器 205 13.4.5 Flash 206 13.5 分布式对象和企业 206 13.5.1 公共对象请求代理体系结构(CORBA) 207 13.5.2 Web服务定义 210 13.5.3 Web服务代码 213 13.5.4 Invoice.cs 214 13.5.5 Invoice.vb 215 13.6 小结 216 13.7 参考书目 216 第14章 对象和客户/服务器应用 217 14.1 客户/服务器方法 217 14.2 专有方法 217 14.2.1 串行化对象代码 218 14.2.2 客户代码 218 14.2.3 服务器代码 220 14.2.4 运行专有的客户/服务器示例 222 14.3 非专有方法 223 14.3.1 对象定义代码 223 14.3.2 客户代码 224 14.3.3 服务器代码 225 14.3.4 运行非专有的客户/服务器示例 227 14.4 小结 228 14.5 参考书目 228 14.6 本章使用的示例代码 228 14.6.1 客户/服务器示例——VB.NET:对象定义代码 228 14.6.2 客户/服务器示例——VB.NET:客户代码 229 14.6.3 客户/服务器示例——VB.NET:服务器代码 230 第15章 设计模式 232 15.1 为什么研究设计模式 232 15.2 Smalltalk的模型/视图/控制器 233 15.3 设计模式的不同类型 234 15.3.1 创建型模式 235 15.3.2 结构型模式 239 15.3.3 行为型模式 241 15.4 反模式 242 15.5 小结 243 15.6 参考书目 243 15.7 本章使用的示例代码 243 15.7.1 C#.NET 244 15.7.2 VB.NET 247 索引 250
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值