在《软件工程——快速掌握结构化开发方法》一文中,我们讲述了如何用结构化开发方法开发一个简单的项目案例,并重点讨论了在结构化分析和结构化设计阶段使用事件、数据流图模型、数据字典、ER模型、结构图模型完成项目的分析与设计的整个过程。
在结构化开发方法中,利用数据流图模型对系统进行层层分解,将一个大的系统分解为多个程序模块,数据流图中需要存储的信息通过ER图建立数据模型,其功能模型和数据模型是分离的,也就是说在结构化开发方法中,程序和数据是分离的。另外,程序的结构要遵循每个程序模块只有一个入口和一个出口,在程序模块内部只能采用顺序、选择、重复三种基本的控制结构。
什么是面向对象方法?
当前主流的软件开发方法除了前面讨论的结构化开发方法外,还有面向对象开发方法。面向对象开发方法尽可能模拟人类习惯的思维方式来分析软件项目,按照现实世界的问题域来构建解决现实问题的系统。例如在《软件工程——快速掌握结构化开发方法》一文项目案例中,要求开发一款名片自动识别APP产品,按照人类认识一个新事务的思维方式,会把名片看作一个新的事务,名片有哪些属性(名称、职务、地址等)?名片能做什么(交际、拓展人脉等)?就如同我们找一个新工作时,会考虑这个新工作有哪些属性(工资、工作时间、工作类型等)?这个新工作主要做什么(编写程序、销售产品等等)?
面向对象开发方法把系统看作是一起工作来完成某项任务的相互作用的事务集合,事务也称为对象。面向对象开发方法主要有面向对象分析、面向对象设计、面向对象编程三个阶段,分别对应软件开发生命周期的系统分析、系统设计、系统实施三个阶段。面向对象分析识别出系统中的所有对象以及对象之间的关系,在面向对象分析中主要使用的图形模型有用例图和类图;面向对象设计对已识别的对象进行细化,并定义出其全部属性和方法,在面向对象设计中主要使用的图形模型是类图、顺序图;面向对象编程使用具体的语言或环境来实现这些对象。
面向对象开发方法与结构化开发方法完全不同,在面向对象方法中,既没有程序和过程,也没有数据实体和文件,系统只是由对象组成。也可以这么说,面向对象开发方法中的对象是结构化开发方法中的实体、数据和程序模块的组合体,它具有属性和行为,同时可以对系统发出的消息进行响应。
面向对象方法采用的模型主要是UML建模语言,UML从系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、顺序图、协作图、构件图、部署图等九种图。这些图形模型从不同的侧面对系统进行描述。在实际分析和设计中,这九种图形模型不一定全部用到,常用的图形模型有用例图、类图、顺序图、部署图。
面向对象分析
虽然面向对象开发方法和结构化开发方法有很大不同,但前期的系统需求调查是完全相同的。在《软件工程——快速掌握结构化开发方法》一文中,项目经理小王的系统需求调查结果事件列表,完全可以应用到面向对象分析中,下表是小王在名片自动识别APP项目案例中的需求调查事件列表。
表1名片自动识别APP事件
有了需求事件列表,就可以归纳和抽象出系统相关角色了。需要注意的是,角色不是指具体的人和事务,而是表示人或事物在系统中所扮演的角色。例如图书管理系统有管理员和借书者两个角色,小张既可以是管理员角色,也可以是借书者角色。从事件列表中归纳和抽象出来的角色就是系统中要识别的对象。
表1的事件涉及的角色有使用者(用户)、名片、百度图像识别接口、数据库。对识别的角色编号,可以采用字母R开头加序号的编号规则,例如R,R等。下表是角色列表。
表2识别的角色列表
识别出角色后,就可以建立角色用例图了,角色用例图从系统的角度描述了角色(对象)的行为及角色间的关系。类似数据流图要配备数据字典一样,角色用例图也要配备用例规约,用例规约描述了用例图中每个用例的用例名称、参与角色、与其它用例间的关系、前置条件、后置条件、操作流程、输入与输出数据项等内容。下图是表2角色的系统用例图。
图1名片识别APP角色用例图在上图所示的角色用例图中,分别列出了使用者、名片、百度AI接口、数据库角色的用例。角色使用者有、、三个用例,其中和用例依赖于角色数据库的用例;角色名片有和两个用例,其中用例依赖于角色百度AI接口的和角色数据库的用例;角色数据库有用例;角色百度AI接口有用例。
角色用例图确定后,还需要对每个用例配置用例规约,用例规约内容组成没有强制要求,以能够为面向对象设计提供充分的参考依据为原则。下面给出角色数据库用例的用例规约。
表3角色数据库用例规约
角色用例模型分析完成后,下一步的工作就是分析系统中的对象及对象间的关系,描述模型使用UML建模语言中的类图。类图描述了系统对象的名称、属性及行为,以及对象与对象之间的关系。一般说来,前面分析的系统角色就是系统中的对象。当然角色还可以细分,例如数据库角色就可以细分为使用者数据库角色和名片数据库角色,细分后的角色可以继承原有角色的所有行为和属性,这也体现了对象的继承关系。下图是名片识别APP的类图。
图2名片识别APP类图至此,分析阶段的用例和类图的建模已经完成,后续还需要根据用例和类图模型建立界面模型。例如,User类有登录、注册、添加名片的行为,就需要为User类提供执行这些行为的界面模型。有很多图像绘制工具支持界面模型的建模,如常用的PhotoShop等工具。
图3登录界面模型面向对象设计
分析阶段完成后,就可以进入面向对象的设计阶段了。面向对象分析主要关心系统的功能和业务,无需关心与计算机实现相关的内容。到了面向对象设计阶段,就要充分考虑系统体系结构、运行环境、编程语言等与计算机实现相关的内容。例如BS架构或CS架构的设计思路和方案就完全不同,在BS架构中,不同的设计框架其设计方案也不完全相同。
在BS架构中,比较流行的设计框架是MVC框架,它将业务逻辑、数据、界面显示分离的方法来组织程序,业务逻辑放到一个部件或模块中。这样做的好处是,当修改用户界面时,不需要重新编写业务逻辑。MVC框架是模型(Model)、视图(View)、控制器(Controller)的缩写,Model可以理解为实体对象,只有属性没有行为,实体对象的所有行为都放置在控制器中;View可以理解为用户界面,如JSP、aspx页面等;Controller是控制器,负责处理与实体对象相关的业务逻辑,并从视图接收和回传数据到视图。
在UML建模语言中,也提供了一种划分类的方式,分为边界类、实体类和控制类。边界类主要用于描述用户与系统之间的交互对象,例如JSP、aspx页面等,边界类与MVC中的视图对应;实体类主要用于描述具体的实体对象,通常映射到数据库表或文件中,实体类与MVC中的模型对应;控制类主要用于描述系统中业务逻辑,例如分析阶段中类的行为,在设计阶段可以放置到控制类中实现,控制类与MVC中的控制器对应。设计类图如下图所示。
图4名片识别APP设计类图在上面的设计类图中,UserControll类和CardControll类是MVC框架的控制器类,login.jsp、register.jsp、card.jsp前端页面是MVC框架的视图,User是MVC框架的实体类。
给出设计类图后,还需要给出控制器类每个业务处理方法的顺序图,以明确业务逻辑处理过程。下面给出UserControll类register()业务处理方法的顺序图。
图5UserControl类register业务处理方上图给出了使用者注册业务逻辑处理过程,整个过程从使用者进入注册页面开始,涉及到register.jsp页面、UserControll对象、User对象和DataBase对象。
在面向对象设计阶段,除了给出设计类图、顺序图等设计模型外,还需要给出数据库设计、界面设计、软件部署等设计模型,这里就不再一一给出了。
面向对象的编程实现
面向对象的编程实现是在面向对象设计的基础上,将设计阶段的设计模型映射为计算机编程结构。映射工具可以是代码自动化生成工具,代码自动化生成工具可以根据设计类图自动生成类代码。但大部分编码还需要人工来实现,如MVC框架中JSP页面的实现、控制器类的业务逻辑处理代码、服务类的实现代码等。
在面向对象编程过程中,面向对象的封装、继承、多态、抽象等特征已经在设计阶段完成,因此在编程阶段无需考虑对象的封装、继承、多态、抽象等特征的实现。
小总
1、面向对象开发方法与结构化开发方法完全不同,在面向对象方法中,既没有程序和过程,也没有数据实体和文件,系统只是由对象组成。也可以这么说,面向对象开发方法中的对象是结构化开发方法中的实体、数据和程序模块的组合体,它具有属性和行为,同时可以对系统发出的消息进行响应。
2、面向对象开发方法分为面向对象分析、面向对象设计和面向对象编程实现三个阶段。其中最重要的是面向对象分析和面向对象设计两个阶段。面向对象开发方法主要的分析和设计模型是UML建模语言,面向对象分析一般用到UML建模语言的用例图、类图等模型,面向对象设计一般用到UML建模语言的实现类图、顺序图、部署图等模型。