关于面向对象(OO)程序设计的思想,如今把它记下来。c++
----OOA算法
Object-Oriented Analysis(面向对象分析方法)是肯定需求或者业务的角度,按照面向对象的思想来分析业务。例如:OOA只是对需求中描述的问题,进行模块化的处理,描述问题的本质,区别每一个问题的不一样点相同点,肯定问题中的对象。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所须要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。编程
分析:
OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。在这种方法 中定义了两种对象类之间的结构,一种称为分类结构,一种称为组装结构。分类结构就是所谓的通常与特殊的关系。组装结构则反映了对象之间的总体与部分的关系。
定义属性:
OOA在定义属性的同时,要识别实例链接。实例链接是一个实例与另外一个实例的映射关系。
OOA在定义服务的同时要识别消息链接。当一个对象须要向另外一对象发送消息时,它们之间就存在消息链接。
OOA 中的5个层次和5个活动继续贯穿在OOD(面向对象的设计)过程当中。OOD模型由4个部分组成。它们分别是设计问题域部分、设计人机交互部分、设计任务管理部分和设计数据管理部分。
----OOD
面向对象设计(Object-Oriented Design,OOD)方法是OO方法中一个中间过渡环节。其主要做用是对OOA分析的结果做进一步的规范化整理,以便可以被OOP直接接受。
OOD的目标是管理程序内部各部分的相互依赖。为了达到这个目标,OOD要求将程序分红块,每一个块的规模应该小到能够管理的程度,而后分别将各个块隐藏在接口(interface)的后面,让它们只经过接口相互交流。好比说,若是用OOD的方法来设计一个服务器-客户端(client-server)应用,那么服务器和客户端之间不该该有直接的依赖,而是应该让服务器的接口和客户端的接口相互依赖。
这种依赖关系的转换使得系统的各部分具备了可复用性。仍是拿上面那个例子来讲,客户端就没必要依赖于特定的服务器,因此就能够复用到其余的环境下。若是要复用某一个程序块,只要实现必须的接口就好了。
OOD是一种解决软件问题的设计范式(paradigm),一种抽象的范式。使用OOD这种设计范式,咱们能够用对象(object) 来表现问题领域(problem domain)的实体,每一个对象都有相应的状态和行为。咱们刚才说到:OOD是一种抽象的范式。抽象能够分红不少层次,从很是归纳的到很是特殊的都有,而 对象可能处于任何一个抽象层次上。另外,彼此不一样但又互有关联的对象能够共同构成抽象:只要这些对象之间有类似性,就能够把它们当成同一类的对象来处理。
OO方法以对象为基础,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换。这是OO方法最主要的特色和成就。OO方法的应用解决了传统结 构化开发方法中客观世界描述工具与软件结构的不一致性问题,缩短了开发周期,解决了从分析和设计到软件模块结构之间屡次转换映射的繁杂过程,是一种颇有发 展前途的系统开发方法
----OOP
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个可以起到子程序做用的单元或对象组合而成。
OOP: Object Oriented Programming,面向对象的程序设计。所谓“对象”在显式支持面向对象的语言中,通常是指类在内存中装载的实例,具备相关的成员变量和成员函数(也称为:方法)。面向对象的程序设计彻底不一样于传统的面向过程程序设计,它大大地下降了软件开发的难度,使编程就像搭积木同样简单,是当今电脑编程的一股势不可挡的潮流。
OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现总体运算,每一个对象都可以接收信息、处理数据和向其它对象发送信息。OOP 主要有如下的概念和组件:
组件 - 数据和功能一块儿在运行着的计算机程序中造成的单元,组件在 OOP 计算机程序中是模块和结构化的基础。
抽象性 - 程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。
封装 - 也叫作信息封装:确保组件不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才能够访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。
多态性 - 组件的引用和类集会涉及到其它许多不一样类型的组件,并且引用组件所产生的结果得依据实际调用的类型。
继承性 - 容许在现存的组件基础上建立子类组件,这统一并加强了多态性和封装性。典型地来讲就是用类来对组件进行分组,并且还能够定义新类为现存的类的扩展,这样就能够将类组织成树形或网状结构,这体现了动做的通用性。
因为抽象性、封装性、重用性以及便于使用等方面的缘由,以组件为基础的编程在脚本语言中已经变得特别流行。Python 和 Ruby 是最近才出现的语言,在开发时彻底采用了 OOP 的思想,而流行的 Perl 脚本语言从版本5开始也慢慢地加入了新的面向对象的功能组件。用组件代替“现实”上的实体成为 JavaScript(ECMAScript) 得以流行的缘由,有论证代表对组件进行适当的组合就能够在英特网上代替 HTML 和 XML 的文档对象模型(DOM)。
面向对象编程技术的关键性观念是它将数据及对数据的操做行为放在一块儿,做为一个相互依存、不可分割的总体——对象。对象相同类型的对象进行分类、抽象后,得出共同的特征而造成了类。面向对象编程就是定义这些类。类是描述相同类型的对象集合。类定义好以后将座位数据类型用于建立类的对象。程序的执行表现为一组对象之间的交互通讯。对象之间经过公共接口进行通讯,从而完成系统功能。类中声明的public成员组成了对象的对外公共接口.
什么是oop的基本思想呢?把组件的实现和接口分开,而且让组件具备多态性。不过,二者仍是有根本的不一样。oop强调在程序构造中语言要素的语法。你必须得继承,使用类,使用对象,对象传递消息。不关心你继承或是不继承,它的开端是分析产品的分类,有些什么种类,他们的行为如何。就是说,两件东西相等意味着什么?怎样正确地定义相等操做?不仅仅是相等操做那么简单,你往深处分析就会发现“相等”这个通常观念意味着两个对象部分,或者至少基本部分是相等的,据此咱们就能够有一个通用的相等操做。再说对象的 种类。假设存在一个顺序序列和一组对于顺序序列的操做。那么这些操做的语义是什么?从复杂度权衡的角度看,咱们应该向用户提供什么样的顺序序列?该种序列 上存在那些操做?那种排序是咱们须要的?只有对这些组件的概念型分类搞清楚了,咱们才能提到实现的问题:使用模板、继承仍是宏?使用什么语言和技术?gp 的基本观点是把抽象的软件组件和它们的行为用标准的分类学分类,出发点就是要建造真实的、高效的和不取决于语言的算法和数据结构。固然最终的载体仍是语言,没有语言无法编程。stl使用c++,你也能够用ada来实现,用其余的语言来实现也行,结果会有所不一样,但基本的东西是同样的。处处都要用到二分查找和排序,而这就是人们正在作的。对于容器的语义,不一样的语言会带来轻微的不一样。可是基本的区别很清楚是gp所依存的语义,以及语义分解。例如,咱们决定须要一个组件swap,而后指出这个组件在不一样的语言中若是工做。显然重点是语义以及语义分类。而oop所强调的(我认为是过度强调的)是清楚的定义类之间的层次关系。oop告诉了你如何创建层次关系,却没有告诉你这些关系的实质。