[关闭]
@windwolf 2017-04-19T05:09:49.000000Z 字数 2642 阅读 316

Sailing设计点滴

Sailing 企业架构 架构设计


Initializer和Transformer关系的困扰

问题

概念上来说, Initializer用于实体创建时候的值初始化, 而Transformer用于不同类型实体间转换. 但实际场景貌似没有这么清晰的分界线. 比如拿创建明细单的场景举例:

  • 场景一: 明细单允许新建, 完全新建一个明细单, 自己填.
  • 场景二: 从外销合同下推出一个明细单.
  • 场景三: 新建时选择外销合同, 从外销合同读入数据.
  • 补充场景四: 明细单在编辑过程中, 又选择了从商品库中添加一个商品.
  • 补充场景五: 明细单在编辑过程中, 又选择了某个外销合同的商品加进来.

对场景一, Initializer应该能满足要求, Initializer填入的值可以是固定, 来自上下文的, 或者来自配置信息的.
对场景二, 典型的Transformer适用范围, Transformer能提供一对一和集合(一对一, 聚合, 分组)的转换规则.

还需要对场景二做进一步剖析. 如果需要对外销合同的商品进行供应商匹配,然后按供应商分组后分单, 那么对源数据分组是一个过程, 根据分组后的数据创建采购合同数据是另一个过程. 这里讨论的主要是后面一个过程, 怎么进行数据分组专题讨论.

对场景三, 很难说到底是Initialization还是transformation.
这里其实已经出现了一个困扰, Transformer在这里完成的工作不也就是初始化实体吗? Initializer和Transformer到底啥关系?

从某个实体的角度来说, Intiailizer从字面量, 配置值, 上下文这几个途径复制给字段, 而Transformer则是以另一个实体作为源来初始化实体的字段;
从集合的角度来说, Initializer根据元数据创建集合元素, 初始化值之后加入集合; 而Transformer也根据元数据规则, 根据源来创建集合元素.

对于场景四和五, 看起来已经不是初始化过程了, 但添加一个商品的动作里面, 又包含有一定的初始化成分.

image_1b546dg2mp2l1hl2mb119l68be9.png-24.4kB

方案

所以, Initializer和Transformer需要融合! Initializer需要增加Transformer的能力. 也就需要能从源实体中抽取值放入目标中.
落实到最后, 总需要一个字段一个字段的赋值.

Action的执行模型如何为获取视图状态提供方便

下推动作的按源数据分组后生成多个下游单据, 源数据分组的设计问题

将各组件串联成一个功能

最后的可编程性问题

需要提供前后端的嵌入流程的可编程性端口

Form的设计要点

一个完整的表单应该是由若干组件组成的, 这些组件会有以下要求:

综上所述, 可以看出组件的表示实际上分为了表单绑定关系的表示和实际UI功能的表示两个方面. 对表单绑定关系来说, 可以有以下结论:

对实际UI功能来说, 可以有以下结论:

组合这些组件的表单本身也有一些要求:

综上所述, 表单本身也有若干设计决策:

如何避免表单计算公式的循环触发. 例如

单价变化: 总价=单价数量;
数量变化: 总价=单价
数量;
总价变化: 数量=总价/单价;

也许可以利用ReactiveForm中的emitModelToView, emitViewToModel选项. 要试验.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注