天佑武汉,天佑中国。这次为全国人民作出巨大牺牲的武汉人是坚强和担当的。

  这次疫情期间的自我隔离的一个副作用是第一次享受这个超长假期,本来想好好学习一下Web技术的,但家里的唯一一台计算机被占用,不得已只能停下脚步,继续研究一下这个开源项目的领域模型。

  搅拌站的生产管理事是以短期计划为核心展开的,每天生产调度人员根据工地的需求制定针对创建一个“日计划”。实验室人员会为这个日计划创建生产配方。日计划的生产不是连续性的,他会分解成很多小的批次计划。分解批次计划的原因是因为混凝土的交付有很多步骤组成,首先由搅拌站生产,再由搅拌车运输到工地,最后由混凝土泵车泵送到指定的浇筑位置。根据这个生产流程,我们很容易设计出模型的最初版本

  

  再实际生产过程中,针对一些特殊的情况,批次计划会增加一些附加的动作,常见的有,每天第一批次是会额外生产一盘的砂浆(用于泵车输送管的润滑),如果是工地第一次开盘,还要打印质保书。这样在批次计划前应该增加一个批次计划报的对象来包含这些额外的动作。

  

  如果仔细分析以上对象,不管是生产计划还是附加动作或者交付动作,他们都可以被执行或放弃,都需要跟踪执行的结果,本质上都是一个可以被执行的动作对象。并且可以根据动作执行的不同结果(如因为车辆问题,混凝土没有送到工地)可以启动一些补偿或后续动作。再这里我们可以引入动作模式(Martin Fowler 分析模式)。

  

  在动作模式下,我们可以通过提议动作和执行动作更加方便的跟踪动作提议和执行的差异,比如计划给工地送8方混凝土,而因为混凝土质量问题被退货。

  对于动作执行的结果是否成功,最简单的办法是使用一个标准属性。这是方式的弊端在于过于简单,以至于我们只能记录动作是否执行失败,无法记录失败的原因。比如送到工地的混凝土的某几项指标不合格而引起的工地退货。在这里比较好的方法是使用观察模式,可以观察和记录对混凝土的指标的检验记录。并且通过观察的结果来判断动作是否成功。这样可以更加灵活的提供结果的判断逻辑。

  

  在引入了动作模式后,我们就可以使用计划类型来实现对动作的编排和依赖,计划实质上是动作按顺序的聚合(Martin Fowler 分析模式)。

  

  这里我们的日计划和批次计划就可以做为计划的子类型,只不过 需要在日计划类型里增加一个分配批次计划的方法,同时在计划的超类里面增加产量的属性。在分配批次计划的方法里一般需要制定车辆,这样就可以按照车辆的运输能力确定批次的产量。在一些特殊的情况下,也可以不指定车辆,这是预计生产的产量就按车队里所有车辆的最小运输能力设置批次方量。在一些软件中,类似的问题会被放置在词典中,这并不是个好的办法,词典中大量夹杂着领域逻辑的数据,词典本身就是一个令人费解的概念,虽然他能很简单的解决不少问题。最小运输能力应该由领域模型中的服务对象提供。但我们的系统中没有包含车辆管理的逻辑,所有车辆指派的功能准备从车辆管理服务接口获取。即使这样,我们也准备使用策略模式,支持使用内置的的车辆管理领域模型。

  计划的另一个问题是资源的消耗。我们关注的资源主要有生产原料的消耗,生产混凝土的搅拌站,运输的搅拌车和泵送的混凝土泵车。其中混凝土搅拌站作为资源的占用是领域模型的另一个重点,搅拌车和泵车不作为我们的关注的核心对象,搅拌车由其他服务提供管理,泵车作为资源管理对于系统没有什么价值。这样我们就可以使用一个比较简化的资源分配模型。

  

  在资源分配模型中,最核心的是为提议动作分配的预定的资源,而执行动作则是实际消耗的资源,这样我们就可以精确的统计实际消耗的物料,在配合生产动作和交付动作的完成情况,就可以精确的对生产完没交付成功的方量和消耗进行准确的统计。

  以上描述了混凝土搅拌站生产计划模型的初步演进过程,其中大量借鉴了Martin Fowler 分析模式。当然这知识初步的模型,还有很多不合理的地方等着我们去重构。

  在使用领域模型后,每次流程处理和执行会设计到大量的领域对象,这样会对UI层的调用产生巨大的困难,并且当UI层设计到大量的领域对象时,必然会带来领域知识的泄露,为此,我们会在增加一个应用层,来封装对领域模型的调用同时提供简单的接口。现在软件的人际交互的要求越来越高,在这方面,可以通过可页面紧密相关的门面对象(Facade)实现。使用领域模型对数据的存储也是个巨大的挑战,幸好现在有很多成熟的解决方案甚至技术框架能帮我们实现对象到数据库的映射。

  

从桌面到Web - 领域模型的创建的更多相关文章

  1. 从桌面到 Web -- 领域模型

    让我们暂时告别一下 ASP.NET Core 先介绍一下这个虚拟项目.因为我的主要目的是通过一个项目,全面学习一下 ASP.NET Core,所以这个项目时一个很简单的,不具备实际应用价值的虚拟项目, ...

  2. 从桌面到 Web - 二十几天学 ASP.NETCore 1

    这么多年一直从事桌面开发,一直没有时间好好学学  web 开发.感觉自己就像从石器时代走来的古代类人猿.由于工作的调整,现在终于有时间学习一下 Web 开发.出于对技术和框架的熟悉和继承,决定还是学习 ...

  3. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  4. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  5. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  6. ASP.NET Web API 过滤器创建、执行过程(一)

    ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...

  7. ASP.NET Web API 控制器创建过程(二)

    ASP.NET Web API 控制器创建过程(二) 前言 本来这篇随笔应该是在上周就该写出来发布的,由于身体跟不上节奏感冒发烧有心无力,这种天气感冒发烧生不如死,也真正的体会到了什么叫病来如山倒,病 ...

  8. ASP.NET Web API 控制器创建过程(一)

    ASP.NET Web API 控制器创建过程(一) 前言 在前面对管道.路由有了基础的了解过后,本篇将带大家一起学习一下在ASP.NET Web API中控制器的创建过程,这过程分为几个部分下面的内 ...

  9. Web Service 的创建简单编码、发布和部署

    最近,老大准备将已有的C/S架构项目中的通信部分做成通用,需要将其支持WebService为以后项目向着B/S架构升级做好铺垫,为此身为屌丝的我去各种百度WebService是个什么卵玩意,然后逐渐搭 ...

随机推荐

  1. SpringBoot中的五种对静态资源的映射规则

    目录 1.​ webjars:以jar包的方式引入静态资源 2./** 访问当前项目的任何资源 3.首页index.html,被" /** "映射 4.自定义图标 / favico ...

  2. Python中三大框架各自的应用场景(DJango,flask,Tornado)

    django:主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过10000,如果要实现高并发的话,就要对django进行二次开发,比如把整个笨重的框架给拆掉,自己写socket实 ...

  3. 基于Tesseract的OCR识别小程序

    一.背景 先说下开发背景,今年有次搬家找房子(2020了应该叫去年了),发现每天都要对着各种租房广告打很多电话.(当然网上也找了实地也找),每次基本都是对着墙面看电话号码然后拨打,次数一多就感觉非常麻 ...

  4. Linux开发环境及应用—《第三周单元测验》《第四周单元测验》

    三单元 1.vi处于文本输入状态时,按下下列哪个按键可以返回命令状态?C A.^ B.$ C.Esc D- 2.vi处于命令状态时,按下下列哪组按键可以把正在编辑的内容保存到磁盘上?D A.Ctrl- ...

  5. .NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行为不一致问题及解决办法

    行为不一致 .NET Core 3.0 新出了个内置的 JSON 库, 全名叫做尼古拉斯 System.Text.Json - 性能更高占用内存更少这都不是事... 对我来说, 很多或大或小的项目能少 ...

  6. HashMap,HashTable 区别,实现原理。

    HashMap是HashTable 的轻量级,非线程安全的,都是实现了map接口 区别:hashmap 允许空键值对的存在,非线程安全,效率高于hashtable,因为hashtable 是synch ...

  7. JAVA读取yml配置文件指定key下的所有内容

    先引入需要的依赖 <!--读取yml文件--> <dependency> <groupId>org.yaml</groupId> <artifac ...

  8. Vector人工智能机器人SDK使用笔记

    Cozmo是2016年推出的,2两年后的2018年Vector上市,具备语音助手和更多功能,元件数由300+升级到700+. Vector的SDK具体说明在:developer.anki.com/ve ...

  9. es6中的面向对象写法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  10. LR Java脚本编写方法

    之前在某一家银行也接触过java写的性能接口脚本,最近因项目,也需编写java接口性能测试脚本,脑袋一下懵逼了,有点不知道从何入手.随后上网查了相关资料,自己又稍微总结了一下,与大家共同分享哈~ 首先 ...