closely the operations in a routine are
related.
就是一个类中,各个方法之间的联系的紧密程度。
内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。
所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
低内聚就是说一个类中各个方法直接没有关系,最极端的例子就是,这个类中的方法几乎与系统中所有的东西纠缠在一起。
高内聚的代码更容易测试,因为”一块“只负责一件事。
Coupling refers to “the strength of a connection between two
routines. Coupling is a complement to cohesion. Cohesion
describes how strongly the internal contents of a routine are related to each other. Coupling describes how strongly a rou-
tine is related to other routines. The goal is to create routines
with internal integrity (strong cohesion) and small, direct, visi-
ble, and flexible relations to other routines (loose coupling).
我们的目标就是 低耦合高内聚
低耦合就是类与类直接没有依赖,而类中的方法直接相互关联,有很强的依赖性、相关性。
有些面向对象分析人员说万事万物皆对象:类是对象,实例也是对象。这在技术上可能是正确的,但是却成了混淆和发生争议的地方。
对象,就是一个事物,这个事物里的数据告诉它的状态(成员变量等等)、对象中的各种方法使这个对象可以执行自己的应该做的事情(各种职责,对象就是具有责任的东西)。
对象是一个具有责任的实体
有一条好的设计规则:对象应该自己负责自己,而且应该清楚地定义责任。先考虑对象做什么,而不是先考虑怎么做怎么实现。也就是只关注对象的公开接口。
Martin Fowler 描述了软件开发过程中的三 个不同视角(perspective):
还可以用 Martin Fowler 的视角框架来观察对象:
封装一般的解释是:数据隐藏
比如,我调用一个List的int size()方法去看它的大小,我不需要知道它是一个ArrayList或是一个LinkedList,也就是说List对我隐藏了具体实现。
但作者认为封装是 任何形式的隐藏 “any kind of hiding.”:
数据
实现细节
数据的封装: 如private 变量、方法的封装:如private 方法 其他组合对象的封装 :如Facade中的**service对象。类型的封装:也就是多态,父类引用子类对象(只关心抽象的接口、抽象类)。
派生类
设计细节
实例化规则
比如上图,
数据封装:Point、Line、Square、Circle 类中的数据
方法的封装:Shape里的setLocation()方法,对对象行为的封装。
子类封装:面对使用Shape的客户端,客户端不用过多理会Shape的具体实现是什么。(Point、Line、Square、Circle )
其他对象的封装:Circle 里的 XXCircle对象
UML是一种用来创建程序模型的图形语言 (即带有语意的一种图形记号 )“程序模型 ” 指的是程序的图形表示,可以说明代码中对
象之间的关系。
用例图,涉及的是与系统(也就是用户和其他的系统)之间
交互的实体,以要实现的功能点;
活动图…
类图可以表示类之间的静态关系,换句话说,类图不能表示任何活动。
矩形表示一个类。
在UML 中,我可以表示最多三个方面的类的信息:
1 类名;
2 类的数据成员;
3 类的方法(函数)
表示类的信息有三种不同方式:
最左边的矩形只显示了类名。在不需要更详细信息时,可以使用类的
中间的矩形显示了类名和类的方法。display(方法名)前的加号(+)表示此方法是公开的——也就是说,不属于此类的其他对象也可以调用。
最右边的矩形除显示了前面的信息(类名和类的方法)之外,还显示
了类的数据成员。在本例中,数据成员length(它是double类型的)前的减号(?)表明这个数据成员的值是私有的,也就是说,除了它所属的对象外,它对其他对象都是不可见的.
public——用一个加号( + )标记
protect——用一个“井 ” 号(#)标记
private——用减号(?)标记
表示关系的 UML 记号有如下四种:
is-a
Shape 类的名字是用斜体表示的,说明它是一个抽象类(也可以表示接口).
抽象类就是用来为其派生类定义接口而且存放这些派生类公共数据和方法的类。接口可以看作是没有公共数据和方法的抽象类——它只用来作为一种“为要实现它的那些类的方法进行定义”的方式而已。
has-a(聚集与组合)
聚集:用空心棱形表示。Airport 上有很许许多多的Aircraft ,但是Aircraft并不是Airport的一部分。这种has-a称为聚合。
组合:Car有4个Tire,Tire作为Car的一部分组成了一个完成的Car.这种has-a称为组合。用虚线表示依赖关系,汽车需要使用汽油。
区分:组合和聚集都有“一个对象包含一个或多个对象 ” 的意思
组合有被包含对象是包含对象的一部分的意思,被包含对象的生存周期由包含对象控制。而聚集意味着被包含对象更像是一个集合。
重数:
如图,Airport旁的0..1表示,对于一个AirCraft来说,它可以属于一个或0个Airport(0,表示起飞情况)。
Aircraft旁的0..*表示,对于一个Airport,可以包含0到n个Aircraft.
Car与Tire关系更好理解,1就是,对轮子来说,它属于一个车子。
4…5就是,对车子来说,它有4到5个轮子。
如果未指定重数,对于对象的数量不应该做任何假设。
表示对象间如何交互的 UML 图称为顺序图(也叫时序图)(interaction diagram)。最常用的交互图是顺序图(也叫时序图)
最上面的每个矩形都代表一个特定的对象。虽然许多矩形中有类名,
但请注意在类名前有一个冒号。一些矩形还有其他名字——例如 shape1:Square。
在最上面可以看见 Main 向 ShapeDB 对象(这个对象还没有名字)发
送了一个“获取形状集合”的消息
注意:
当对象互相“交谈 ” 时,我们称之为“发送消息 ” 。你需要给一个对象发送请 求 ,
让它进行某种操作,而不是告诉它对象做什么,它会负责搞清楚如何去做。转移责任是面向对象程序设计基本原则之一。这与过程式程序设计完全不同,在后者情况下,你必须控制下一步做什么,因此可能“调用另一个对象的方法”或者“调用操作” 。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Design Pattern Explain 读书笔记一 重新认识面向对象|规范使用UML
原文地址:http://blog.csdn.net/lemon89/article/details/46797279