面向对象基础

来源:互联网 发布:梅森旋转算法 编辑:程序博客网 时间:2024/06/13 10:29
1、面向对象概述 
1.1、人认识世界的方法 
生活在对象中,从小就这样认识周围的世界,如好人、坏人 
国外,Aristotle 第一个系统地对我们的世界作出科学的分类 
国内,修身、齐家、治国、平天下:儒家提出“格物致知” 
1.2、软件工程发展的需要 
软件规模日益增大 
传统的生命周期法不能将软件生产率提高到所需要的水平。计算机硬件发展速度大大高于软件工程发展速度,硬件的发展急需软件的开发效率提高。例如:Intel推出386的时候,该硬件体系结构就支持Windows的32位操作系统了,但当时普遍还是16位的Dos。 
软件的重用问题 
软件工程师的梦想,象制造业那样有标准件可以拿来就用,进行Assemble。节约人力,提高生产率的重要途径。结构化设计虽然给软件业带来巨大进步,但是没有解决软件重用问题。 
软件维护的难度太大 
统计资料:大型软件的维护成本远高于开发成本,一般是4倍左右;而且软件软件维护的效率比软件开发的效率低几十倍。 
软件不能真正满足用户需求 
生命周期法强调需求的重要性,在进行具体的开发之前,用用户和开发者一致认可得需求规格说明书来进行沟通。但是这存在三方面的问题: 
预先定义的需求假定用户需求不改变。实际上对于大部分MIS系统,需求很难预先确定;用户对需求最初只有模糊笼统的概念。 
用户不可能仅仅从需求规格说明书这些比较冗长和难于检查的文档而得到对未来系统的某种具体面貌。而且,预先定义的需求很可能因为开发时间太长而变化,系统的稳定性和可扩充性不能满足要求。
与OO相比,结构化技术的缺点:功能分解,自顶向下,将复杂的处理层层分解。最低层可用IPO等来描述。P-Process,将功能用过程来表示和构造。分解比较有任意性,不同的人有不同的分法。(耦合和内聚) 而数据和操作是分离的,如DFD。 当需求变化时,功能变化,而该种方法的结构就需要做较大变化。并不是说,面向对象可以解决这些问题,而是说,与传统方法相比,OO在稳定性、可修改性和可重用性方面,更有优势。 
2、面向对象的方法学 
2.1、OO的出发点 
尽可能的模拟人类的思维方式(思维方式?) 
使开发软件的方法与过程尽可能接近人类认识问题和解决问题的方法与工程。计算机求解问题,是借助于某种程序设计语言的规定,对计算机中的实体施加某种处理,并用处理结果去映射解。 
适应现实世界对象的动态性 
汇编语言的对象是存储单元;面向过程的对象是各种预定义的变量。解空间的构造就是对这些对象进行操作;而传统语言提供的解空间对象实质上是静态数据(属性),必须在程序中从数据外部对它施加操作,才能模拟它的行为。(数据和对数据的操作分离)而从动态的观点看,对对象的操作就是该对象的行为,数据和对数据的处理是紧密相连的。 
举例:Class和Record、Struct的区别 
面向对象方法是一种新的思维方法,它不是把程序看成是工作在数据上的一系列过程或函数的集合,而是把程序看作是相互协作而又彼此独立的对象的集合。有自己的数据、操作、功能和目的。 
2.2、面向对象的假定 
客观世界是由各种对象组成 
系统工程的观点,整体-部分;聚合 
可以将对象划分为类(归纳) 
类有层次关系(演绎) 
对象之间的联系仅能通过消息传递(c/s) 
OO=Objects+Classification+Inheritance +Communication with messages 
这是他OO的一个经典定义 
不仅仅指的是OOP,还有OOA,OOD,一整套软件工程方法。 
2.3、基本术语解释 
对象(实例) 
强调两点:1、属性(静态、状态);2、方法或服务(动态、功能) 
定义一:从程序设计的角度:对象是具有相同状态的一组操作的集合 
定义二:从信息模拟的角度:对象是对问题域某个物体的抽象,它反映了该东西的信息或与他交互的能力。 
从存储的角度看,是一片私有存储区域 
对象的使用的一般步骤: 
create 
消息传递,操作 
释放 
方法(操作、服务) 
就是对属性的操作,每个方法提供了对象的一种行为。可以视为传统意义上的模块。 
消息 
消息时对象间的唯一的交互手段。在一个消息传递中,有Sender,Message【destination,operation,parameters】 
Receiver,Message【destination,returnvalue】 举例:dephi 的 button onclick  sender:form,click,nil receiver:button 
消息模式实际上定义了一个对象和其他对象的交互能力,和处理能力,摆脱了传统的控制结构。。。。。。。。 
对象通过接收一个告知它将做什么的消息而被请求完成某一操作。接受者对消息的反应是:首先选择实现该消息名的操作,执行该操作,然后返回控制给调用者。 
封装 
目的是将设计者和使用者分开,盖房子和造砖头的分开 
对象外是一堵墙,看墙内的东西只有通过窗户。方法就是这扇窗户。 
将数据和方法的实现细节对外界隐蔽,减少了当变化发生时,副作用的传播。例如:编程中,修改一个地方往往引发。。。 
便于构件复用;模块性好 
简化被封装对象间的接口。发送消息的对象不需要关心接收对象的内部数据结构,只要知道他的消息模式。在面向过程的语言中,耦合度的分析是十分困难的事情。。。 
继承 
继承的是方法和属性。演绎,四边形和长方形。 
需要一种精细划分的类层次结构,在高层的变化直接就传播到其他部分。 
在语言中,本身的就是VCL和MFC 
长方形is a四边形 ----------四边形:=长方形 
Sender:Tobject的原因所在 
重载 
多重继承,优缺点 
多态 
是同一消息模式的对象,都可以接受这一消息,但会作出不同的反映。 
尤其在继承中,父的消息都可以传递给子类。一个公共的消息可以被共用。 
举例:画图 
动态绑定。 
3、标识对象模型的元素 
如何在一个实际问题中将对象、属性、方法、消息等表示出来。 
3.1、标识类和对象 
考虑问题陈述中的所有名词,细分为 
外部实体 
产生或者使用 被基于计算机的系统使用的 信息 
角色 
和系统交互的人员 
组织 
位置 
系统的运行环境 
结构 
表示某类对象,如计算机,交通工具 
3.2、表示属性 
考虑当前的问题范围内,什么数据项(复合或基本)完整地定义了该对象? 
类似于数据库中设计中的主键。。。非主键 
3.3、定义操作 
动词 
消息通信,对象间传递的消息隐含地表示了存在的操作。
4、基于OO的软件工程方法 
计划-分析-设计-提取可复用类-原型-测试-客户评估 
反复递归,循环