继续《Domain Model:业务对象的进一步设计》的讨论, 这次是Product Line。
Product Line
Product Line体系存在比较特殊,Product Line的概念并不明显。Product Line以Product为核心,维护了一类product所共有的属性与其它关联业务对象如Document,同时维护了不宜在product一级维护的信息:product与其它业务对象与业务逻辑,如与contract的约束关系。具体如下:
Product Line维护Product共有的属性以及关联关系
1. 维护product共有的属性。
这个比较好理解,最类似的是category对象。
2. 维护product共有的关联关系。
这个好理解,目的只在一个点维护,避免无谓重复。
Product Line还维护不宜在product层次维护的信息和逻辑(注:并不是很绝对的,通常而言,以下几种信息和逻辑的维护,在实际应用中都针对product line一级,但在某些业务中,还需要维护特定的product):
1. 维护product与其Visitor对象的关联关系。
Product或者Contract总是需要对User是可视的,《分析模式》的10.5.4专门讨论了这块内容。由于同类的Product的Visitor是有共性的,同时Visitor和Product关系并不是那么直接,甚至对于某些项目来说,同一product line下的所有product的可视性都是一致的,因而在product一级上维护Visitor。
除了单个product的可视性,通常还有product line的search功能。支持Search功能的类型也是在这一级维护的。
2. 维护product与其关联对象的约束关系。
这个是适用于product的定义的用例。当product关系复杂时需要通过给出一些约束关系以保证产品的定义的完整性。比如product都有与其关系document对象,但是document对象又分为多种类型,但对于某类的product需要关联特定三种类型文档,这种约束关系就定义在product line对象上。
3. 维护product与contract的约束关系。
在复杂的业务中,contract和product的关系并不是单向的,除了contract将保持对product的引用外,product也会有限定的contract的适用。比如product的结算的货币;现实的例子是:携程旅行网的电子机票只允许电子银行支付方式;eBay上的某些促销物品只允许快递的送货协议。当然,对于这样的约束关系定义product一级还是product line一级是需要根据项目特点分析的。
4. 维护product与业务流程以及行为的约束关系。
这是比较少见的,但还是存在。例如对于某种类型的product,不允许在业务上做批改动作;对于某类型的产品在业务流程上需要预先填一份业务单据等。相比而言,通常业务流程(主要是页面流)以及业务行为和product line关联,很少见到和某个具体product关联。
Product Line是所知的最麻烦的领域对象体系,包含了很多逻辑在内,显的有点混乱,不过细想还是有点道理的。