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

  这次疫情期间的自我隔离的一个副作用是第一次享受这个超长假期,本来想好好学习一下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. TCP/IP||动态选路

    1.动态选路 动态选路协议用于路由器之间的通信,当相邻路由器之间进行通信,已告知对方每个路由器当前所连接的网络,就产生了动态选路,在Internet之间采用了许多不同的选路协议,Internet是以一 ...

  2. HashMap 原理解析

    HashMap是由数组加链表的结合体.如下图: 图中可以看出HashMap底层就是一个数组结构,每个数组中又存储着链表(链表的引用) JDK1.6实现hashmap的方式是采用位桶(数组)+链表的方式 ...

  3. mysql主从之keepalive+MySQL高可用

    一 keepalive介绍 1.1 keepalived 是什么 keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障. 1.2 keepalived 工作原理 keepa ...

  4. 美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

    本文首发于微信公众号:程序员乔戈里 public class testT { public static void main(String [] args){ String A = "hi你 ...

  5. 手写vue observe数据劫持

    实现代码: class Vue { constructor(options) { //缓存参数 this.$options = options; //需要监听的数据 this.$data = opti ...

  6. windebug(转载别人的节选)

    问题一:WinDBG分X86和X64两个版本 如果你用的是32位的WinDBG,那直接打开就行:你如果用的是64位的版本,那么如果调试64位代码也直接打开,如果调试x86的代码,要使用Wow64下的W ...

  7. Ado.net总结-Command(指挥官)

    Command 概述 在 System.Data.SqlClient 命名空间下,对应的 Command 类为 SqlCommand,在创建 SqlCommand 实例前必须已经创建了与数据库的连接. ...

  8. 【转】Hive Data Manipulation Language

    Hive Data Manipulation Language Hive Data Manipulation Language Loading files into tables Syntax Syn ...

  9. ArcEngine 创建线要素图层

    在创建要素图层的时候,默认的几何类型是Polygon: Dim objectClassDescription As IObjectClassDescription = New FeatureClass ...

  10. phpstudy nginx设置CORS跨域不起作用的可能解决方法

    今天搞了半天的跨域问题,想通过nginx配置跨域,希望以后本地调试程序都不用为这件事烦心.无非就是设置几个请求头: add_header Access-Control-Allow-Origin *; ...