面向对象分析与设计概念与原则
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OOA/D
面向对象:
封装变化之物
针对接口编码,而不是对实现
应用程序中的每一个类只有一个改变的理由
类是关于行为与功能的
目的:使用已被证实的OO设计原则形成更可维护、更具灵活性以及更易扩展的软件
一、面向对象基本概念
1.1)对象
对象是要进行研究的任何事物。
是运行期的基本实体,它是一个封装了数据和操作这些数据的代码的逻辑实体。
1.2)类
类是具有相同或相似性质的对象的抽象(对某种类型的对象定义变量和方法的原型)。
1.3)类与对象的关系
对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。
一个对象所包含的所有数据和代码可以通过类来构造。
1.4)消息
消息是对象之间进行通信的一种规格说明。一般它由三部分组成:接收消息的对象、消息名及实际变元。
对象之间需要相互沟通,沟通的途径就是对象之间收发信息。消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息。消息传递的概念使得对现实世界的描述更容易。
1.5)动态绑定
动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
二、面向对象的特性/要素
2.1)封装(Encapsulation)
封装就是事物抽象为类,把对外接口暴露,将实现和内部数据隐藏。
2.2)继承(Inheritance)
继承是让某个类型的对象获得另一个类型的对象的特征。
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
2.3)多态(Polymorphism)
多态是指对象在不同时刻体现为不同类型的能力。
※多态的形式:
✓基类继承式多态
✓接口实现式多态
三、面向对象与面向过程有什么区别?
一个核心区别是:如何分配职责。
过程式是一系列命令和函数的连续调用,依赖贯穿整个项目;
面向对象则将职责分配到专门的对象中,尽量减少依赖。
四、面向对象分析与设计基本概念
4.1)什么是分析(analysis)?
分析是对问题和需求的调查研究。
4.2)什么是设计(design)?
设计是定义系统组成并组织组件间关系的过程。
设计师满足需求的概念上的解决方案(在软件方面和硬件方面)
※分析和设计可以概括为:(分析是)做正确的事和(设计是)做正确的事
4.3)面向对象分析
在面向对象分析(object-oriented analysis)过程中,强调在问题领域内发现和描述对象(或概念)。
4.4)面向对象设计
在面向对象设计(object-oriented design,简称对象设计)过程中,强调定义软件对象以及它们如何协作以实现需求。
4.5)职责:引起类变化的原因。
4.6)内聚:一个模块内部各成分之间相关联程度的度量。
4.7)耦合:类依赖其他类
4.8)正交:将职责相关的组件紧紧组合在一起,与外部系统环境隔开,保持独立。
五、OOA基本步骤
在用OOA具体地分析一个事物时,大致上遵循如下五个基本步骤:
第一步,确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。
第二步,确定结构(structure)。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。
第三步,确定主题(subject)。主题是指事物的总体概貌和总体分析模型。
第四步,确定属性(attribute)。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。
第五步,确定方法(method)。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的。
五、面向对象设计原则
设计模式源自面向对象原则。
6.1)单一职责原则(SRP)
※一个类,只有一个引起它变化的原因。
6.2)开放-封闭原则(OCP)
※软件实体应该是(对外)可扩展,(对内)不可修改。也就是说,对扩展是开放的,而对修改是封闭的。
※对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
※对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
6.3)李氏替换原则(LSP)
李氏替换原则(Liskov Substitution Principle LSP)是子类型必须能够完全替换其父类型(从逻辑上,而不是从语法上)。如:正方形为长方形的特例,如果我们用长方形extends正方形来新建长方形类,语义上就混乱了,容易产生问题。而如果用四方形作为共同的基类,则解决了问题。
LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
6.4)依赖倒置原则(DIP)
也称作控制反转,缩写为IoC("Inversion of Control"),就是要依赖于抽象,不要依赖于具体。
※面向接口编程
※高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
※抽象不应该依赖于细节,细节应该依赖于抽象。
※相对于结构化方法而言
6.5)接口隔离原则(ISP)
※使用多个专门的接口比使用单一的接口好;
※一个类对另外一个类的依赖性应当是建立在最小的接口上的;
※一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染;
※接口若要稳定,就应承担较少责任,本原则同时符合单一职责原则;
※可以合理利用接口的继承;
※同一个类可以同时实现多个接口,站在调用者的角度,不同的接口代表不同的关注点,不同的职责,甚至是不同的角色。
6.6、合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
经常又叫做合成复用原则,是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对的委派达到复用已有功能的目的。它的设计原则是:要尽量使用合成/聚合,尽量不要使用继承。
6.7、最小知识原则(Principle of Least Knowl edge,PLK,也叫迪米特法则)
不要和陌生人说话。
七、面向对象六视点
7.1)(代码)复用(Reusibility)
将重复的代码封装到类的方法中提供调用。
※软件设计最大的敌人是重复。
※重复的代码会导致解决方案蔓延。
※复用:
✓细粒度
✓封装