面向对象分析与设计概念与原则

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

面向对象:

封装变化之物

针对接口编码,而不是对实现

应用程序中的每一个类只有一个改变的理由

类是关于行为与功能的

目的:使用已被证实的OO设计原则形成更可维护、更具灵活性以及更易扩展的软件

一、面向对象基本概念

)对象

对象是要进行研究的任何事物。

是运行期的基本实体,它是一个封装了数据和操作这些数据的代码的逻辑实体。

)类

类是具有相同或相似性质的对象的抽象(对某种类型的对象定义变量和方法的原型)。

)类与对象的关系

对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。

一个对象所包含的所有数据和代码可以通过类来构造。

)消息

消息是对象之间进行通信的一种规格说明。一般它由三部分组成:接收消息的对象、消息名及实际变元。

对象之间需要相互沟通,沟通的途径就是对象之间收发信息。消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息。消息传递的概念使得对现实世界的描述更容易。

)动态绑定

动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

二、面向对象的特性/要素

)封装(Encapsulation)

封装就是事物抽象为类,把对外接口暴露,将实现和内部数据隐藏。

)继承(Inheritance)

继承是让某个类型的对象获得另一个类型的对象的特征。

继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

)多态(Polymorphism)

多态是指对象在不同时刻体现为不同类型的能力。

※多态的形式:

基类继承式多态

接口实现式多态

三、面向对象与面向过程有什么区别

一个核心区别是:如何分配职责。

过程式是一系列命令和函数的连续调用,依赖贯穿整个项目;

面向对象则将职责分配到专门的对象中,尽量减少依赖。

四、面向对象分析与设计基本概念

)什么是分析(analysis)

分析是对问题和需求的调查研究。

)什么是设计(design)

设计是定义系统组成并组织组件间关系的过程。

设计师满足需求的概念上的解决方案(在软件方面和硬件方面)

※分析和设计可以概括为:(分析是)做正确的事和(设计是)做正确的事

)面向对象分析

在面向对象分析(object-oriented analysis)过程中,强调在问题领域内发现和描述对象(或概念)。

)面向对象设计

在面向对象设计(object-oriented design,简称对象设计)过程中,强调定义软件对象以及它们如何协作以实现需求。

)职责:引起类变化的原因。

)内聚:一个模块内部各成分之间相关联程度的度量。

)耦合:类依赖其他类

)正交:将职责相关的组件紧紧组合在一起,与外部系统环境隔开,保持独立。

五、OOA基本步骤

在用OOA具体地分析一个事物时,大致上遵循如下五个基本步骤:

第一步,确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。

第二步,确定结构(structure)。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。

第三步,确定主题(subject)。主题是指事物的总体概貌和总体分析模型。

第四步,确定属性(attribute)。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。

第五步,确定方法(method)。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的。

五、面向对象设计原则

设计模式源自面向对象原则。

)单一职责原则(SRP)

※一个类,只有一个引起它变化的原因。

)开放-封闭原则(OCP)

※软件实体应该是(对外)可扩展,(对内)不可修改。也就是说,对扩展是开放的,而对修改是封闭的。

※对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。

※对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

)李氏替换原则(LSP)

李氏替换原则(Liskov Substitution Principle LSP)是子类型必须能够完全替换其父类型(从逻辑上,而不是从语法上)。如:正方形为长方形的特例,如果我们用长方形extends正方形来新建长方形类,语义上就混乱了,

容易产生问题。而如果用四方形作为共同的基类,则解决了问题。

LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

)依赖倒置原则(DIP)

也称作控制反转,缩写为IoC("Inversion of Control"),就是要依赖于抽象,不要依赖于具体。

※面向接口编程

※高层模块不应该依赖于低层模块,二者都应该依赖于抽象。

※抽象不应该依赖于细节,细节应该依赖于抽象。

※相对于结构化方法而言

)接口隔离原则(ISP)

※使用多个专门的接口比使用单一的接口好;

※一个类对另外一个类的依赖性应当是建立在最小的接口上的;

※一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染;

※接口若要稳定,就应承担较少责任,本原则同时符合单一职责原则;

※可以合理利用接口的继承;

※同一个类可以同时实现多个接口,站在调用者的角度,不同的接口代表不同的关注点,不同的职责,甚至是不同的角色。

、合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)

经常又叫做合成复用原则,是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对的委派达到复用已有功能的目的。它的设计原则是:要尽量使用合成/聚合,尽量不要使用继承。

、最小知识原则(Principle of Least Knowledge,PLK,也叫迪米特法则)

不要和陌生人说话。

七、面向对象六视点

)(代码)复用(Reusibility)

将重复的代码封装到类的方法中提供调用。

※软件设计最大的敌人是重复。

※重复的代码会导致解决方案蔓延。

※复用:

细粒度

封装

高内聚

※相关模式:

Prototype模式

Proxy模式

※如何提高软件的复用性

方法级

重构之方法提取

辅助方法

利用静态工厂复用对象的创建逻辑

对象级

相关文档
最新文档