【ASE第三次作业】设计也可以按图索骥

序言

我所在的小组为:12345

选题为:基于订单的家庭工厂协作系统

心得体会

能按图索骥是建模人的追求

从需求建模到设计建模的过程,基本上就是从“我们要做什么”到“我们要怎么做”的过程。一个真实的业务项目,归根到底是要把客户的需求变成代码,这不是一蹴而就的过程。需求建模这一步是要把客户需求从人类语言转换为模型语言;设计建模是要把需求的模型转变为实现的模型;程序编写是要把实现的模型转换为实际代码。因此,整个设计建模过程的要点就是2个:

1. 如何转换来自需求的模型
2. 如何使设计的模型便于转化为代码

而实现这两者的最理想境界就是“按图索骥”——不需要超人的灵感和天才,普通人拿着图(模型)就能够按照固定的套路实现“需求--设计”和“设计--代码”的过程。如果我们实现了这样水准的“按图索骥”,那么软件工程开发就变得简单了。

怎么进行设计建模

在设计建模阶段,我们的方法仍然是并称用例图和类图为本,其它UML图和文档为用的思路。不过由于需求建模已经完成,分析需求已经结束,用例图已经不再需要,因此类图无疑成为了设计建模的不二核心。

在需求建模阶段,类图是一种关系的呈现——思考我们要处理某对象,需要什么类来承载(定义类);我们的对象有什么特点(定义属性);我们的功能需要什么操作,需要哪些类的互动(定义方法和类间关系)。它仍然具有一种抽象性。而在设计建模阶段,类图是要能翻译为代码的具体设计,它需要我们一步一步地捋清楚程序运行过程中需要什么操作,并把每一步都具体化在类图之中。

以功能“订单进度追踪”为例,在需求建模阶段,我们想的是这个功能是由订单中介发出,由控制器用订单的信息计算,因此类图的体现就是Administrator里加入traceProgress(Order order)方法,由Controller类提供一个接口实现。而在设计建模阶段,我就要考虑这个traceProgress的实现需要什么,我发现需要能够知道当前的进度是哪一步,百分比是多少,预计完成时间是什么时候,也就是需要由getCurrentStage(Order order),computeCompletenessRate(Order order)和computePredictTime(Order order)3个子方法完成。其中计算预计完成时间这个步骤在订单风险评估里也出现了,因此这3个子方法不论是逻辑上还是复用上都应该单独呈现。而且计算一个订单的完成时间,由需要进一步去计算每个产品的完成时间,这也是相对独立的步骤……就这样,原本需求建模中的1个方法,在设计建模的精细分析中就被展开了很多。但是这些纯粹功能性的展开如果直接添加到类图里,无疑是庞杂且难以理解的。因此就有了组件图的需求。

在组件这个视角之下,我之前的分析可以统一为“数据分析组件”的具体实现的分析,引入的许多方法和操作并不需要被组件外的人所知,因此我完全可以根据自己的需求在“组件-类图”里进行设计,而后只需要向外提供“订单进度追踪”“完成风险评估”这两个接口就好。——这就是低耦合的面向接口原则的思路了。

具体到每一个类的属性和方法。在需求建模阶段,我们设定好之后并不会多加思考,顶多停留在参数、返回值这种必需品层级。而在设计建模的时候,因为要对实现考虑,要考虑系统的条件约束,防止系统错误,就需要具体的属性描述。比如之前定义了任务的状态,现在就要考虑状态属性究竟可以取哪些值?分别代表什么含义?之前定义了一个方法,它是为了进行订单分配,那现在就要考虑在分配前它的属性应该都是什么样子,分配后又应该是什么样子?因此又学习了OCL来对约束进行科学的描述。

我们团队的得与失

我不擅长考虑“得”,除了按照“正确的方式”划分组件,对关键类和功能绘制状态图、顺序图,写OCL之外,我觉得额外的点就是我们认真在想,想得更多更全;以及我们在进行各个组件的设计之前,对类图进行了全面的沟通,确保每个人对类及其属性的含义没有偏差。

而“失”的部分,我能想到以下3点:

  1. 对需求改动的应对不佳;
  2. 程序编写开始得不够早;
  3. 各人负责的代码对接不流畅。

前2点是很相关的。程序编写不够早可以说是一种设计模式上的问题——我们没有把握敏捷开发或者增量开发的模型思路,在早期(需求分析)阶段的编程不够充分。不充分不是说少,何佳慧同学已经写了3k行的后端代码了——而是说不够有规划。这与第1点又有关系了,在本次设计建模的时候,由于上次答辩时被提及的一个功能点(提前开始准备生产)和设计阶段细捋时的改动(状态属性从string变为double),导致在类图里产生了属性上的变化,从而对何佳慧同学已经实现的数据库部分影响颇大。如果要敏捷或增量开发,虽然我没有去特意学习,但显然地应该是做到已经实现的部分不改或尽量少改,否则提前实现的内容就变得事半功倍,白白辛苦了。因为这一问题,我们在进度上有些滞后,加之考期影响,时间还是很紧的。

第3点是我自己……瞎猜的。在已经踏入实现阶段之后,作为计算机专业知识不足的跨考生,我基本就对项目的进度失去了概念……我个人面临着只懂自学的java,然而不知道如何将自己写的那部分功能与组内各位大佬实现的系统进行对接(前端、后端、数据库)和相应修改的困惑。

posted @ 2021-01-06 22:03  伏羲琴_Ellery  阅读(101)  评论(0编辑  收藏  举报