mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-11-17 14:43:43 +08:00
fix img
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user