持续建模,关注业务抽象,以任务分派执行跟踪系统为例
前言:我认为,抽象和封装是面向对象编程思想的精华,这在两年前我已经发过这方面的帖子了。现实中,给无OO建模概念的人员直接交流OO建模是何等困难!他们恪守着数据库建模,代码优先的律令,无论我如何强调关注业务本身,对业务抽象,实现业务软件模型和现实世界映射的重要都无济于事。经常发生的现象可能是:我说的理论性强一些,会被视为花架子,难以实现;我说个简单的需求作为例子,还没有说出如何抽象建立OO模型,别人就数据建模出来了,表示出数据建模方法的高效率,而对OO建模带来的参与者沟通的便利、团队协作开发的保障、应对需求必定变化的优势等优点视而不见。发生这种尴尬现象来自于我的原因,还是笃定的这套理论系统落地实现案例太少,关注业务变化本身的编程思想还不为多数人认同。因此,本人斗胆借用“Just Do It”精神发此贴,将讨论重点放在业务上,说明——挖掘业务需求,抽象归纳是如何适应需求的变化。
但是,我并不否认面向过程编程方法论,并不否认软件实现最终还是要数据库建模。我只是认同坛子里很多人的观点:将数据库建模的战略地位降低一点,作为对象持久化来看待;将代码编写阶段拖后一些,先看看客户需求,以及应对变化需求的解决方法。
正文:唯一不变的是变化。
需求一:
客户要求做一个任务分派跟踪系统,业务流程大致如下:公司经理可以给部门职员分派任务;任务包括任务说明、要求、完成时间等内容;部门职员收到分派的任务之后限期完成,报公司经理办理情况;系统根据任务限期时间,对于未完成任务的经办人发送提醒;系统对于超期完成的任务执行情况进行记录。
一个具体的例子:部门经理要求所有职员在2013年1月1日之前报一份2012年度工作总结。
数据库建模可能是这个样子:任务表(包涵任务Id、任务要求、任务期限、分派人、执行人、完成时间等字段);任务提醒设置表(包涵Id、任务Id、距离任务限期提醒周期(比如距离任务结束还有1小时、8小时、12小时等)、提醒内容);成员表(包涵Id、成员名、账户、密码、职位(经理和职员))。
由于需求明确、简单,代码部分就是实现以上数据库模型的crud操作,那些简单的业务流程完全可以写入crud操作中,例如判断当前时间是否到了该发送提醒未完成任务的经办人时间。
这样做出的软件效率高,同时满足了需求一,假设这个软件成为软件系统一。