精华内容
下载资源
问答
  • 怎么开发业务
    千次阅读
    2022-03-30 00:51:48

    MybatisPlus数据层与业务层快速开发

    package com.vmware.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.vmware.domain.Book;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public interface BookMapper extends BaseMapper<Book> {
    
    }
    
    • MyBatisPlus向数据层提供了快速开发工具类:BaseMapper 包含了基本的增删改查操作
    package com.vmware.service;
    
    import com.baomidou.mybatisplus.extension.service.IService;
    import com.vmware.domain.Book;
    
    public interface BookService extends IService<Book>{
    }
    
    • MybatisPlus向业务层提供了通用接口IService,包含了常用的业务接口
    package com.vmware.service.impl;
    
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.vmware.domain.Book;
    import com.vmware.mapper.BookMapper;
    import com.vmware.service.BookService;
    import org.springframework.stereotype.Service;
    
    @Service
    public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements BookService{
    }
    
    • MybatisPlus向业务层提供了通用实现类ServiceImpl<Mapper,POJO>,实现了通用接口IService的方法
    更多相关内容
  • 业务组件库开发流程

    千次阅读 2021-08-26 19:18:26
    业务组件库必要性项目经过长期维护之后往往会沉淀出很多公共组件,当一个组件编写完成之后,其他维护者想要使用这个组件,了解这个组件是做什么的,应该怎么用,必须再去翻看源码,或者没有压根儿注意到这个组件导致...

    业务组件库必要性

    项目经过长期维护之后往往会沉淀出很多公共组件,当一个组件编写完成之后,其他维护者想要使用这个组件,了解这个组件是做什么的,应该怎么用,必须再去翻看源码,或者没有压根儿注意到这个组件导致重发开发。这个时候一个完善的组件库就很有必要了,可以保障开发者之间进行良好的协作。

    组件库可以帮我们解决以下问题:

    • 业务组件跨项目复用,提升开发效率

    • 统一代码实现,统一代码质量保障

    • 组件库文档提供清晰的使用方式和直观的展示效果

    组件库的组成

    图片

    业务组件构成

    业务组件库是基于基础组件库进行编写的,基础组件库是使用antd。我们会对基础组件针对不同需求进行封装,达到可以直接引用无需二次开发的目的(比如:下拉选择组件,我们会将接口请求数据、选项模糊查询、多语言等封装到组件内部,无需二次开发,接口请求也不需要再散落到各个页面中)。

    目标

    1. 引⼊即可使⽤,⽆需⼆次开发

    2. 完善的文档和组件效果演示,支持代码一键拷贝

    3. 良好的代码质量:使用Jest进行单元测试,保障代码质量

    4. 良好的编码规范和代码提交规范:ESLint、Husky、commit-lint等工具进行校验和拦截

    5. 根据代码提交自动生成ChangeLog

    6. 组件效果演示支持编辑实时渲染(在文档中编辑组件,实时变更展示效果)

    开发计划

    图片

    组件库开发周期

    1. 准备

    • 组件库文档选型评审
    • 首批组件梳理
    1. 开发

    • 本地预览调试

    • 本地构建

    • Jest + @testing-library

    • 目录结构规范

    • 本地开发环境构建

    • 代码规范校验

    • 代码提交规范校验

    • CR和发布规范

    • TypeScript支持

    • 单元测试

    • 组件开发

    • 组件库文档生成

    1. 初次发布

    • 发布和使用初次版本
    1. 迭代升级

    • 业务组件新增

    • 业务组件迭代

    • 组件库文档托管

    1. 可视化构建页面区块和页面

    业务组件库完成之后,就可以尝试低代码了,可以使用拖拽或者图像识别自动生成业务代码

    感谢阅读!欢迎关注微信公众号”混沌前端“,获取推送更新。

    展开全文
  • 项目开发过程中业务流程图的绘制

    万次阅读 2015-08-03 11:32:47
    前言:近来一段时间,忙于整理业务流程图,期间,关于流程图的绘制方法和工具也与内部团队和外部做了心得交流,恰好,个人生活也牵涉在买房,婚礼,户口迁移等流程中。不知不觉,伴随着实践与反思,个人所得的系统...

    224A61255-0图1:用即时贴与白板做的简单流程图

    前言:近来一段时间,忙于整理业务流程图,期间,关于流程图的绘制方法和工具也与内部团队和外部做了心得交流,恰好,个人生活也牵涉在买房,婚礼,户口迁移等流程中。不知不觉,伴随着实践与反思,个人所得的系统知识趋于完整,今儿天气极好,坐在飘窗一隅,听着间或几声鸟鸣歌唱,偶尔瞥一眼窗外的遍地绿荫,真真觉得是个写点什么的日子。所以就整理成文,如果恰好对你有所帮助,那是真真好的。

    真实整理的流程牵涉到公司未公布的计划,不好公开,所以在本文中会借助一个简单的案例替代(这个案例呢,也就是计划写本文前30分分钟才想到的,如有考虑不周,请各位见谅),但是仅传达概念和方法,倒也足够了。恩,甄環体告一段落,咱们开始吧。

    本文会包含几块内容:

    1. 什么是流程图?流程图和其他图表(如线框图,概念图,架构图,用例图)有什么不同?

    2. 为什么需要流程图?

    3. 流程图的分类?

    4. 如何绘制流程图?

    5. 流程图绘制工具

    视篇幅情况,会在行文时略加划分为系列,敬请关注并多多交流。

    第一部分:什么是流程图?

    1. 定义

    了解一个事情,我习惯从它的定义开始。至于为什么,可以参见我之前的博客文章:http://heidixie.blog.sohu.com/161709085.html

    我们因为厌恶十年教育,厌恶背各种定理和定义,所以我发现生活中和工作中很多人都很讨厌给一个事情下定义以及去参考定义。所以你会发现很多人在一起争吵得不可开交,仔细去听,原来是鸡同鸭讲,根本不在一个频道上。对于一个事情的描述,没有一个共同的语言,没有所谓的术语。有定义很好办,你们共同引用一个定义,发现定义有问题,OK,去补充这个定义,并扩展到更多的人群。当然,任何事情过犹不及,我们相互提醒吧。

    那什么是流程图呢?说文解字是一种了解定义的好方法。流程图=流程+图,如下图:

    224AC227-1图2:流程图的定义

    流程:Flow,是指特定主体为了满足特定需求而进行的有特定逻辑关系的一系列操作过程,流程是自然而然就存在的。但是它可以不规范,可以不固定,可以充满问题。所以就会造成看似没有流程。前不久,团队每个人对接一个业务团队去调研流程,反馈给我的流程有一些缺失。询问时,负责人反馈给我的答复是:这一块业务他们没有流程。其实严格意义上讲,业务已经开展,不可能没有流程,只是说没有固定的流程或者你调研的对象也讲不清楚。

    图:Chart 或者 Diagram, 是将基本固化有一定规律的流程进行显性化和书面化,从而有利于传播与沉淀、流程重组参考。

    从定义可以看出,只要有事情和任务,流程就会有,但是并不是所有的流程都适合用流程图的方式去表现,适合用流程图去表现的流程是一定程度固定的有规律可循的,流程中的关键环节不会朝令夕改的。

    2. 流程图与其他图表的对比

    工作中我们还用到或听到很多其他类型的图表,比如交互设计师们经常说的线框图(Wireframes),信息架构图或站点地图(Site Map),,开发工程师们经常说的用例图(Use Case)或E-R图。这些不同的图表要表达的内容有何种差异呢?简单做个对比,如图:

    224A632b-2 图3:流程图VS其他常用图表

    如果要串到某一个项目来说,可以理解成:

    用例图(Use Case):

    表现了一个角色在系统里要完成的活动是什么,比如用户这个角色与ATM取款机的交互过程中,用户需要完成的活动有存钱,取钱,查询等。而存钱这个活动再可以进一步细分为插卡,输入密码,输入金额,ATM吐钞,用户收款,退卡等活动。用例图可以不考虑用户动作的前后次序,而仅仅提取一些关键的动宾短语,映射出系统应该满足的功能点。常用用例图的人是产品经理和开发工程师。

    流程图则表示用户每一个活动的前后次序,比如用户必须要先插入银行卡,才能够输入密码,且流程图必须直接表现出各种异常判断,比如当密码错误时,出现什么提示,密码输入错误超过多少次时,出现什么提示和动作。常用流程图的人是产品经理,设计师,或者任何需要讲述业务如何运作的人。

    信息架构图,站点地图(Site Map):

    表现为了做一个这样的系统,功能与内容的展现层次是什么,比如用户一进去后,欢迎页面的导航如何设计,是否直接出现取款,存款,查询,或者还有别的导航?常用信息架构图的是设计师。但是常用组织架构图的是HR。

    线框图(Wireframe):

    将具体每个界面的内容布局和权重表达出来,且标注出一些交互细节的设计,比如当密码错误后,如何提示下一步动作。常用线框图的人是设计师。

    实体关系图(E-R图):

    则是数据库架构的工作,表示一个业务系统或场景中的实体时间的关系,比如储户与银行卡的关系是归属1对多,通过开卡事件产生关联。一般来讲,用矩形来表示实体,椭圆标识这个实体的属性,比如储户这个实体的属性有:姓,名,手机号码,住址等。而银行卡的属性有:开户行,开户名称,银行卡号等。

    以上的这些图表各自都有领域的专家,我这里就不班门弄斧了。

    那么流程图要体现出他的差异定义,要素是什么?总结出了流程图的6大要素,希望大家能够记住,这6个要素可以在以后的文章里不断回顾,你也可以拿来判断你所看到的流程图是否专业。

    224AA4V-3
    图4:流程图6大要素

    • 参与者:谁在这个流程中?可以是系统,可以是个打印机,更多的指什么角色——一般是有某种工种的人。比如客服同时有小A和小B两人,但是若他们的工作性质完全一样,那么在流程图里只需要写一个客服角色就可以了。
    • 活动:做了什么事,比如点餐,结帐等活动。
    • 次序:这些事情发生的前后顺序如何,哪个任务是其他任务的前置条件?比如客人不结帐,就不会产生送他优惠卡的活动。
    • 输入:每项活动开始取决于什么样的输入物或数据,比如做饭的师傅开始做菜时,需要拿到具体的点菜单。
    • 输出:每项活动结束后,会输入什么样的文档或数据传递给下一方,比如师傅做好菜后,如何让负责传菜的人知道菜已经做好?
    • 标准化:采用一套标准化的符号用以传递你的流程图,从而使受众更快明白。

    关于流程图的标准化,并不是强制的,事实上,我们见过很多种类的流程图,只要能够传递明白任务和次序其实已经归类于流程图了。如下面的图:

    224A64b9-4


    但是若在一个公司的环境下,你的流程图的受众又非常多的话,采取标准化的符号会带来很多交流上的好处,总之你懂的。

    第二部分:流程图的分类?

    常见的流程图有业务流程图(Transaction Flow), 页面流程图(Page Flow)。
    在工作中,作为UED,你可能会发现PD经常谈的是业务流程,而作为交互设计师,我们更多产出的是页面流程图。页面流程图和业务流程图到底有什么关系呢? 先有谁,其次再有谁呢?

    先讲个故事:假设你的梦想是开个中高档的全国连锁餐馆,那么首先你想到的应该不是如何去选址,而是将为何要开连锁餐馆这件事情,以及你的定位,核心竞争力想清楚。是快餐,还是点餐,是连锁还是加盟?定位于社区还是繁华商圈?是川菜还是江浙海鲜?是面向中老年还是年轻人?是家庭主题还是动漫主题?竞争对手是谁?需要什么样的投资?可能的风险是什么?这些都想清楚了,问题都有答案了,所谓战略层要清晰了吧。然后假设你现在分析来分析去,与主要投资方决定了一个方向:面向年轻人的时尚动漫茶餐厅,连锁,但是先在杭州开始第一家,选址定位于年轻人约会,扫街的地域,比如风景区,著名商圈,电影院旁…………等等等等,那么接下来呢?

    接下来就是想办法让这些实现吧?那么需要做什么事情呢?选址?拉投资?搞装修?选餐饮菜单?雇佣员工?每一步怎么去做,时间点是什么?等等的任务拆解以及计划,就需要到战术层了。

    这些事情的执行,总是需要请人的吧?先是核心团队分工去部署各项建设任务,当餐厅开设起来后,就需要组织稳定的运营团队,如服务、卫生、厨房、采购、人事等等,厨房里面还得分工,白案,热菜,冷菜等等吧?每个部门需要设置管理层以及汇报关系吧?所以你的组织结构就诞生了。

    那具体每种角色是如何顺畅合作完成日常稳定的以及突发的各项任务呢?比如,当顾客上门时,谁去引导客人入座,谁去点菜,怎么将点菜的讯息迅速传递到厨房,并分发到酒水间、冷菜间、热菜间?并保证客人尽快能够吃到所点的菜?你必须要考虑各种人员的协作流程,优化效率,所以业务流程就出现了。

    人肉运营了一段时间,没有借助任何点餐系统,你发现也还可以。客人点菜时,服务员手抄写下客人的要求,因为有复印纸,所以服务员能够将副本送入厨房,同时写下餐桌号码。厨房规模较小,负责分配任务的员工看下菜单,分别往冷菜处的黑板上写下需要他们处理的,以及跑到热菜区的黑板上写下待处理的菜品,以及去酒水间报下品名即可。可是随着经营的扩大,以上的人肉方式出现了很多问题,首先,手抄效率太低,顾客频繁换菜,响应来不及,手抄出错,导致经常报错菜。厨房很混乱,不得不多招了几个人专门跑堂。而一旦顾客要加菜,撤菜就更麻烦了,需要找出他们当时点的菜,再进行人工的批注和修改,同时要修改厨房后端的各个黑板……

    所以你们想要开发一套智能系统,取代很多人肉工作,你们请了系统开发团队,他们经过评估,判断从点菜开始,一直到传菜都可以用系统解决。手持终端,能够快速传递顾客点菜需求到打印机,打印系统能够根据顾客点菜的类型进行自动的分单打印,所以热菜间看到自己的热菜菜单,冷菜间看到自己的冷菜菜单,而酒水间看到酒店菜单。当他们准备完毕后,送出,传菜员可以根据菜名与打印出来的单据进行传菜并根据顾客的点菜小票进行核对。这套系统同时必须配备结算系统,将最终确认掉的菜单及消费价格传递到结算前台,收银员能够快速进行操作。

    这套系统最终是需要展现出来的,那么手持终端的界面如何设计?服务员能够用更少的点击完成一个菜的点餐吗?结算中心的界面如何设计?

    通过以上的故事,是不是更明白从战略、战术、业务流程图到页面流程图的关系了?总结下:

    • 先是有一个业务需求和业务目标,也即我们的愿景是什么?(战略)
    • 然后就诞生了我们需要分解出什么样的任务,如何执行战术?(战术)
    • 然后就诞生了需要架构什么部门,岗位去分工协作?(组织架构)
    • 然后就诞生了不同的部门在协作完成某件任务时的业务流程?(业务流程)
    • 业务流程基本稳定后,往往会考虑优化效率,所以会诞生出系统来支持流程,减少人肉环节,促进数据采集(系统愿景)
    • 为了设计这个系统,PD需要思考什么功能能够取代某个环节的人肉工作(功能需求,系统流程)
    • 不管是怎么样的功能最终都会以界面的方式呈现,设计师们会关注用户在系统里的任务流,行为路径,让用户完成任务更加高效愉悦。(页面流程)

    当然,除了业务流程,系统流程,页面流程,还有数据流程被人关注。
    我们平时工作中,还会经常听人谈到泳道图啊,任务流程图啊等等概念,究竟是神马关系呢?

    224AA535-6 图5:流程图的分类

    本文着重于上述流程中的“业务流程图”——并会分享如何绘制泳道图——也即是PD们最多使用,技术们最多参考,UED们最多看到的流程图。

    本来在第四部分会对泳道图的图示以及绘制方法、原则做更详细的说明,但是看目前的篇幅情况,预计会放到下篇,所以先在这里简单说明下吧。

    在工作中,我们经常能够看到两种业务流程图,从表现形式来看,一种很好区分,俗称为“泳道图”的它,在样子上也确实像个泳道,可以有横向的泳道,也会有纵向的泳道。泳道图在某些文档里会被称为“以活动为单位的流程图”,浮在泳道中的都是一个个活动。

    224A64159-7
    另外一种类型是以部门和岗位为单位的流程图,下图中的圆形就代表一个个部门或岗位。矩形代表活动。这种流程图关注事情如何完成的逻辑,但是在体现各个部门的责任上比较弱。如果是某个岗位的人来看,很难像泳道图那样一眼就能看到自己部门的职责和任务。所以现在用得比较少。
    224AC439-8

    再回过头来说泳道图,泳道图有几个关键点:两大维度,活动流转,流程要素。我们会在以后详解。

    224A640J-9

    第三部分:为什么需要业务流程图?

    流程图可以提供一种简单扼要的“缩略俯瞰图”,帮助观众快速了解业务如何运转。它包含了几个关键词:谁,什么时候,在什么条件下,做了什么事情,输入什么,输出什么,输出给谁……

    与系统流程不同,业务流程更关注于业务本身如何运作,讲的是业务故事,包含的是业务规则。而系统流程则是满足业务流程,实现部分流程或全部流程的信息化和系统化。

    所以业务流程是所有环节的前置条件——软件需求分析,信息系统建设也会先进行业务流程的梳理。

    下面表现了业务流程图是如何在三个主要场景中发挥作用的:

    1. 员工培训

    224A64516-10

    图6:流程图的应用场景之一:培训

    在此场景中:流程图能够提供一种快速了解业务如何运作的视图,通过业务流程图,新员工能够快速明白业务的最终目标是什么,中有哪些角色在参与以及他们的职责,以及彼此之间的联接。

    除了培训新员工,在员工轮岗、调职场景中,员工也需要业务流程图参考,明白新的工作内容如何开展,以及自己所处的位置,自己的上游是谁,下游是谁,自己需要交付的工作内容是什么。

    2:流程优化与重组
    224A62N4-11

    图7:流程图的应用场景之二:流程优化

    业务流程重组(Business Process Reengineering)的存在可以明确反驳:存在即合理。事实上,存在的业务流程并未是合理的,有可能是参与的多个角色习惯了某种做法,有可能是变革尚未影响到末端的操作,也有可能缺乏对于运行中的业务流程问题的洞察以及强有力的变革推动——因为要推动业务流程变革,不是某个部门的事情,而是需要流程中各个部门的通力配合。

    更多时候,业务流程优化是自上而下的,但是老板们未必对实际运作的业务流程那么心知肚明,业务流程图能够很好去表现这个“运作模型”。通过看业务流程图,找关键节点的人访问,能够直接切入:为什么要这么做,为什么不这么做?从而探索出更深层次的问题,而不是问:你们现在怎么做?

    通过调研,分析业务流程图,引入更多角色,能够分析出目前业务流程的问题:缺失,重复,风险,效率等等。从而制定相应的优化方案。

    3:信息化的基础
    224ABN8-12图8:流程图的应用场景之三:信息化基础

    正如上文所述的餐馆梦想的案例,信息系统的一项任务就是解放员工的手脚,取代一些重复的人力劳动工作。系统上了之后,不是说业务流程不需要而是经过了一些调整,其中某个参与者变成了系统,或手持设备,或打印机而已。

    那么在做系统的功能设计和系统流程设计时,是不是必须先要了解目前业务是如何运作的呢?从而更好分析分析,更好说明系统在什么环节取代了什么类型的人肉工作?

    所以我们看到的PRD往往也会先以业务流程图开始说明,而叙述一个系统建设的好处时,也可以用以前的业务流程与系统上了之后的业务流程进行对比。根据分析,将愿景中的新的业务流程图背后需要系统的功能点撰写清楚。

    第四部分:如何绘制业务流程图?

    首先绘制业务流程图本身有没有流程?一定是有的。在软件工程学里听说一句话叫:万物皆对象。那么在流程学里,万事皆流程。吃饭难道没流程吗?就吃饭的动作而言,就有流程:拿筷子——夹菜——入口——咀嚼——吞咽。

    有不少同学在这一部份很快想会问一个问题:Heidi,请介绍画流程图的工具吧?

    我个人是工具派,从不否认人工欲善其事,必先利其器的道理。好的工具本身就是一名好的老师,除了技能,也能够教会我们一些理论与理念,这些理念也是“器”中很重要的一部分。其次才是具体的工具应用技能。所以我并不建议直接跳转到工具应用。对于初学者而言,笔与纸永远是最好的入门工具,因为你无需和任何一个陌生的软件较劲。

    那么,绘制业务流程图有没有可遵循的流程呢?我建议可以从下面4步着手。

    1. 调研

    如何快速了解业务运作真相?有没有调研的技巧放送?

    2. 梳理与呈现

    能否快速将调研得到的文字和问题,快速转化为业务流程图?

    业务流程图的标准图示是什么?

    怎么评价一个业务流程图的好与坏?

    3. 评审与确认——能否真正让业务流程图反映现实中的业务?

    4. 归档维护——流程不断变更,业务流程图如何快速响应?

    这些将会在下篇《业务流程图的绘制流程分享(二)》详解。

    第五部分:绘制工具?

    如果不搞工具研讨会的话,这部分比较简单.

    Windows: 线下工具大家常用的就是下面三个:

    小的流程图用用PPT就够了,完了就导出图片或截图。交互设计师们因为常用axure绘制线框图,所以也不必为了流程图去学习新的工具,完全可以用axure的flow控件完成简单的业务流程图的制作。而PD们则常用微软的visio。

    224A610D-13此外,特别推荐一个软件:SmartDraw

    我最近的流程图都是用SmartDraw绘制的,你可以下载一个免费版本体验下。这个工具不仅仅是为了流程图而设计的,几乎上包罗万象:线框图,流程图,E-R图,UML ,韦恩图,甚至甘特图,脑图……没有像很多人推荐就是因为他太庞大了,尤其是里面的模版。大家体验下:
    224AAW0-14

    Mac电脑:

    自然要推荐omniGraffle. 绘制出来的任何图表不知为何总会觉得很美……

    当然,这个软件是可以去www.macx.cn下载免费版的……

    但是不管windows还是mac,除了线下的工具,还有更多线上的选择:

    不过貌似我们对线上工具普遍来说都不太放心,是对服务器,网速,还有对GFW不放心吧。

    1. https://cacoo.com/

    224A64R6-15这个是界面做得最好看的一个工具。我用它来绘制过概念图(Concept map)。如下图即是用以上的工具画的。
    224AC4V-162. http://creately.com/

    224A61356-173. www.lucidchart.com224AAb8-18

    本文装载自:http://weibo.com/heidixie

    展开全文
  • 软件开发业务逻辑

    万次阅读 2014-05-31 18:57:00
    当时我和大家讨论ASP.NET MVC的相关话题去了,就没能加入“业务逻辑”组的讨论,比较遗憾。 其实,一段时间内,我脑子里对“业务逻辑”的概念也是非常模糊的。但在不断地阅读、思考和实践过程

    前言

    记得几个月前,在一次北京博客园俱乐部的活动上,最后一个环节是话题自由讨论。就是提几个话题,然后大家各自加入感兴趣的话题小组,进行自由讨论。当时金色海洋同学提出了一个话题——“什么是业务逻辑”。当时我和大家讨论ASP.NET MVC的相关话题去了,就没能加入“业务逻辑”组的讨论,比较遗憾。

    其实,一段时间内,我脑子里对“业务逻辑”的概念也是非常模糊的。但在不断地阅读、思考和实践过程中,这个概念及其相关的内容才在我脑子里渐渐清晰。我想,很多朋友也许也对这个概念不是很了解,所以愿意结合既有资料和自己的思考,总结一篇关于业务逻辑的概述性文章,一则与朋友们分享探讨,二则也是为自己对业务逻辑的学习做一个总结和提升。因为我还不敢说对业务逻辑内涵及外延理解的非常充分,所以文中如有不当之处,还请各位不用客气,尽管批评就好!

    内容提要

    ===================前篇=====================

    前言

    内容提要

    1、我把业务逻辑丢了!——找回丢失的业务逻辑

    2、细说业务逻辑

      2.1、业务逻辑到底是什么

      2.2、业务逻辑的组成结构

       2.2.1、领域实体(Domain Entity)

       2.2.2、业务规则(Business Rules)

       2.2.3、完整性约束(Validation)

       2.2.4、业务流程及工作流(Business Processes and Workflows)

      2.3、业务逻辑层职责相关争议

       2.3.1、争议一:数据的格式化

       2.3.2、争议二:数据合法性及完整性验证

       2.3.3、争议三:CRUD

       2.3.4、争议四:存储过程

    ===================后篇=====================

    3、业务逻辑的架构模式及实现

      3.1、Transcaton Script

       3.1.1、概述

       3.1.2、分析

      3.2、Table Module

       3.2.1、概述

       3.2.2、分析

      3.3、Active Record

       3.3.1、概述

       3.3.2、分析

      3.4、Domain Model

       3.4.1、概述

       3.4.2、分析

      3.5、各种架构模式的比较及选择

    4、结束语

    参考文献

    1、我把业务逻辑丢了!——找回丢失的业务逻辑

    相信朋友们基本都是软件开发人员。不论身处什么职位,我们的工作都有一个共同的目标——制作软件产品。而所谓的软件产品,一定是在某个领域内去实现某些业务 。如此看来,“业务逻辑”本应和“软件产品”是紧紧绑在一起的,没有业务逻辑,何来软件产品?

    但是,我发现一个奇怪的现象,一说业务逻辑,很多人就无法形成清晰地印象。例如,经典的三层架构:表示层、业务逻辑层和数据访问层,一提到表示层或数据访问层,大家脑子里马上能产生出清晰的概念,但一提到业务逻辑层,就有点模糊了,或者完全不知道其是什么,或者有个模糊的轮廓,但对其具体的职责、结构不是很清楚。真是奇了怪了!我们天天和业务逻辑打交道,搞不清业务逻辑是什么。

    对于这个奇怪的现象,我思前想后,结合自身的教训(我也曾很长时间搞不清业务逻辑),终于弄清楚了其原因——这和我们接触这个概念的途径和认知结构有莫大关系。

    不知道有多少人和我一样,首次接触“业务逻辑”这个概念是从分层架构中的“业务逻辑层”概念开始的,我相信不在少数。事情坏就坏在这里!为了让朋友们直观看清“业务逻辑”的概念是怎么被我们丢掉的,请大家看一个图,这个图展示了很多人对“业务逻辑”的认知过程。

    图 1-1、狭义的认知分解过程

    如图1-1所示,我们先接触了分层架构,然后对每个层产生了初步的认识。其中,由于表示层和数据访问层的代码职责清晰明确,基本能正确认识。但是,由于我们接触的分层架构的Demo大多业务极其简单,又基本是CRUD操作集中型的业务。所以,我们脑子中就产生了疑问:这个所谓的业务逻辑层是干什么的?怎么就简单封装了一下数据访问层的操作?这有存在的必要吗?由于有了这种“先入为主”的误导,使得很多朋友脑中将“业务逻辑”和“业务逻辑层”两个概念混淆了,始终想不明白这东西到底是什么,做什么用的。再加上很多朋友所看的、所做的系统都是CRUD操作集中型的,就形成了“业务逻辑貌似就是对数据访问操作的简单封装”这一片面概念。

    到底这一概念有没有错呢?其实没错,因为在简单的、CRUD操作集中型软件中,业务逻辑基本就是对数据访问简单的封装。但是,无错不代表全面,这是一种狭义的业务逻辑理解,而且是狭义中的狭义。为什么这么说呢?因为我们不但是在“业务逻辑层”这么一个狭义范围内去理解业务逻辑,而且还是CRUD集中型操作这种“非常瘦”的业务逻辑层范围内去理解,所以,可谓是在狭义的基础上的狭义。

    当我们把这么一个“狭义中的狭义业务逻辑”与“业务逻辑”等同起来时,误会、迷茫、困惑、不屑就出现了。这就如同,给你一只温顺的哈巴狗,还是病怏怏的、无精打采的小哈巴狗,而你把这只“病怏怏的小哈巴狗”与“狗”的概念等同起来了。那么你一定就会为有人养狗看家和警察养狗当警犬抓坏人而困惑:这东西这么弱小,我一脚就踩死了,怎么弄用来看家和抓坏人呢?进而可能会产生“狗狗无用论”,“狗狗废品”等观念。当然,在现实中,很少有人只见过小哈巴狗而没见过狼狗等其它狗类,所以,故事中的误会对 “狗”一般是不存在的。但在现实中,确实有很多人只见过业务逻辑中的“小哈巴狗”,却没有见过业务逻辑中的“狼狗”、“藏獒”,所以,这种误会在对“业务逻辑”的理解上广泛存在。

    那么,广义的情况究竟是怎么样的?请看下图。

    图 1-2、广义的认知分解过程

    (注意!凡是不特别说明,下文中所有“数据”一词都指需要持久化的数据,而不包括内存中的临时数据。请各位留心。)

    如图1-2所示,广义的认知分解应该是这样的:软件产品都是在某个领域内实现某些特定业务,所以,软件产品天生应该分解为界面交互部分和业务逻辑部分,其中业务逻辑部分是软件产品的核心,它客观存在于软件产品内部,但是无法对使用者产生直观刺激,因此业务逻辑不能与使用者直接交互。而界面交互部分是业务逻辑与使用者进行交流的接口,使用者通过界面交互部分,与业务进行交流,从而使得软件产品发挥其作用。

    而在具体实现系统时,界面交互部分演化成表示层,业务逻辑部分演化成业务逻辑层。所以,可以认为,数据访问层不是软件产品自然演化的直接产物,之所以出现数据访问层,是因为某些产品的业务属于“数据操作集中型”业务,为了实现隔离、复用等目的,架构师从业务逻辑中分离出了频繁使用的数据访问业务,形成了单独的数据访问层。从广义来说,可以认为数据访问隶属于业务逻辑,因为,数据访问操作实际上也是业务逻辑的一部分。

    总结一下几个要点:(这几个要中的业务逻辑均指广义业务逻辑)

    1)软件产品自然的可分为界面交互部分和业务逻辑部分。

    2)从空间结构上看,业务逻辑和数据访问不是并列关系,而是隶属关系——数据访问隶属于业务逻辑。虽然在具体系统实现层面,数据访问层和业务逻辑层是并列存在,但从概念本质层面上分析,两者是隶属关系。

    3)从时间结构上看,应该是先有业务逻辑的概念,才有数据访问的概念。业务逻辑衍生自软件本身,数据访问衍生自业务逻辑。

    4)因为业务逻辑是软件产品自然的一部分,所以拥有业务逻辑是软件产品的必要条件(读者可以试着举出一个不包含业务逻辑的软件)。但是一个软件可以没有数据访问,如“计算器”、“不带存档的小游戏”等。

    利用以上论述要点和认知分解,朋友们可以试试在脑中重新构筑狭义和广义“业务逻辑”的概念。看能不能把我们丢掉的业务逻辑概念找回来。关于业务逻辑更多的细节,将在下文中讨论。

    2、细说业务逻辑

    2.1、业务逻辑到底是什么

    在第一大节里说了那么多,相信各位基本已经形成“业务逻辑”的概念了。如果我在这里再啰嗦什么,我不嫌累各位也要嫌烦了。所以,这里我仅给出两个定义。

    广义上的义务逻辑——软件本身固有的一种品性,自然存在于软件产品内部,是软件具有的在某个业务领域内的逻辑,是软件的核心和灵魂。软件产品除界面和交互外的一切都可看作是广义业务逻辑。

    狭义上的业务逻辑——等同于分层架构中“业务逻辑层”的职责,是软件中处理与业务相关任务的部分,一般狭义上的业务逻辑不包含数据持久化,而只关注领域内的相关业务。

    对于以上两种定义,希望朋友们不要割裂开来看,而 要辩证统一的去看,这样,才能构建一个完整而辩证统一的“业务逻辑”概念。在下文中,将不再明确区分狭义和广义,“业务逻辑”一词将代表两者的辩证统一体。

    2.2、业务逻辑的组成结构

    业务逻辑作为一个高层次概念,其内在结构也是非常丰富的,下面我们深入其里,去探寻一下业务逻辑都是由哪些更底层的部分构成的。

    2.2.1、领域实体(Domain Entity)

    通俗的说,领域实体就是这个领域内有哪些东西。例如,银行业领域内有账户、支票、前台营业员等实体;B2C电子商务领域有商品、订单、交易等实体;魔兽世界游戏的领域内有角色、种族、道具、魔法等实体;高等代数领域有矩阵、行列式等实体。

    领域实体是某个领域内各种对象的抽象,可以用名词表示(可以是具体名词或抽象名词,甚至动名词,只要其具有名词性),构成了整个业务逻辑的骨骼和静态模型。一般每个领域实体有自己的一些属性和行为。 顺便说一句,领域实体的存在时OOA&D的基础。

    在具体的软件系统中,领域实体往往会根据架构的不同有不同的映射存在形式。

    其中一种叫做Business Object(BO),即业务对象,某些文献称其为“充血实体类”,这种对象完整抽象了领域内的某个实体,封装了此实体相关属性和行为。在面向对象的设计和架构中,这种实体类很常见。

    另一种叫做Data Transfer Object(DTO),某些文献称其为“贫血实体类”,其特点是仅有属性,不存在行为。这种实体类主要负责整体性传递数据。另外,与BO不同的是,DTO可以不抽象领域实体的全部属性,而只根据需要抽象一部分。例如,某个“User”实体存在很多属性,但如果某个方法仅需要其联系方式,可以设计一个DTO,仅有id,email,address,phone等就够了。在面向过程的设计和架构中,这种实体设计比较常见。

    2.2.2、业务规则(Business Rules)

    业务规则就是某个领域内运作的规则,构成了整个业务逻辑的灵魂和动态模型。业务规则作用于领域实体,领域实体遵从业务规则进行运作。

    如:在银行领域内,“转账时从A账户扣除相应款项,在B账户添加相应款项,并从A账户扣除相应手续费,并通过某些途径通知A和B账户的户主”就是一条规则。需要注意的是,业务规则比较抽象,并不是需求,需求需要具体且无二义性,而业务规则只是抽象的一种描述,例如,通知户主的途径是什么?电子邮件?电话?短信?并没有具体描述,但在规则中有“通知”这一项,因此不能将业务规则等同于需求。

    2.2.3、完整性约束(Validation)

    领域实体和业务规则构建了业务逻辑的主体,但在这主体之上,还存在着一个限制,这就是完整性约束。

    完整性约束是对业务领域中的数据、规则的强制性规定与约束。这种约束是系统正常运转的保证。

    如“账户密码不能为空”,“身份证号必须符合具体格式规定”,“转账流程必须具有原子性,A账户扣钱、B账户存钱、A账户扣除手续费、通知户主四项操作必须要么都做,要么都不做”,都是完整性约束。

    2.2.4、业务流程及工作流(Business Processes and Workflows)

    有了上述三项,业务逻辑还不能正常工作,因为还没有“启动器”和“过程托管器”。设想我们有了各种实体类,它们有各自的属性和行为,也有定义好的业务规则和完整性约束。现在实体类仅仅具有实现业务规则的能力,但它们如何启动并交互协调完成业务规则呢?因此我们需要有东西去触发和协调实体。

    业务流程或工作流是启动及托管协调领域实体完成既定规则的过程。例如,“在线订购”是一个业务流程,它包括“用户登录-选择商品-结算-下订单-付款-确认收货”这一系列流程。各个实体如会员、订单、商品等已经包含了完成在线订购必要的行为,但仍需一个流程,才能真正完成业务。

    具体到程序中,业务流程也许通过一个方法来实现,这个方法负责启动并协调各个实体类,完成一个流程。

    2.3、业务逻辑层职责及相关争议

    2.3.1、数据的格式化

    关于数据的格式化应该放在业务层进行还是表示层进行一直存在争议。我个人的意见是这样的:

    业务层送给表示层的数据应该具备以下要求。1)返回的数据应该完成了所有必要的业务处理和业务计算。 例如,若返回订单信息让表示层展示,会有个必要的数据——订单总额。这个数据需要首先用各个订单项的单价乘以数量,然后加和。那么,这个数据应该在业务层完成计算直接返回,总之不应让表示层进行任何业务处理和计算操作。2)一次性返回所有需要的数据,避免表示层再一个Action里调用多次业务。 打个比方,例如订单中有个“客户姓名”,这个数据不保存在订单表中,而是通过外键关联的,那么,业务层应该将“客户姓名”一并取出返回给表示层。总之,避免表示层在一个Action里多次调用业务层。3)不携带任何格式信息,仅仅是结构良好的纯净数据,如DTO形式。 因为,数据如何展示,是表示层的职责,如何在业务层中返回了过多格式信息,就会造成表示层的修改困难。例如,我曾听说过所里承接的一个实际项目,开始是使用B/S,当时他们的业务层返回的数据全都附带了html代码。后来,客户嫌B/S响应不够迅速(可能是客户公司的网络条件不好),要求改成C/S,当时全傻眼了,貌似几乎修改了整个业务层。那个项目相当庞大,7个子系统,投入200人开发了1年多,想想修改的难度吧。

    2.3.2、数据合法性及完整性验证

    一般做系统,都避免不了数据验证。上文曾经提到,完整性约束是业务逻辑的一部分。如此看来,数据验证一般应该放在业务层。但是,实际情况并不尽然。个人认为数据验证的方式,目前没有统一标准,可以根据需要放在表示层或业务层。但是,我个人不提倡在“表示层的服务端”放置过多完整性验证。因为,表示层的职责应该仅仅是接收数据并传递给业务层,不应对数据是否合法负责。过多的数据验证,不但令表示层代码臃肿,而且使得表示层职责变得不明确。

    可以在“表示层的服务端”放置一些简单的验证,如空值验证,两次输入密码是否一致等,但业务关系紧密的验证,最好放在业务层。甚至有些验证只能在业务层验证,如“当前用户名不能与已有用户名重复”,这种验证需要访问持久化数据,需要由业务层完成。

    这里之所以强调“表示层的服务端”,是因为一般在B/S系统中,都会在JavaScript里加入一些基本的数据验证,如空值检查,格式正则匹配等。这主要是为了减轻服务器负担,将大多数显然包含不合法数据的请求拒绝掉,而不发给服务端验证。当然,因为可能会出现JS被屏蔽或黑客恶意攻击行为,所以,所有验证不论JS中是否验证过,服务端(可能是表示层的服务端部分或业务层)一定要再进行验证。

    2.3.3、CRUD

    CRUD,即常说的增删改查操作。关于CRUD是否是业务层的职责,一直也是争议不断。因为目前并没有权威的定义,所以这里我斗胆说一下我对这个问题的看法。还请大家批判性阅读。

    一说到“增删改查”,大家一定会觉得这理所当然是数据访问层的职责。我认为这个理解是对的,但是只对了一半!之所以这么说,是因为“增删改查”有两个层次含义。

    第一个层次,是数据访问层次上的。在这个层次上,“增删改查”只是单纯的数据库操作,“增删改查”可以理解为“插入一条记录,删除一条记录,更新一条记录的信息,获取一条或多条记录”四个操作,其意义和着眼点完全是数据访问层面上的,不带有任何业务成分和业务知觉。这个层面上的CRUD应该属于数据访问层的职责。

    第二个层次,是业务逻辑层次上的。在这个层次上,“增删改查”是业务领域内实体的变化以及一系列相关反应,“增删改查”可以理解为“领域内新增一个业务实体,领域内去掉一个业务实体,领域内一个业务实体更新了信息,得到领域内一个或多个业务实体的信息”。

    两者最大的不同,是业务层面上的增删改查往往不是单纯的增加减少,还包括实体变化后相关的业务流程。下面举个例子:

    “添加一个新的订单”——这是一条典型的“增”操作。在数据访问层面上,它的意义是“在表示订单的数据表里增加一条记录”;而在业务逻辑层面上,它的意义除了“领域内多了一个订单实体”外,还可能包括“根据业务规则判断是否是重复下单,根据金额对下订单客户的等级做相应提升、发送Email和短信通知客户等”。可以看到,业务层面上的“增”可能不仅是简单封装一个简单的插入记录,可能还要去做其他数据访问——提升用户等级,以及做一些非CRUD的业务操作 ——发送短信通知。

    在许多稍微复杂的系统中,业务往往不仅仅是封装了一条数据访问操作,而是还有很多如计算等业务处理,一个业务操作期间可能要多次使用数据访问操作。退一步说,即使某个业务仅仅封装了一条数据访问操作,其意义和层面也是不同的,在数据访问层面,仅仅是多了一条记录,而业务逻辑层面,是领域内多了一个业务实体。也许其本质上都是往数据库插入一条记录,但人类的抽象思维可以将之在不同层面上区分,这也是人类思维层面的一种抽象能力的表现。例如,我们知道太阳升起不过是地球自转使得从背阴面转到了向阳面,但当人们看日出时,很少有人会说“看!我们从背阴面转到向阳面了!”,我们会说“看!日出!”,这就是同一事物的不同层次表现。

    2.3.4、存储过程

    也许是性能上的诱惑,许多人喜欢在数据库系统中写很复杂的存储过程。这样,许多业务操作就被写到存储过程中去了。我个人建议,除非对性能要求极高,否则最好还是不要用存储过程实现业务。例如,在一般的系统中,某个业务操作可能需要1秒,而是用了存储过程只用0.1秒,看上去存储过程将效率提高了10倍。但对大多数用户来说,1秒和0.1秒的差别并不大,但是这样做的话,业务会变得十分不容易维护。所以,我个人觉得,除非十分必要,还是不要用存储过程实现业务。

    3、业务逻辑的架构模式及实现

    Martin Fowler在《Patterns of Enterprise Application Architecture》一书中,总结了四种企业应用中业务逻辑的组织方式 :Transcation Script,Domain Model,Table Module及Service Layer,另外,本书的第十章“Data Source Architecture Patterns”中包含一种模式——Active Record。结合软件体系结构的近期发展及个人的理解,我更倾向将Active Record归入业务逻辑的组织模式,而Service Layer应该不算做业务逻辑特有的模式,所以,在本文中,将介绍四种模式:Transcation Script,Table Module,Active Record及Domain Model。

    3.1、Transction Script

    3.1.1、概述

    Transction Script(以下简称TS)是一种面向过程的业务逻辑组织方式。这里首先要强调一点,这里的Transction一词与数据库系统中表示“事务”的 Transction没有任何联系。TS是将领域中的业务分解为一个个业务过程,每个过程实现一项业务功能,具体到程序中,一个业务过程往往映射到一个方法。TS是完全面向过程的业务组织模式,适合应用于业务逻辑较简单的场合。

    应该说,我们见到的绝大多数系统都是以TS组织业务的。例如PetShop及Oxite等经典示例。有时为了方便维护,开发者会将同一领域实体相关的业务方法集中到一个类中,这里虽然用到了领域实体和类的概念,但和面向对象没有任何关系,完全是面向过程的。

    当使用TS时,可以不需要数据访问层,而是将数据操作执行代码(如执行SQL或存储过程的代码)直接嵌入在业务方法中,有时为了复用性和维护性可以编写一个helper类封装数据库的操作。当然这并不是说TS不能配合数据访问层使用,但由于应用TS的场合一般业务非常简单,如果配合Repository或 ORM使用,业务逻辑层往往就会变得非常“瘦”,看起来仅仅是对数据访问层的封装。一般在需要支持多数据库的场合,要配合Repository和 Abstract Factory使用。

    TS的示意图如下所示:

    图3-1、 Transcation Script架构示意

    可以看到,在TS中,业务层并没有面向对象的东西。也许会用到类,但类只是组织业务方法的模块,每个模块中有一个个业务方法,每个业务方法完成一个业务流程,完全按面向过程结构组织。

    3.1.2、分析

    • 什么时候可以用TS?

    应该说,如果具备以下条件之一 ,你可以考虑TS:

    1)系统业务十分简单直观,并且频繁变动的可能性不大

    2)工期很紧,需要尽量压缩设计的时间,尽快投入编码

    3)不能熟练掌握和使用OO进行系统的设计与开发

    4)厌恶OO,就是喜欢面向过程

    • TS的优点?

    1)设计阶段投入较小,启动耗费低。因为TS较容易掌握,使用起点低,所以使用TS的初期投入较少

    2)在业务比较简单直观的情况下,TS结构的代码直观易懂,具有良好的可维护性

    • TS的缺点?

    1)容易造成代码冗余。因为各个业务自行组织流程,所以减少了复用的机会,可能产生重复性代码

    2)因为TS天生不适合业务复杂的系统,当系统业务较复杂时,可能会令业务层代码繁杂不堪

    3.2、Table Module

    3.2.1、概述

    Table Module(以下简称TM)同样是一种面向过程的业务逻辑组织方式,与TS不同的是,TM更贴近关系型数据库结构。在TS中,一般使用DTO等进行数据表示和传递,其着眼点一般在单个对象。而TM一般根据数据表组织业务模块,每个模块对应一个表,其中包含了这个表的相应处理。并且在业务层内,使用库-表结构的对象进行数据操作,做到最大限度与数据表的对应。业务组织一般按照面向过程组织。

    一般当业务相对简单且业务基本集中在CRUD操作时,可以考虑TM。使用TM意味着使用数据驱动设计。通常自己实现一套库-表结构操作对象的库是难度比较大的,所以一般选用TM时,所使用的平台应该包括这么一套库。如.NET平台上的ADO.net就内置了丰富的库-表操作,DataSet,DataTable,DataAdapter等在TM架构的实现中可以起到非常方便的作用。

    使用TM后,一般不需要再配合Reponsitory或ORM,因为此时的业务层也是面向过程和面向关系型结构的,无须映射。

    TM的示意图如下:

    图3-2、Table Module架构示意  

     

    在使用TM后,业务代码中往往有各种对象对应数据库中的库、表、记录、字段等元素,并提供类似关系数据库的操作。

    3.2.2、分析

    • 什么时候可以用TM?

    如果同时 具备以下条件,你可以考虑TM:

    1)系统业务较直观,以CRUD操作比较集中

    2)整个开发的指导思想是数据驱动

    3)所选用的平台有成熟的库-表操作库支持

    • TM的优点?

    1)类似关系数据库的数据操作方式非常直观,使得设计和编写数据操作功能的代码简单高效

    • TM的缺点?

    1)TM需要完全的数据驱动,从业务到UI传递、存放数据都要以表结构形式,造成一定程度上的不灵活

    2)当业务并非CRUD集中型操作,特别是领域模型和数据库表模型差异较大时,使用TM组织业务的难度非常大

    3.3、Active Record

    3.3.1、概述

    Active Record(以下简称AR)是一种面向对象的业务逻辑组织方式。AR适用于在业务较简单的情况下,应用面向对象思想进行设计。它的基本思想就是将领域中每个实体抽象出一个业务类(BO),然后,将这个实体的数据和行为封装成类的属性和方法。特别的,将CRUD功能也封装进BO中。也就是说,AR中的BO同时具备业务方法和持久化功能。其本身具有ORM的特性,其内部要处理关系实体间的关联问题。

    使用AR时,一般最好有相应框架支持,否则完全手工实现AR有点麻烦。像Castle框架中就有AR功能,Linq to sql也有AR的意思。使用AR后,一般不需要再单独使用数据访问层。

    AR的组织架构如下图:

      

    图3-3、Active Record架构示意

    从图3-3中可以看出,AR对业务领域进行了一个简单的OO抽象,将各个实体抽象为AR业务对象,AR业务对象内含有数据、业务方法及数据访问相关的 ORM方法。另外,AR业务对象要维护实体间简单的一对多和多对多等关系。

    3.3.2、分析

    • 什么时候可以用AR?

    如果同时 具备以下条件,你可以考虑AR:

    1)系统业务较直观

    2)想尝试使用或习惯于使用OO进行系统设计与实现

    3)平台上有成熟的AR框架可以用

    • AR的优点?

    1)使用OO的方式进行设计与实现,能在一定程度上避免冗余代码问题)

    2)使用AR后,与某个实体相关的数据和业务全部集中于AR业务对象中,模块内聚性好,便于维护

    3)实践证明,AR结构的业务层编码效率很高

    • AR的缺点?

    1)AR仍需要关注数据之间的关联,在一定程度上带有数据表和影子,没有完全摆脱数据驱动,所以当业务领域和数据库结构差距大时,实施困难

    2)AR的CRUD是以个体为粒度的,当进行批量操作时,如一次查数千个数据,如果严格尊从AR就需要生成数千个AR业务对象,这简直是场灾难。所以在有大规模查询的情况下,可以考虑使用TS配合AR

    3)如果业务非常复杂,AR将力不从心

    3.4、Domain Model

    3.4.1、概述

    Domain Model(以下简称DM)是一种适合领域驱动和为复杂业务系统组织业务的面向对象业务逻辑组织方式。前面三种架构模式都有一个共同的缺点——不适合业务复杂的系统。那么何为复杂何为简单?很抱歉,我给不出明确答案,而且我估计世界上任何一个人都很难给出标准的无争议答案。因为软件系统中的复杂和简单本身就是一个难以量化的指标,很多时候,只能靠专业人员的经验了。

    我个人估计,世界上95%的软件系统其业务难度都不会超出上述三种模式的能力范围,而若你不幸遇到剩下的5%,恐怕目前只有Domain Model能帮你了。Domain Model是一种纯面向对象的业务架构模式,它的核心思想是获取领域中的各种实体抽象,然后完全按照现实领域中的情况去建模和运行。并且业务对象是“持久化无知”的。 关于“持久化无知”下面细讨论。这个模式十分复杂和难以掌握,但一旦掌握并使用,其能力绝对会超乎你的想象。

    下面看一下DM的架构示意图:

      

    图3-4、Domain Model架构示意

    从图3-4中可以看出,DM看上去是个十分纠结的模式,而实际上,它确实很纠结!实际上,我认为如果能熟练掌握并运用DM进行业务逻辑的组织,那这人绝对是架构师中的大师级人物(我目前是做不到)。

    还是先结合图示分析一下DM中的要点。

    第一,DM中的业务对象是纯业务对象,不含数据访问操作。这个可以和AR中的业务对象对比一下。也就是说,DM中的业务对象是纯业务对象,它们只关注与业务的实现。

    第二,DM的组织内部对象多,关系复杂,而这种关系不再只是那种简单的一对一、一对多的关系,而是领域中的各种依赖和关联的抽象,关系类型多,非常复杂。

    第三,DM需要业务部分“持久化无知”。所谓持久化无知,指业务部分只需执行业务功能,而不必关系持久化。在使用DM时,必须设计一套ORM机制(注意这里用到了“机制”一词,而不是“框架”或“库”),使得在业务系统运行时,自动在必要的时候执行数据持久化操作。这也是为什么上图数据源和业务层间的箭头是虚线的关系。

    上文曾说过,DM要最大程度模拟现实情况。而现实世界和软件世界最大的区别就是现实世界是“内存无限大、永不停机的”,可以把现实世界看成在一个无限大内存里永不停止运行的程序。而软件世界不同,它的内存有限制,我们不能将所有对象都放在内存,而且一旦掉电,它就会停止运行,正因如此,我们才需要持久化机制去配合DM模拟现实世界。为了让业务更接近现实,它必须对持久化过程毫无感觉。而一套持久化机制默默为其营造了一个好似内存无限大、永不停机的环境,因此DM才得以发挥威力。

    第四,DM往往需要Services Layer的配合。因为DM内部仅有一个个业务对象,它们互相调用,并没有提供一个友好的接口与UI交互,所以在使用DM时,往往在其上对各种UI需要的服务进行封装(回顾一下Facade模式),形成一个Services Layer,以方便与UI交互。

    3.4.2、分析

    • 什么时候可以用DM?

    如果同时 具备以下条件,你可以考虑DM:

    1)系统业务极为复杂

    2)有功底扎实和经验丰富的精通OO的架构及设计师

    3)项目经费和时间充足

    4)贯彻领域驱动设计

    • DM的优点?

    1)完全的OO思想运用,将使你享受到OO的所有优势

    2)应付复杂业务的强力杀手锏。如果DM运用得当,将会使得复杂业务被高效解决

    • DM的缺点?

    1)使用门槛极高,难度极大,如果团队中没有精通OO和系统架构且经验丰富的专家很难实施

    2)设计过程极为复杂,可能会导致设计瘫痪

    3)如何设计良好的ORM机制辅助DM是一大难题

    3.5、各种架构模式的比较及选择

    相信看过上文内容后,各位一定对各种业务组织模式及其特点、优劣、应用场景有了清晰地认识,如果我在这里再喋喋不休讨论各种模式的比较及如何选择,难免有侮辱各位智商之嫌O(∩_∩)O~,所以这里我只给大家呈现一幅决策网络图,以期起到一个梳理和归纳总结的作用。

    图3-5、业务架构模式决策网络

    (郑重声明:图3-5为本人原创,并非摘录自已有文献,因此此图的选型流程仅代表个人意见。由于笔者水平有限,不能保证此图一定合理和正确。因此在实际选型时请多多参考已有文献及咨询相关专家,此图只起总结归纳和探讨作用,不作为任何指导和规范。若因遵循此图选型而给项目带来的任何经济及其他方面损失,笔者不承担任何责任。)

    4、结束语

    本文通过两篇文章的篇幅,先后介绍了业务逻辑的定义、相关理论及经典的业务逻辑相关的架构模式。本文中阐述了不少已有理论,亦掺杂诸多个人理解及看法。因此请各位在阅读时多进行批判吸收,同时参考以后经典文献及书目综合理解业务逻辑,切勿仅看我一家之言。

    另外,由于本文仅仅是综述性文章,不能具名业务逻辑的各个方面,在深度上也基本是浅尝辄止。因此,若希望深入理解业务逻辑,可以看到相关经典书籍及文献。

    参考文献

    [1] [意]Dino Esposito, Andrea Saltarello, .NET软件架构之美英文版(原名Microsoft .NET Architecting Application for the Enterprise), 人民邮电出版社, 2009

    [2] [美]Martin Fowler, 企业应用架构模式影印版(原名Patterns of Enterprise Application Architecture), 中国电力出版社, 2004

    [3] [美]Mclaughlin, Pollice, West, 深入浅出面向对象分析与设计影印版(原名Head First OOA&D), 东南大学出版社, 2007

    [4] Google, www.google.com


    来自:http://www.uml.org.cn/zjjs/201008021.asp

    展开全文
  • 再如,在选择以COBOL语言实现的各类产品时,要考虑市场上开发人员数量少,需要承担更高的迭代成本等。 2.2 java技术架构图 java 各种架构图汇总: ...
  • 近日,EAWorld汇聚专家智慧重磅推出《重塑》直播栏目,首期即聚焦金融领域数字化转型及建设低代码开发平台的演进历程,介绍了金融低代码开发平台建设要点与方法论。访谈问题概览:1. 金融低...
  • 大数据开发主要做什么?

    万次阅读 多人点赞 2021-05-05 13:14:22
    写在前面 本文隶属于专栏《100个问题搞定大数据理论...各层中功能模块的技术实现会根据实际业务场景不同而有所变化,但仍然是围绕着储存数据和数值计算这两大核心功能来进行的。 因此,大数据开发的作用主要集中在以
  • 作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的...一个微服务的系统,除了docker平台、K8S编排框架、Kubesphere云治理平台之外,还有被治理的业务系统,业务系统是的各种功能,是以微服务的...
  • 本篇试图通过观察Dapr的状态管理基块的具体工作流程,来表明挎斗是如何迫使开发人员专注于业务的。 分布式日志组件 缓存组件 消息队列组件
  • 也谈SAP业务顾问如何避免被ABAP开发顾问怒打   近期一个视频火了,说是中国平安一个产品经理和APP开发人员在办公室直接扭打起来。据说是因为该产品经理向程序员提出了一个需求,要求用户APP的主题颜色能根据手机...
  • 项目里有非常多的重复代码,例如UI业务逻辑,一般来说都会生成Manager、Module、View层代码,这是基本的MVC架构 Manger层负责数据维护,对照Proto把CS和SC通信代码都写上 Module层如果有变化则从Manager拿数据并...
  • 很多开发者为天天写业务代码无暇提升技术而焦虑、苦恼,比如: 又如: 又如: 再如: 那么,作为开发者,到底该怎么面对“写业务代码”这件事呢? 今天我们就从以下几个方面聊聊这个话题: 什么是...
  • 为何现在响应式编程在业务开发微服务开发不普及 主要因为数据库 IO,不是 NIO。 不论是Java自带的Future框架,还是 Spring WebFlux,还是 Vert.x,他们都是一种非阻塞的基于Ractor模型的框架(后两个框架都是利用...
  • webview标签是一个内置组件,用途:承载网页的容器。会自动铺满整个小程序页面。 谨记:个人类型的小程序暂...然后找到一个业务域名的配置区域就可以了,配置好域名之后你就可以,打开你要跳转的H5页面链接了。对了...
  • 1. 了解业务安全的背景及重要性。 2. 掌握业务安全测试流程。 3. 掌握理解业务建模和流程梳理的处理思路。 4. 掌握风险点识别的内容。
  • 一面的时候: 手撸一段代码,题目大概是,给你一个二维整数矩阵,求最长递增序列的长度 ...三面(业务主管面): 先让你自我介绍,然后根据简历简单问你一些项目相关的问题(项目的流程,某个项目这么...
  • 企业级的应用架构:企业层面的应用架构起到了统一规划、承上启下的作用,向上承接了企业战略发展方向和业务模式,向下规划和指导企业各个IT系统的定位和功能。在企业架构中,应用架构是最重要和工作量最大的部分,他...
  • 管理任务的血缘关系,是为了帮助用户理顺数据的来源去向,更好的分析和开发业务;简单来说,只要对提高业务开发效率和质量有帮助的数据,都可以成为优先管理的对象。因此集成开发环境在这方面的建设目标,也就是围绕...
  • 复杂业务系统的架构设计思路

    千次阅读 2020-12-13 12:53:55
    最近有一些系统设计方面的思考和...比如电商的商品管理、订单交易等系统的开发和重构,业务相对复杂,开发人天在几个月以上,直接开发可能会老虎啃天,无从下手。 这时候可以通过一个流程化的模板来指导,如果抽象..
  • 程序员到底要不要懂业务

    千次阅读 2020-08-09 12:20:11
    给非互联网行业从业者科普一下,互联网公司一个项目团队的标准成员组成和职责分工:项目经理、架构师、产品经理、核心开发人员(TL)、开发、测试、运营(或业务方)。 项目经理:一般是经由PMO发起项目后,由一个...
  • 在项目前期及需求分析阶段,开发人员致力于“降低成本”,以最小的代价完成项目,其可预见性的软件产品是经过系统平台升级的,并经过改良的第二个办公业务流程管理平台。按客户验收要求,“只能打60分,是不能给予...
  • 什么是业务逻辑?

    万次阅读 多人点赞 2018-09-04 20:32:07
    不同的项目有不同的功能,不同的功能需要不同的实现,实现这些核心功能的代码就叫业务逻辑 比如让你实现一个功能,给你两个数,让你获取它的和,你所写的如何才能获得任意给定的两个数的和,这个程序实现过程即可...
  • 区块链业务系统开发指南 一、区块链 简介 区块链,就是一个又一个区块组成的链条。每一个区块中保存了一定的信息,它们按照各自产生的时间顺序连接成链条。这个链条被保存在所有的服务器中,只要整个系统中有一台...
  • 软件开发工具

    千次阅读 2022-02-07 20:39:44
    业务系统建模、分析和设计工具、程序设计工具、测试工具、原型设计工具、用户界面设计工具、 维护工具
  • BRMS业务决策系统Drools动态规则实战

    千人学习 2019-05-08 23:46:37
    1、BRMS业务决策系统实战课程, 2、采用springboot2.0以及drools7.20进行实战开发业务决策系统。 3、纯实战项目课程,课程不涉及基础的drool讲解 4、通过前端或者API接口进行动态创建、维护规则,业务系统通过API...
  • 5个步骤,打造你的业务中台

    千次阅读 2020-04-13 16:15:49
    业务抽象阶段,通过业务调研和业务分析,设计业务蓝图和抽象业务元素,为下一阶段的中心建模阶段准备顶层思想和业务素材。这一阶段,根据企业不同的实际情况,可轻可重。比如企业已经做过咨询调研和流程梳理工作了...
  • 企业业务逻辑常见风险

    千次阅读 2021-01-12 15:06:07
    开发人员的安全意识薄弱(只关注功能的实现,而忽略了用户使用过程中个人行为对Web应用程序业务逻辑功能的安全影响)和开发代码的频繁迭代导致了这些平台业务逻辑级的无休止的安全风险。业务逻辑漏洞主要是开发人员...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,438,056
精华内容 575,222
关键字:

怎么开发业务