面向对象设计自从面向对象编程语言成为软件开发的主流以来,遵循面向对象技术特点的软件设计工作也随之发展起来。首先要问一个问题,设计工作是做什么的?其实涵盖范围很广,从收集用户需求,进行业务分析,到绘制系统流程图等等,可以说在写代码之前,程序员要做的就是设计工作。就像建房子一样,先确定要建的房子的类型,然后选址,设计风格。最后,工程师带领施工队按照设计图纸建造了房子。面向对象技术,由于其封装、继承、多态等特点,在对现实世界进行建模时,可以很容易地将事物抽象成计算机可以处理的自然思维数据。关于面向对象技术的详细介绍,请参考之前的文章。学习面向对象程序设计语言的关键是掌握它们的共同结构和特点。明确了要做的事情,有了思维工具,接下来就是如何表达工作结果了。一个相当强大的工具是统一建模语言(UML),它将在下一节中作为入门级介绍。最后通过一个例子来说明如何使用UML来完成面向对象设计中的建模工作。UML概述虽然UML也是一种“语言”,但它实际上是一套图形符号系统。UML的主要作用是在现实世界和程序代码之间架起一座桥梁。这就是UML的“统一”所要求的,所以它的各种图形都有严格的定义。包括形状、连接线的方向、方法和属性的指示等。遵循统一的标准的好处是便于交流。当设计的每个阶段的结果绘制成UML图并保存时,无论是内部团队协作还是外部交流,都省去了大家学习符号符号的时间,可以直接把握设计意图。UML2定义了13种图形,我们可以理解为对于重要的图形,都会给出图表。所有图形均使用bouml工具绘制。用例图:表示系统提供的功能与用户之间的关系。用例图类图:表示类的规范和类之间的关系。类图对象图:表示实例之间的关系。对象图序列图:将实例之间的交互表示为时间序列。序列图活动图:表示一系列过程中的控制流。活动图通信图:将实例之间的交互表示为一种组织结构。CommunicationDiagramStateMachineDiagram:表示一个实例的状态变化。状态机图组件图:表示文件和数据库、进程和线程等软件的实现结构。ComponentDiagramDeploymentDiagram:表示硬件、网络等系统的物理结构。部署图复合结构图:用整体-部分结构表示类的运行时结构。包图:表示包之间的关系。交互概览图:将根据不同条件执行不同动作的时序图放到活动图中表示。时序图:具有数字刻度的时间线,用于表示实例之间的状态转换和交互。什么是建模统一了,使用的图形语言也说了,最后还得说说怎么建模。我们进行面向对象的设计工作,毕竟我们希望计算机能够帮助我们处理那些繁琐重复的工作。那么,我们以汽车租赁业务为例,使用UML工具进行设计流程。我们模仿在线汽车租赁应用程序的实现。为了简化讨论,只提到最关键的功能点。在业务分析阶段,如果用户想租车自驾,第一步就是选择一辆合适的车。比如城市交通,或者郊游等等。选好车后,就到了预约下单的时间了。完成手续后,用户将车开走使用,最后完成还车手续。那么,在分析完以上场景后,就可以通过活动图画出整体流程了。租车业务整体流程需求定义阶段从上面的业务分析我们可以看出,这个在线租车系统可以承担的自动化工作包括显示车辆信息、处理预订订单、离开车辆、跟踪车辆的行驶状态等。车辆,并将车辆退回仓库。使用用例图来显示客户和服务提供者都可用的功能。在汽车租赁业务功能用例系统设计阶段梳理出系统功能点后,就是定义系统中的各个关键对象。车辆对象(Car)是基本单元,所有的租赁业务都必须围绕它展开。接下来是汽车显示对象(ShowCar),它可以从车辆对象中获取可显示的信息,如型号、制造商、颜色等。用户选择车辆后,即可进行预约功能。租赁管理对象(RentServer)将接受订单,收取押金和预付款。当用户取车时,RentServer进行出站处理,并通知车辆跟踪对象(TraceCar)持续监控车辆的运行状态。当用户用完车辆归还车辆时,RentServer会向TraceCar查询车辆状况,确认无误后进行入库处理,并退还用户押金。根据上面的描述,我们可以先画一个类图。租车业务类图从上图可以看出,Car作为系统的基本单元,被其他类聚合使用。关于聚合,这是一种整体与个体的关系,即has-a关系。组合是更高层次的,是一种包容关系。比如汽车和发动机是一种组合关系,因为没有发动机,汽车就无法使用。关联关系比聚合弱一级,但需要注意的是,在程序代码中,关联和聚合的语法是一样的,区别在于语义。这也是UML设计可以包含比代码更多信息的优势。类图表示类之间的静态关系。为了查看对象实例之间的消息调用,还使用了序列图。一步一步来画,先看预约流程的时序图。CarRentalBookingSequenceDiagram接下来是用户还车的时序图。返程车时序图中对象之间的交互已经存在,接下来就是具体方法的实现过程。为了说明一个方法的执行过程,用活动图比较合适。下面选取CheckOut方法来说明其绘制活动图。CheckOut流程活动图至于其他功能,有兴趣的同学可以自己画。实际项目产生的UML设计会复杂很多,但是只要掌握了面向对象设计的概念和UML工具的图形细节,就可以阅读已有的设计或者通过图纸表达自己的设计思想。做起来得心应手。
