1 面向对象概述
这是第一节,主要先来确定几个基础的概念.
1.什么是对象
对象(Object)是面向对象的基本构造单元.是一些变量和方法的集合,用于模拟实现世界中的一些事物模型.如一台电脑,一个人,一间房子等.当然也可以模拟一些虚拟的东西,比如一个学号,一个编号,一个院系等.
2.面向对象与面向过程的区别
面向对象"什么做什么"与面向过程"做什么"最大的区别在于,面向对象的重点在于谁发出了什么命令,而面向过程只关心一个命令.
面向对象以对象为基础,以事件或消息驱动对象执行处理.它不像面向过程设计一样以函数为单元,在一开始就需要使用一个主函数,来概适整个程序,像向对象是以部分着手,去构建整个程序.面向对象以数据为中心,使用类作为表现数据的载体,面向过程以功能为中心来捞述程序.
面向对象的程序控制流程以事件或消息来驱动,而面向过程的程序则是以事先预定的程序来执行.所以当需求变化很大的时候,面向过程的程序往往需要重构大部分甚至所有代码,而面向对象则可以轻构解决.
3对象与类
类是对象集合的再抽像,对象是类的实例.可以用一个简单的例子来说明.把中国人当成是一个类,那么你我都是这个类的一个实例.你我等这些中国人的集合抽像成了中国人这个类.中国人是一个虚的概念,而你我是一个实实在在的个体.
4消息和事件
消息是对象与对象之间相互作用的方式.消息一般包括消息的发送对象,消息的接收对象,消息的传递方式,消息的内容,消息的返回五部分组成.
比如张三对李四说:今天我们来喝一杯.
事件是系统预先定义的,通过指定的条件触发的动作.
比如我打一下你的头,你头痛了. 这里我通过"打"这个行为来传递了一个消息对你产生了作用,你触法了"痛"这个事件.
5面向对象的基本特征
抽象:将要描述的事物进行简化,将事物特征进行概括,以事物层次结构来组织模型.
比如:狗.我们在软件中不可能把狗的所有信息都描述出来,我们把它简化为有四条腿,一个头,一个尾巴,还有一个躯杆.
这样我们就像画画一样画出了一个抽象的模型图. 然后对它的特征进行概括,比如它会叫,会吃,会走. 然后狗还分哈巴狗,狼狗等很多种.所以这里又分出了狗的层次.
封装:将对象的状态和行为绑到一起,并且尽可能的隐藏对象的内部细节.
比如:一台电视机,它的所有特征和内部结构都封装起来,我们不需要知道它的内部原理是怎么的,我们只需要知道怎么打开它,怎么换台就够了.
继承:继承是反映客观世界中对象的层次关系.正如上面狗的例子中,我们的狼狗,哈巴狗都继承自一个虚拟的狗的概念中.继承在很大程度上简化了我们的工作,也清淅的展示出了对象的层次关系.
多态:多态是指两个或多个属于不同类的对象,对于同一个消息或方法调用做出不同响应的能力..
比如:当我们手上拿一个蓝球的时候,我们说:走,打球. 对方就能清楚的理解我们指的打球是指打蓝球或不是足球,乒乓球。
2 面向对象方法分析与设计
1.面向对象分析
面向对象分析的目的是知识客观世界并进行建模.
其实在面向对象的分析过程中也是对需求的分析和理解.
使用面向对象分析的过程一般如下:
获取问题陈述-->确定类-->准备数据字典-->确定关联-->使用继承来细化类型-->完善对象模型-->建立对象动态模型-->建系统功能模型
(1) 获取问题陈述就是与用户一起理解系统,搞清楚系统的业务逻辑,发现用户的需求,在这个时候我们应该以一个用户的身份去看待这些需求.很多设计人员在这个时候没有做足功能,导致最后系统的设计和维护异常困难,并开始抱怨起用户的变态要求.在搞清楚系统的需求之后,我们不要马上开始编码,如果在这个时候你都已经写下了几篇代码了,那么恭喜你,以后够你受的了.
(2)当得到了足够多的问题并对其理解之后,我们就可以把问题中承现出来的物理实体和概念描述整理出来,暂时把这些标志成一个类实体.然后清除冗余类和与系统不相干的类.最终得到我们的模型实体
(3)把第二步分析出来的类建立一个数据字典,这个数据字典很有可能会在我们的数据库设计中起到很大的作用.
(4)通过第二步和第三步,我们已经得到了系统中的实体信息,现在我们就要让各个实体信息之间产生联系.
比如在一个学生选课系统中. 学生被定义为一个实体,课程也被定义为一个实体,通过选课这个行为把两个实体联系起来.这个行为由学生来引发.目标为课程,产生的结果是学生是否成功的选了一门课程.通过这样的分析,在以后的设计过程中我们可以很容易的设计出学生类的方法.
1class Student{
2
3 public bool ChooseCurriculum(Curriculum curriculum){
4
5 //.
6
7 }
8
9 //.
10
11}
12
13class Curriculum{
14
15 //.
16
17}
18
(5)使用继承来细化类
使用继承来共享公共属性,以此来对类进行组织,一般可以使用以下两种方式来实现.
自底向上:通过把现有类的共同性质一般化为父类,寻找具有相似的属性关系或操作的类来发现继承.这些结果常常是基于客观世界的现有分类,只有可能,应尽量使用现有概念.
自顶向下:把现有的类细化为更具体的子类.
(6)完善对象模型
设计过程中不可能一次就能正确的设计出需要的,往往会在这过程中加深对需求的理解.往往需要重复前面的过程.
(7)建立对象动态模型
跟据前面几步的对象模型,接着就是建立对象的动态模型
准备脚本:动态分析从寻找事件开始,然后确定各对象的可能事件顺序.
确定事件:确定所有外部事件.
准备事件跟踪表:把脚本表示成一个事件跟踪表,即不同对象之间的事件排序表,对象为表中的列,给每个对象分配一个独立的列.
构造状态图:对各对象类建立状态图,反映对象接收和发送的事件,每个事件跟踪都对应于状态图中的一条路径.
(8)建立系统功能模型
功能模型是用来说明值是如何计算的,标明值与值之间的依赖关系及相关的功能.数据流图有助于表示功能依赖关系.一般建功能模型的步骤如下:
先列出输入,输出值,输入,输出值是系统与外界之间的事件的参数.
建立数据流图,数据流图可说明输出值是怎么从输入值转换的,数据流图通常按层次组织.
2.面向对象设计
面向对象设计是把分析价段得到的需求转变成符合成本和质量要求的,抽象的系统实现方案的过程.
(1)面向对象的准则
模块化:对象就是模块,它把数据结构和操作这些数据的方法紧密地结合在一起构成模块.
抽象:面向对象方法不仅支持对过程进行抽象,而具支持对数据进行抽象.抽象方法的好坏以及抽象的层次都对系统设计有很大影响
信息隐藏:通过对象的封装来实现,对象暴露接口的多少以及接口的好坏对系统设计有很大影响
低耦合:低耦合是设计的一个重要标准,有助于使系统中某一部分的变化对其他部分的影响降到最低.
高内聚:内聚度高的模块很容易理解,很容易被复用,扩展和维护.
(2)面向对象的实用规则
设计的结果应该清晰易懂.
一般到具体结构的深度应适当.
尽量设计小而简单的类.
把设计变动减至最小.
(3)系统设计
系统设计是问题求解及建立解答的高级策略,必须制定解决问题的基本方法.系统设计一般是先从高层入手,然后细化.系统设计要决定整个结构及风格,这种结构为后面设计阶段的策略提供基础.
3 面向对象建模
1.为什么要用UML建模
模型是什么?模型就是对现实世界的形状或状态的抽象模拟和简化,模型提供了系统的骨架和蓝图.
模型有助于按照实际情况或按照所需要的样式对系统进行可视化.
模型能够规约系统的结构或行为.
模型给出了指导构造系统的模板.
对系统用户而言,软件的开发模型向他们描述了软件开发者对软件系统需求的理解.让系统用户查看软件对象模型并且找到其中的问题,可以使开发者不至于从一开始就发生错误.
对软件开发而言,软件的对象模型有助于他们对软件的需求以及系统的架构和功能进行沟通.
对软件的维护和技术支持者而言,在软件系统开始运行后的相当长的一段时间内,软件的对象模型能够帮助他们理解程序的架构和功能,迅速地对软件所出现的问题进行修复.
建模并不是仅对大型的软件系统,甚至一个小型的留言本也能从建模的过程中受益.
2.以面向对象建模为基础的开发模式
软件生命周期可以分为制定计划,需求分析,设计,编码,测试,运行和维护.软件开发模式是跨越整个软件生存周期的系统开发,运行和维护所实施的全部内容光焕发结构框架,给出软件开发活动中各个阶段之间的关系.这里介绍4种常见的开发模式.
(1)瀑布模型
瀑布模型也被软为生存周期模型,其核心思想是按照相应的工序将问题进行简化,将系统功能的实现与系统的设计工作分开,便于项目之间的分工与协件,即采用结构化的分析与设计方法将逻辑实现与物理实现分开.瀑布模型将软件生命周期划分为项目计划,需求分析,软件设计,软件实现,软件测试,软件运行与维护6个阶段.并规定了他们自上而下的次序,每一个阶段都是依次衔接的.
瀑布模型为项目提供了接阶段划分的检查点,这样有利于软件开发过程中人员的组织及管理.瀑布模型在当前阶段完成后才去关注后续阶段,这样有有利于开发大型的项目.然后也存在一定的缺陷.比如当开发成果尚未经过测试时,用户无法看到软件效果,不能得到在开发过程中的及时反馈,增加了项目开发过程的风险.对需求不稳定的项目来说缺乏足够的灵活性.并具要在需求分析阶段要完全确定系统用户所需要的所有需求也相当的困难.
(2)喷泉模型
喷泉模型以对象为驱动,以用户需求为动力.用来描述面向对象的软件开发过程.喷泉模型认为软件开发过程自下而上,各阶段是相互复叠和多次反复的.各个开发阶段没有特定的次序要求,并且可以交互进行.可以在某个开发阶段中随时补充其他任何开发阶段的遗漏.
喷泉模型不像瀑布模型那样,需要分析活动结束后才开始设计活动.设计活动结束后才开始编码.该模型的各个阶段没有明显的界限.开发人员可以同步进行开发,其优点是可以提高软件项目开发效率,节省开发时间.但也使开发过程中需要大量的开发人员,因此不利于项目的管理.此处这种模型要求严格管理文档,使得审核的对度加大,尤其是面对可能随时加入各种信息,需求与资料的情况.
(3)基于构件的开发模型
基于构件的开模型利用模块化方法将整个系统模块化,并在一定构件模型的支持下复用构件库中的一个或多个构件,通过组合手段高速率,高质量地构造应用程序软件系统开发的过程.
基于构件的开发方法使得软件开发就得容易,构件组装模型导致了软件的复用,提高了软件开发效率.构件组装模型允许多个项目同时开发,降件了费用,提高了可维护性,可分步提交软件产品.但也因为采用自定义组装结构标准,缺乏通用的组装结构标准,因而引入了软大的风险.可重用性和软件高效性不易协调,并且由于过分依赖于构件,所以构件库的质量影响着产品的质量.
(4)XP方法
敏捷方法.是近几年兴起的一种轻量级的开发方法,它强调适应性而非预测性,强调以人为中心而不是以流程为中心,以及对变化的适应对和人性的关注.
XP(eXtreme Programming)方法是最引人注目的一种敏捷方法.它规定了一组核心价值和方法,消除了大多数重量型开发过程中的不必要产物,建立一个渐进型开发过程.该方法将开发阶段的4个活动(分析,设计,编码和测试)混合在一起,在全过程中采用迭代增量开发,反馈修正和反复测试.
具有以下优点
采用简单计划策略,不需要长期计划和复杂模型,开发周期短.在全过程中中采用迭代增量开发,反馈修正和反复测试.保证了软件的质量.能够适应用户经常变化的需求,提供用户满意的高质量软件.
讲了这么多枯燥了概念东西,下一节中我们就以结合实例来学习uml中的用例图.
|