1、2018/11/20,1,OOA、OOD和UML,面向对象技术的开发实践,北京理工大学信息学院计算机科学系 金旭亮,2018/11/20,2,主要内容,OOA、OOD与UML基础 Rose如何介入软件开发的全过程 案例:编写一个自己的简化版WinZip 软件开发的哲学思考 待研究的课题,2018/11/20,3,第一部分 OOA与OOD基础,2018/11/20,4,OOA,Object-Oriented Analysis (OOA):面向对象的分析,OOA的侧重点是业务领域分析,与软件所要应用的行业领域相关,而与软件技术关系不大,需要由领域专家进行。这一部分的工作被称为“需求分析”。,201
2、8/11/20,5,OOA的成果,业务领域用例图 活动图 协作图 大量的业务文档资料,2018/11/20,6,OOD,Object-oriented design (OOD),用面向对象的方法为真实世界建立一个 计算机中的虚拟模型,2018/11/20,7,OOD的地位,OOD的主要任务是跨越业务领域模型与可实际运行的软件系统之间的鸿沟。 OOD的难度是非常大的,负责OOD工作的人被称为系统架构设计师,2018/11/20,8,系统架构设计师的任务,确定系统的总体框架-大多采用已有的领域框架 正确理解需求分析得出的领域模型,用面向对象的思想设计出软件体系结构-系统概要设计 分析现实的可获取的
3、技术资源,分解出软件的各个组件,安排好开发任务流程-系统详细设计,2018/11/20,9,OOD的成果,系统中有多少个类? 系统中这些类间有什么关系(系统静态特性)? 系统中这些类生成的对象如何协作来完成工 作(系统动态特性)? 系统中如何管理这些类和对象?,2018/11/20,10,OOP,流行的面向对象语言,Object-oriented Program (OOP),用一种面向对象的语言来实现OOD完成的系统设计,Java、C+、Object Pascal、C#、VB.net,2018/11/20,11,关于OOP,用面向对象的语言编程不是OOP! OOP最重要的特征是面向对象理论的广
4、泛应用 OOP的成果是可运行的实际系统 OOP中掺杂着OOD,OOP与OOD你中有我,我中有你,OOP是具体的OOD,二者的区别就在于应用范围的不同。,2018/11/20,12,OOA、OOD、OOP与真实世界,2018/11/20,13,面向对象理论的再认识,封装,封装体现了数据信息的隐藏,从而使不同模块的信息互不影响,这是OO的一大优点,因为它从类这一程序基本单位开始就支持信息隐藏。,2018/11/20,14,面向对象理论的再认识,继承,相对于结构化编程中的模块重用,面向对象中的继承体系显得更灵活,对代码的控制手段更多,从而推动了代码复用的程度,但却加大了学习掌握的难度。,2018/1
5、1/20,15,面向对象理论的再认识,多态的特点:,所有可以发给base class对象的消息,也都同样可以发给derived class。这是了解面向对象真髓的关键之一。,2018/11/20,16,C+中的面向对象特性,四种编程风范:,结构化编程、基于对象、面向对象、泛型编程,C程序员易犯的毛病:在C+中写C程序。,2018/11/20,17,软件源代码复用的方式,组合(composition)与聚合(aggregation) 继承(inherit),其基本思想是以现有的类为基础创建新的类,2018/11/20,18,STL,Standard Template Library,标准模板库,
6、STL是容器,算法和其他一些组件的集合,2018/11/20,19,泛型编程在OOD中的应用,一种独特的平面型编程风范,大量使用C+的模板技巧 典型案例:STL 在标准的OOD设计方案中引入泛型编程技术,可以起到减少类数目的作用,泛型技术可以看成是C+类的“合并同类项”。,2018/11/20,20,统一建模语言UML,UML,图形化的建模语言,开发者用来为面向对象系统建立模型,具有灵活性与可扩展性,2018/11/20,21,统一软件过程RUP,三大特点:,用例驱动、迭代开发和增量开发,2018/11/20,22,OOAD的强大工具-ROSE,ROSE是采用UML进行软件系统设计的一个CAS
7、E工具,还有其他工具比如Visio,JBuilder7等。,使用ROSE可以保证源代码与系统模型的一致性, 这在软件开发过程中是非常有用的,正向:UML模型软件代码框架 逆向:软件代码UML模型,ROSE支持双向工程,2018/11/20,23,ROSE对软件开发全过程的参与,4+1视图,2018/11/20,24,用ROSE表达系统功能,2018/11/20,25,用ROSE表达软件的静态结构,类图Class Diagram:表明了一个软件中的各个类之间的关系,2018/11/20,26,用ROSE表达软件的静态结构,2018/11/20,27,用ROSE表达软件的静态结构,2018/11/
8、20,28,用ROSE表达软件的静态结构,2018/11/20,29,用ROSE表达软件的静态结构,小结:,用Rose来描述一个软件的静态结构,首先应将整个系统划分为若干子系统或几个组成部分,每个组成部分以一个包来表示。,接着,需要设计具体的类,并用各种关联符号表达出类间的关系,注意,每个类都必须归属于某一个包,这样才便于查找某个类,2018/11/20,30,用组件图描述软件组件,一般用组件图来生成代码,2018/11/20,31,用ROSE表达软件的动态特性,序列图,序列图用于表达对象之间是如何发送消息,何时new一个对象,何时delete它,非常适合表达一种代码流程。,2018/11/2
9、0,32,用ROSE表达软件的动态特性,协作图,协作图比较适合表达类之间的依赖关联,2018/11/20,33,用ROSE表达软件的动态特性,状态图,当系统可以明显地划分为几个不同状态时,状态图可以大显身手,最明显的是ADO 记录集的状态转换,例如:需要给水分子的三种物理状态建模,2018/11/20,34,用ROSE表达软件的动态特性,活动图,活动图最适合表达出一种处理流程,2018/11/20,35,用ROSE表达软件的动态特性,小结:,(1)所有图的最根本目的是要对系统运行过程中的各个对象之间的关系作出确定性的唯一性的描述,从而保证所有开发人员都能对系统有一个统一的认识。,(2)一般在确
10、定了软件的静态结构之后才进行描述系统的动态特性,(3)在任何情况下,保证ROSE模型与实际代码的一致都是至关重要的!,(4)要根据实际情况选择一种合适的图来表达系统,不要强行要求用上所有类型的图,牢记:我们的目的是为了交流!,2018/11/20,36,参考资料,2018/11/20,37,参考资料,2018/11/20,38,参考资料,2018/11/20,39,参考资料,2018/11/20,40,参考资料,2018/11/20,41,参考资料,2018/11/20,42,参考资料,2018/11/20,43,案例研究一,再造一个WinZip,麻雀虽小,五脏俱全,2018/11/20,44
11、,缘起:,用一个规模小的工具软件来说明OOD的实际应用 整个软件完成周期:四天,2018/11/20,45,开发过程,形成软件总体想法:5分钟 形成软件技术想法:5分钟 实验技术想法:1天 设计系统详细设计方案:1天 正式编码和测试:半天,感触:只要有技术积累,再加上合理的OOD,开发一个软件会成为一种很有成就感的创作!,2018/11/20,46,基于组件的用户界面设计,标准的分层体系结构:,2018/11/20,47,功能设想,2018/11/20,48,技术方案考虑,采用C+流技术 采用Borland C+ Builder开发,BCB vs VC,2018/11/20,49,软件的工作原
12、理(一),要编写一个软件,首先要知道人是如何完成某项工作的; 接着,必须分析如何用计算机来完成这个工作,其结果是形成一个计算机算法,这要求有相关领域的理论知识,2018/11/20,50,软件的工作原理(二),计算机中文件的基本类型,2018/11/20,51,软件的工作原理(三),计算机中文件的基本类型,2018/11/20,52,软件的工作原理(四),考虑软件的内部总体数据处理流程,2018/11/20,53,设计过程(一)-资源选择,选择可以复用的代码资源:,C函数库:用fopen()、fclose()等打开和关闭文件,然后,直接在内存中对字节流进行处理,STL:用标准模板库(STL)中
13、的iostream类,VCL:用TStream类,2018/11/20,54,设计过程(二)-接口设计,设计基本的流操作类接口,请参看源代码文件: FileStreamOpt.h FileStreamOpt.cpp,2018/11/20,55,设计过程(三)-利用多态,VCL的TStream类继承树图,注意:接口设计中采用了TStream* 以利用多态,2018/11/20,56,设计过程(四)-数据结构,Struct VS Class,2018/11/20,57,数据结构设计结果,2018/11/20,58,设计过程(五)-数据对象的管理?,OO软件的显著特点之一是如何管理对象,C+技术难点
14、:=运算符重载,STL在数据结构方面有强大的表达能力!,vector VS list,利用VCL的现有特性改善设计,2018/11/20,59,设计过程(六)-功能实现,2018/11/20,60,设计结果,2018/11/20,61,Key:,先进行非可视化功能类的设计 设计过程中要综合考虑各方面的要求,作出综合平衡,然后才能形成可行的设计方案 界面设计放在功能设计方案之后,它的目的是提供一个用户接口以驱动功能类的运作.,2018/11/20,62,界面设计案例:,界面与功能代码的完全分离,2018/11/20,63,用户界面设计(一)-窗体,2018/11/20,64,用户界面设计(二)-
15、灵活性,用户界面编码的分层原则 : (1)不在控件的事件处理过程中书写大量的代码! (2)尽可能减少代码对具体控件的依赖 (3)重复使用的某种功能的控件应被封装成新的控件 (4)考虑窗体间的相似性,巧妙利用窗体的OO特性:继承,多态与重载,一个复杂的控件原则上应新建一个控制类以便于使用,这个控制类的接口成员应是按逻辑来划分而不是按技术来划分的,2018/11/20,65,用户界面设计(三)-健壮性,保证用户界面层以正确的顺序调用功能类,避免一个窗体过于复杂,2018/11/20,66,提高软件健壮性,每一个函数都尽可能地保证是独立完备的、安全的。 程序基本完成后,从最底层的类开始,逐步找出每个
16、对外接口的前条件(前提)和后条件(结果),然后,判断有无可能发生错误,并且决定这些错误应该如何处理,2018/11/20,67,开发高容错程序三原则,预防所有可以预料和防止的错误; 处理所有可以预料但不能防止的错误; 捕获所有不能预料的错误;,代码实例分析,2018/11/20,68,使用ROSE进行正向代码生成,设计类接口 新建一个组件 将类赋与组件 生成代码,2018/11/20,69,使用ROSE进行正向代码生成(1),设计类接口,2018/11/20,70,使用ROSE进行正向代码生成(2),新建一个组件,2018/11/20,71,使用ROSE进行正向代码生成(3),选定组件的语言,
17、2018/11/20,72,使用ROSE进行正向代码生成(4),给组件分配类,2018/11/20,73,使用ROSE进行正向代码生成(5),分配了类的组件,2018/11/20,74,使用ROSE进行正向代码生成(6),生成代码,2018/11/20,75,使用ROSE进行逆向更新,逆向更新的目的是用更改后的代码刷新系统模型文件,以保证系统文档与真实代码的一致性,2018/11/20,76,使用ROSE进行逆向转换,选择组件 打开Ansi C+ specification窗口选择文件 生成模型,2018/11/20,77,用已有代码进行逆向转换(1),新建组件,2018/11/20,78,用
18、已有代码进行逆向转换(2),打开ANSI C+参数设置窗口,2018/11/20,79,用已有代码进行逆向转换(3),加入C+头文件和CPP文件,2018/11/20,80,用已有代码进行逆向转换(4),从菜单中选逆向工程命令,2018/11/20,81,用已有代码进行逆向转换(5),ROSE工程资源浏览器中新生成的类,2018/11/20,82,用已有代码进行逆向转换(6),新生成的类的属性窗口,2018/11/20,83,用已有代码进行逆向转换(7),在类图中显示逆向工程生成的类,2018/11/20,84,OOAD理论总结与思索,2018/11/20,85,软件开发的最重要思维方式,软件
19、开发的最重要思维方式是什么?,抽象!,软件=对象+对象之间的关系,结构化编程时代程序=数据结构+算法,面向对象软件时代,软件=?,2018/11/20,86,组件化时代的软件设计,什么是软件组件?,注意:区分ROSE中的组件与软件理论领域中的组件,可以复用的,具备一定功能的类的组合。,单个类不够资格成为软件组件!,软件组件可以以源代码方式存在,也可以以二进制形式存在,2018/11/20,87,组件化时代的软件设计,OOD设计师制定组件的规范,高级程序员实现这些可复用的组件,现代软件开发已成为组装已有组件的过程,最典型的例子是Java与.net类库,2018/11/20,88,设计模式,大型系
20、统中良好的设计是关键,为开发面向对象的软件提供一个架构,减少了软件设计的复杂度,为软件设计方案的重用提供了可能性,可以避免犯一些常规性的错误,使设计独立于语言,建立了一套软件架构设计师的“通用语言”,在软件开发周期中缩短了设计周期,设计模式(Design patterns),2018/11/20,89,使用设计模式,熟悉模式才能知道如何使用模式,用模式的最好方法就是设计时忘掉所有的模式名,只从实践出发寻找可行的方案,必要时才去翻模式书以获得灵感。,我们用UML来描述模式,ROSE是画图工具,2018/11/20,90,设计模式经典书籍,四个老外权威:Gamma, Helm, Johnson a
21、nd Vlissides,“Gang of Four”四人帮,Design Patterns, Elements of Reusable Object-Oriented Software (Addison Wesley: 1995),提出23种设计模式,创建型设计模式:解决如何创建对象的问题 结构型设计模式:解决类和对象间的结构关系问题 行为型设计模式:解决对象间的动态关系问题,2018/11/20,91,参考资料,2018/11/20,92,参考资料,2018/11/20,93,关于设计模式,设计模式运用时,心中要无模式;关键在于把握其思想。,应仔细研究成熟的设计模式,将其活学活用,模式不是
22、数学公式!,2018/11/20,94,结构化编程与面向对象编程,面向对象的关键是抽象 面向对象分析设计的成功实施要求更高,难度更大:在理解对象基本理论和开发技术的前提下,加上丰富的程序开发实践,才行。 结构化与面向对象方法应该相辅相成,在合适的地方用合适的方法。,2018/11/20,95,结构化编程与面向对象编程,在类的内部代码实现上采用结构化编程的方式:比如:将一个太长的函数按功能分解为若干个小函数,做为类的私有函数,只有在调试代码清除BUG中,才发觉OO的妙处和软件工程理论的无比正确!最重要的是两点:(1)代码隔离;(2)控制模块规模;,2018/11/20,96,对象的存储,对象的存
23、储不应直接与数据库打交道 对象的管理通常都设计控制类采用STL容器进行管理,从数据库记录集生成对象,然后把对象放入STL容器中,是一个很好的设计方案,数据库表的一对多关联,表现为对象之间的组合,多对多关联如何处理?请思索!,2018/11/20,97,对象与关系数据库,对象实例的数据保存在数据库表中,一般一条记录对应一个对象实例,尽量避免一个对象实例的数据分布在不同的表中,这样就加大了移植的难度; 对象与数据库之间的关系问题是OOD与OOP必须解决的问题之一。,2018/11/20,98,数据库表关联与对象的对应,表的一对一关联可直接映射到对象间的一对一关联,2018/11/20,99,数据库
24、表关联与对象的对应,一对多关联,2018/11/20,100,数据库表关联与对象的对应,多对多关联需拆成两个一对多的关联,2018/11/20,101,分而治之的设计方法,“分而治之”是一个基本的方法,简单地说,就是将一个复杂的系统划分为几个子系统,然后,分别处理这些子系统,最后再合成一个完整的系统。 这是西方科学的主要思维方法之一:重视局部与细节,用放大镜去研究大象。,2018/11/20,102,横向与纵向,可以利用多态、模板等机制简化设计,继承是纵向的设计方案,STL是横向的解决方案,继承可以复用代码,模板可以减少类的数量,相互配合才是良好的设计。 基于组件的“搭积木”过程可以看成是将横
25、向与纵向设计相结合的典范,2018/11/20,103,OOD的指导原则,为特定问题产生一个class,然后让它在解决其他问题时,渐渐成长而成熟; 设计Class及其接口,是OOD的主要任务; 开始写程序,让一部分先动起来,以验证设计,或找出难点所在; 保持类的小而简洁,功能明确,Thinking in Javap82,2018/11/20,104,OOAD的哲学方法论,真学问把复杂的问题弄得简单,它的目的是让你能够理解;伪学问把简单的问题弄得复杂,它的目的是让你感到神秘。,不做就学不到,2018/11/20,105,OOAD的哲学方法论,一切都要从实际出发,不迷信老外的一切,相信自己的直觉。
26、采用“拿来主义” 现在的OOD,大多是在采用已有的系统架构基础上修修补补,以达到最大限度地利用现有资源的目的。所以,OOD不是独立于语言与开发工具的。 不存在界限分明的OOD阶段,事实上,OOD是与编码交织在一起的,没有编码作基础,无法进行OOD,不进行编码实践,就无法改进OOD,2018/11/20,106,OOAD的哲学方法论,不管白猫黑猫,逮着老鼠就是好猫。 书本上理论上介绍了许多有用的理论,但一切都要从实际出发,OO不是万试灵丹。,2018/11/20,107,现实的约束:,从实际角度出发,OO到底是省事还是费事?,请拍拍大脑问问自己,我该怎样做? 用自己的大脑思索,不要用别人的大脑思
27、索!,2018/11/20,108,待研究的课题(一):,XML对软件组件技术的冲击(如何用XML重构整个软件体系结构)?,以记录集为中心转为以XML数据为中心 用XML实现跨平台的信息交换 XML如何存储与传递 现有的软件如何转化为以XML为中心的软件,2018/11/20,109,待研究的课题(二),面向对象软件的测试理论:,如何对面向对象软件中复杂的静态和动态关系进行测试? 如何设计测试用例? 测试过程如何管理?,2018/11/20,110,待研究的课题(三),利用新一代的Web Service技术,如何构造一个分布式的多层系统?要实现跨平台的组件调用怎样实现?,如何创建一个横跨Lin
28、ux和Windows的分布式系统?在组件级别实现统一?,2018/11/20,111,待研究的课题(四),可复用面向对象软件代码库的设计,如何构建一个高度可复用的代码库? 参考JDK,STL,.net frameWork,VCL,抽象、概括、总结,2018/11/20,112,待研究的课题(五),计算机技术发展日新月异,实践在不断地提出新问题,这是一个永无止境的过程。大家有没有自己的想法?探索一个别人还不熟悉的领域,把国外先进的东西与中国的具体实践结合起来提高中国软件产业的技术水平,是我们的责任!,2018/11/20,113,结束语,感谢您聆听我的“胡言乱语”,希望没有浪费大家的时间,希望和大家交朋友,共同推动中国软件技术的普及、应用、发展和进步!,联系方式: 金旭亮 北京理工大学信息学院计算机系904教研室 JinXuL,谢谢!,