面向对象编程导论 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章 对象互连
一种考虑对象互连的方式就是研究可视性(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;
};
内部数据耦合这种做法非常不好的原因在于,这种方式使得想要独立理解类变得非常复杂.如果某个开发者只负责当前的类,那么如果这个类的内部数据字段戏剧性地被外部的某种行为所修改,该开发者将如何知道这一行为呢?这种做法将使程序非常难以理解和推断,应该尽可能地避免.
全局数据耦合发生在两个或者更多个类都依赖于公用的全局数据结构而绑定到一起的时候
double todaysDow;
class One {
public:
void setDow() {
todaysDow = ;
}
};
class Two {
public:
void printDow() {
cout << "Today the Dow hit " << todayDow;
}
};
同样,这种耦合形式不好的原因在于独立理解类会变得非常复杂.每个类自身都是不完整的,只有同时研究多个类定义时,才能够理解这些类之间的相互作用.但是,全局数据耦合有时是不可避免的
在实践中,如何区分下面这两种全局变量非常重要.在涉及多文件的程序中,某些全局变量具有文件范畴(file scope),这意味着只能在一个文件中使用这些变量.另一种全局变量则具有程序范畴(program scope),这意味着可以在程序中的任何位置对其进行修改.了解具有程序范畴的全局变量的使用比了解具有文件范畴的全局变量的使用要困难得多
许多语言都提供了用来在单独类与整个程序之间控制名称可视性的技术.这方面的实例包括C++语言中的名称空间,Java语言中的包以及Object Pascal语言中的单元等.这些特征支持某些名称具有超过一个单独类但却小于整个程序的范畴.当对象之间通过这种数值进行交互时,程序之间发生作用的部分减少了,因此这种做法将比对象之间通过真正的全局变量进行交互的做法要更好,但是,这种耦合仍然难以理解,并且也应该尽可能地避免
在面向对象框架中,可能存在的代替全局数据耦合的方法就是建立新类,整个类负责"管理"数据值,所有对全局数值的存取都需经过这个类(这种方法类似于我们使用存取函数来屏蔽在对象内部直接存取本地数据的做法).这种技术将全局数据耦合降低到参数耦合级别上,而参数耦合更容易理解和控制.在Java语言中,不存在全局变量,所有的数值都必须通过类来管理
class MyClass {
public:
void mustDoFirst() { ... }
void doSecond() { ... }
void doThird() { ... }
};
控制或者顺序耦合发生在一个类必须以一种由任意位置控制的特定的顺序来执行操作时.数据库系统可能会顺序经历以下几个步骤:执行初始化阶段,读取当前记录,更新记录,删除记录,以及产生报告等.但是,每个阶段都通过不同的例程来调用,并且调用顺序依赖于不同位置上的代码.控制耦合的存在说明类的设计者只需跟随低级别的抽象即可(每个步骤都对应一条指令,“处理数据库”).即使控制耦合不可避免,通常也会谨慎地要求正被顺序化的类必须确保其自身能够以正确的顺序实现操作,而并不依赖于调用者的正确处理
组件耦合发生在一个类包含的数据字段或数值为另外一个类的实例时.组件耦合的这种关系是一种理想的耦合方式.容器显然知道它所包含的数值所属的类,但是它所包含的元素却不应该知道关于它所处的容器的情况
class Set {
.
.
.
private:
List data;
};
参数耦合发生在一个类必须调用另外一个类的服务和例程时,此时两个类之间所发生的唯一关系就是一个类需要为另一个类提供参数数目,类型和返回值类型.这种耦合形式很常见,容易理解,并易于验证(例如,使用检查参数调用与定义不匹配的工具);因此,这是一种最良好的耦合方式
class MyClass {
public:
void doSomething(Set aSet) {
// do something using the argument value
.
.
.
}
}
子类耦合是面向对象编程所特有的.它描述了一个类与其父类之间的关系.通过继承,子类的实例可以被看成父类的实例
class Parent {
.
.
.
}
class Child extends Parent {
.
.
.
}
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章 实现
参考文献
面向对象编程导论 An Introduction to Object-Oriented Programming (Timothy 著)的更多相关文章
- 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性
一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...
- Object Oriented Programming python
Object Oriented Programming python new concepts of the object oriented programming : class encapsula ...
- JavaScript: Constructor and Object Oriented Programming
Constructor : Grammar: object.constructor Example: Javascript code: 1 function obj1() { this.number ...
- 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
一.概述 面向过程:根据业务逻辑从上到下写代码 函数式:将具有一些功能的代码封装到函数中,需要的时候调用即可 面向对象:对函数进行分类和封装,让开发更方便,更快捷 Java和C#只支持面型对象编程,, ...
- An Introduction to Protocol Oriented Programming in Swift
swift面向协议编程的根本原因在于值类型的存在:面向对象必须要有引用类型的支持: Protocol Oriented approach was introduced to resolve some ...
- python, 面向对象编程Object Oriented Programming(OOP)
把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数 ...
- JS面向对象程序设计(OOP:Object Oriented Programming)
你是如何理解编程语言中的面向对象的? 我们研究JS和使用JS编程本身就是基于面向对象的思想来开发的,JS中的一切内容都可以统称为要研究的“对象”,我们按照功能特点把所有内容划分成“几个大类,还可以基于 ...
- C++自学笔记 面向对象程序设计OOP(Object Oriented Programming)
什么是对象? Objects = Attributes + Services Data : The properties or status Operations: the fuctions C语言中 ...
- [Training Video - 3] [Java Introduction] [Object Oriented Programming]
Static and non-Static : 非静态方法(不带static)可以访问静态变量和方法(带static),但是反过来就不行. 类的静态成员(变量和方法)属于类本身,在类加载的时候就会分 ...
随机推荐
- 阶段02JavaWeb基础day02&03JavaScript
javascript知识体系 ECMAScript javascript与html结合方式 内部: <script type="text/javaScript">*** ...
- 信息技术手册可视化进度报告 基于BeautifulSoup框架的python3爬取数据并连接保存到MySQL数据库
老师给我们提供了一个word文档,里面是一份信息行业热词解释手册,要求我们把里面的文字存进数据库里面,然后在前台展示出来. 首先面临的问题是怎么把数据导进MySQL数据库,大家都有自己的方法,我采用了 ...
- Oracle学习DayFive(PL/SQL)
一.PL/SQL简介 PL/SQL 是 Procedure Language & Structured Query Language 的缩写.PL/SQL 是对 SQL 语言存储过程语言的扩 ...
- linux 增加虚拟内存swap(使用文件)
1.简介 如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存是一个不错的选择. 为了测试一些功能我在阿里云购买 ...
- 马凯军201771010116《面向对象与程序设计Java》第十三周学习总结
实验十三 图形界面事件处理技术 实验时间 2018-11-22 理论知识与学习部分 事件处理基础 事件源(event source):能够产生事件的对象都可 以成为事件源,如文本框.按钮等.一个事 ...
- 2019-04-24-day039-数据库的增查
内容回顾 多积累使用工具的经验 尽量多练习 1.多练几种类型 2.不要照着写好的sql敲,要自己组织语言 内容回顾 存储引擎 innodb : 外键 行级锁(并发修改) 事务(客户管理系统) myis ...
- Python 守护线程
import time from threading import Thread from multiprocessing import Process #守护进程:主进程代码执行运行结束,守护进程随 ...
- 学习笔记--python中使用多进程、多线程加速文本预处理
一.任务描述 最近尝试自行构建skip-gram模型训练word2vec词向量表.其中有一步需要统计各词汇的出现频率,截取出现频率最高的10000个词汇进行保留,形成常用词词典.对于这个问题,我建立了 ...
- SharePoint 2013 新特性 (三) 破改式 —— 设计管理器的使用 [2.HTML变身模板页]
假设你跟我一样,看到了一个非常漂亮的页面,想把这种风格放到SharePoint里,咋办呢,那肯定得自定义个模板页了,好点是SharePoint Designer搞定,差点就得用Visual Studi ...
- hadoop day 6
1.为hive配置mysql数据库 conf/hive-site.xml <property> <name>javax.jdo.option.ConnectionURL< ...