This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -618,18 +618,18 @@ function hide_canvas() {
<p><img src="assets/7a2481f0-b125-11e9-be4b-8fba8dbeacaa" alt="img" /></p>
<h4>避免领域概念的混淆</h4>
<p>在分析促销模型时我发现模型中的促销产品概念并未处于同一个抽象层次多种促销产品之间甚至存在混合关联。例如作为“促销产品”的折扣Discount或现金抵用Reward可以单独针对一次促销提供也可以和同为“促销产品”的券Coupon进行捆绑同时作为“促销产品”的礼品卡Gift Card和券均可以提供同为“促销产品”的赠品或者包邮。</p>
<p><img src="assets/85167aa0-b125-11e9-b4ee-0fb151ab86cd" alt="79569179.png" /></p>
<p><img src="assets/85167aa0-b125-11e9-b4ee-0fb151ab86cd" alt="png" /></p>
<p>既然出现如此混乱的关系,就说明打折、现金抵用、赠品和包邮等概念并非一种促销产品,它们其实应该是<strong>促销产品的一种属性</strong>。我将这种属性称之为“促销产品类型”。例如,券的促销产品类型若为折扣,就是折扣券,若为现金抵用,就是现金券。它们都是券,差异在于促销产品的类型不同,而非促销产品不同。</p>
<p>在电商系统的促销策略中诸如折扣、现金抵用之类的促销手段未必需要通过券或者礼品卡的形式呈现它们其实可以直接作为促销产品而被单独使用。但在领域分析建模过程中我们不允许概念层次的混乱且必须避免领域概念的二义性。例如对于折扣Discount到底是促销产品还是促销产品类型必须分辨清楚。</p>
<p>在之前识别的促销产品概念中,到底哪些属于促销产品,哪些属于促销产品类型呢?既然后者是前者的一种属性,我们就可以将促销产品视为促销产品类型的载体。因此,只要分辨出这些概念的主次关系,就可以做出正确的划分。在前面给出的混合关系模型中,显然,券和礼品卡才是主要概念,折扣、现金抵用、包邮与赠品都是次要概念。</p>
<p>促销产品和促销产品类型不是随意搭配的例如“包邮”就既不属于券产品又不属于礼品卡产品。如此一来还需要针对这些概念建立一层抽象这个抽象概念与券、礼品卡处于同一个抽象层次。这个抽象的促销产品概念就是“优惠Special Offer”。由此得到的模型为</p>
<p><img src="assets/9600ec60-b125-11e9-b4ee-0fb151ab86cd" alt="80005181.png" /></p>
<p><img src="assets/9600ec60-b125-11e9-b4ee-0fb151ab86cd" alt="png" /></p>
<p>优惠概念的获得遵循了建模原则——保证分析模型中的概念遵循单一抽象层次原则Single Layer Abstraction Principle。单一抽象层次原则本是 Kent Beck 在 Smalltalk Best Practice Patterns 一书中提到的。他认为一个方法应该执行一个确定的任务,方法由多个处于<strong>相同抽象层次</strong>的操作组成形成“组合方法Composed Method”模式。方法如此领域模型亦当如此因为它们都是针对任务进行逐级分解的过程。正如苹果、西瓜可以和土豆处于同一个抽象层次水果和蔬菜的抽象层次则在它们之上。如果将苹果与蔬菜放在同一层自然会造成概念的失衡状态正如让“包邮”和“折扣”与“券”放在同一层是失衡的。</p>
<h4>知识级和操作级</h4>
<p>当模型变得渐趋复杂时《分析模式》引入了操作级Operational Level和知识级Knowledge Level两个层次来组织模型中的概念。操作级模型记录该领域每天发生的事件知识级模型则定义了操作级对象的合法配置以及控制着结构的各种通用规则。知识级和操作级之间并没有非常清晰的鸿沟但 Martin Fowler 认为“将两者(知识级和操作级)分开有助于理清建模思路”。为此,我们需要明确这二者之间的差别。</p>
<p>在《分析模式》一书中Martin Fowler 引入了英国国民医疗服务制度的 Cosmos 项目作为分析模式的案例,这个模型的推导过程清晰地展现了引入这两个层级是怎么让模型变得更加清晰的。</p>
<p>Cosmos 作为一个医疗保健系统需要对医药行业的测量和观察需求建立模型。简单说来每个患者的测量结果可以建模为“测量Meassurement”。然而针对整家医院即使是一个患者也可能存在成千上万种可能的测量。如果为每种测量定义一个相应的属性就意味着一个患者存在着成千上万种可能的测量操作——测量的接口就会变得格外复杂。分析模型的解决方案是将所有可以被测量的不同事物身高、体重、血糖水平……都作为测量对象并将其抽象为“现象类型Phenomenon Type”。这里测量属于操作级现象类型属于知识级</p>
<p><img src="assets/bd869190-b125-11e9-be4b-8fba8dbeacaa" alt="68275914.png" /></p>
<p><img src="assets/bd869190-b125-11e9-be4b-8fba8dbeacaa" alt="png" /></p>
<p>在为测量引入现象类型后,患者可以有许多测量,但是针对某一种现象类型而言,患者就只有一个测量。例如 John Smith 身高 1 米 75在上述模型中该描述信息整个代表一个测量其中患者是 John Smith现象类型是身高数量是 1 米 75。</p>
<p>为什么现象类型属于知识级,测量属于操作级呢?</p>
<p>首先,测量是医药行业每天都会发生的事件,而现象类型则是测量的多种配置,这符合前面对<strong>操作级与知识级的定义</strong></p>
@@ -641,14 +641,14 @@ function hide_canvas() {
<p>一个促销并不会对应某一个具体的买家。促销面向商品和店铺,通过类别来说明它的使用范围。提供给买家的其实是促销产品。例如,一个买家获得了一张现金券或者礼品卡。为了避免买家无限次地享受促销福利,促销产品也需要标记其状态,包括未使用、已使用和过期状态。其中,已使用和过期状态都表现了该促销产品的无效状态,说明该促销产品对应的促销策略已经失效。为了区分促销活动与促销产品的状态,需要用限定修饰符说明,分别为“活动状态”和“产品状态”。</p>
<p><strong>促销活动概念的引入对于促销而言具有重大意义</strong>,某种程度上,它根据变化频率的不同,将与促销相关的概念分成了完全独立的两部分。例如,一旦促销确定了优先级和类别,就不会轻易进行调整;而有效时段与促销状态则经常发生变化,如果作为促销的属性,就会受到时间和状态的限制,让促销无法被重用。促销活动与促销之间的分离,使得促销更加稳定,在保证重用的同时,还能避免促销被无限使用带来的潜在风险。</p>
<p>通过引入分析模式的建模原则与模式,我们对最初的模型进行了精炼,最终获得了如下的领域分析模型:</p>
<p><img src="assets/d8397020-b125-11e9-be4b-8fba8dbeacaa" alt="39130737.png" /></p>
<p><img src="assets/d8397020-b125-11e9-be4b-8fba8dbeacaa" alt="png" /></p>
<h4>对分析模型的验证</h4>
<p>我们可以结合实际的业务场景验证获得的促销分析模型。以京东商城为例,如下图所示:</p>
<p><img src="assets/e2fe1740-b125-11e9-8032-55077247240b" alt="36166933.png" /></p>
<p><img src="assets/e2fe1740-b125-11e9-8032-55077247240b" alt="png" /></p>
<p>上图给出了两种<strong>促销类别Label</strong>:联合促销活动与玩具元旦特惠。以玩具元旦优惠类别为例,**促销Promotion<strong>为“跨店铺满减”。该促销的</strong>活动类型Activity Type**包括适用店铺(值为“跨店铺”)、适用品种(值为“玩具”)。**促销产品Promotion Product**为优惠Special Offer**促销产品类型Product Type**为满减Reward**规则Rule**为金额阈值规则,**规格Specification**为满99.00元减。**促销活动Promotion Activity<strong></strong>有效时段Valid Period**为 2019 年 1 月 1 日。图中的两种玩具都属于同一个促销类别,因此在计算满减时,这两个商品是可以叠加的。对应的分析模型为:</p>
<p><img src="assets/f3704bc0-b125-11e9-8032-55077247240b" alt="39618493.png" /></p>
<p><img src="assets/f3704bc0-b125-11e9-8032-55077247240b" alt="png" /></p>
<p>我们再来看另外一个促销场景:</p>
<p><img src="assets/01353a90-b126-11e9-90ed-85df496a282b" alt="36807631.png" /></p>
<p><img src="assets/01353a90-b126-11e9-90ed-85df496a282b" alt="png" /></p>
<p>上图展现的促销场景包含了多种促销它们的促销类别Lebel皆为京东自营因此在进行优惠计算时这些商品是可以叠加的。这里包含的促销实体有</p>
<ul>
<li>促销实体促销产品为券Coupon促销产品类型为满减Reward优惠规则为金额阈值规格分别为满 49 减 6、满 158 减 20、满 258 减 30、满 388 减 50 等。促销活动的活动类型Activity Type为适用店铺值为京东自营活动状态为“有效”。一旦领取了券则产品状态为“未使用”。</li>