让领域模型发挥作用

模型是一种简化。他是对现实世界的一种解释,并把与解决问题密切相关的方面抽象出来,而忽略无关的细节。

每个软件程序的目的都是为了执行某项活动,或是满足用户的某种需求。用户会把软件程序应用于某个主题区域,这个区域就是软件的领域。模型是用于解决信息超载问题的工具。模型是一种只是形式,他对知识进行有选择的简化和有目的的结构化。

领域模型并非一种特殊的图,特使图要表达的思想。他是经过严格组织并且精心选择的抽象知识。

建立领域模型并不是要尽可能建立一个符合现实的模型。它不单单是一种为了实现某种目的而构造出来的软件机制。建模更像是制作电影处于某种目的而概括的反应现实。

模型在领域驱动中的作用。

(1)模型和设计的核心相互影响。

(2)模型是团队所有成员使用的交流语言的中枢。

(3)模型是浓缩的知识。

软件的核心是其为用户解决领域相关的问题的能力。所有其他特性,不管多么重要,都要服务于这个基本目的。当领域很复杂是,这是一项艰巨的任务,要求高水平技术人员的共同努力。然而在大多数软件项目中,这些问题并未引起足够的重视。大部分有才能的开发人员对学习与他们的工作领域有关的事实不感兴趣,更不会下力气去扩展自己的领域建模技巧。技术人员喜欢那些能够练习技巧的可量化问题。领域工作很复杂,而且要求掌握很多复杂的新知识,而这些新知识看是对提高计算机科学家的能力并无裨益。

有效建模的要素

1.模型和现实的绑定。

2.获得了一种基于模型的语言。

3.开发一个蕴含丰富知识的模型。

4.提炼模型。

5.头脑风暴和实验。

知识消化

高效的领域建模人员是知识的消化者。他们在大量信息中探寻有用的部分。知识消化并非一项孤立的活动,他一般是在开发人的领导下,有开发人员与领域专家组成的团队来共同协作。

有些项目使用了迭代过程,但由于没有对知识进行抽象而无法建立起知识体系。好的程序员会自然而然地抽象并开发出一个可以完成更多工作的模型。在团队所有成员一起消化理解模型的过程中,他们之间的交互也会发生变化。领域模型的不断精化迫使开发人员学习重要的业务原理,而不是机械地进行功能的开发。

模型在不断改进的同时,也成为组织信息流的工具。

持续学习

当开始编写软件时,其实我们所知甚少。项目知识零散地分散很多人和文档中,其中夹杂一些无关信息,因此我们甚至不知道那些之似乎是真正需要的知识。同时,所有项目都会都是知识。已经学到了一些知识的人可能干别的事去了。团队可能由于重组而被拆散,这导致只是又重新散开。高效率的团队需要有意识的积累知识,并持续学习。对于开发人员来说这意味着纪要完善技术知,也好培养一般的领域建模技巧。

知识丰富的设计

我们从一个非常简单的领域模型还是学习,基于此模型的应用程序用来预定一艘船再一次航程中要运载的货物。由于总会有人临时取消订单,一次航运业的一般做法是接受比其他运载能力多一些的货物。这称为超定。

需求文档中包含下面这段话:允许10%的超订。

现在类图和代码应该像如下:


public int makeBooking(Cargo cargo, Voyage voyage) {
    double maxBooking = voyage.capacity() * 1.1;
    if((voyage.bokedCargoSize() + cargo.size()) > maxBooking)
        return -1;
    int confirmation = orderConfirmationSqquence.next();
    voyage.addCargo(cargo, confimation);
    return confirmation;
}

现在一条重要的规则被隐藏掉了,现在我们主要考虑如何把这条规则更清楚的表达出来,以便让项目中的每个人都能看到他。

我们可以改变一下设计来更好地捕获这个知识。超定规则是一个政策(policy)其实是一种设计模式,也就是我们所说的strategy策略模式。使用strategy的动机一般是为了替换不同的规则,虽然在这里并不需要这么做,但我们要获取的概念确实符合strategy的意义。

修改后的代码如下

public int makeBooking(Cargo cargo, Voyage voyage) {
    if( !overbookingpolicy.isallowed(cargo, voyage) )
        return -1;
    int confirmation = orderConfirmationSqquence.next();
    voyage.addCargo(cargo, confimation);
    return confirmation;
}

新的OverBookingPolicy类包含以下方法:

public boolean isAllowed ( Cargo cargo, Voyage voyage ) {
    return (cargo.size() * voyage.bookedCargoSize()) <= 
        ( voyage.capacity() * 1.1 );
}

  现在所有人都可以看出超定是一个独特的政策,而且超定规则的实现是明确独立的。我们不建议将这样精细得设计应用到领域的每个细节中。

这个例子的目的是说明领域模型和相应的设计可用来保护和共享知识。更明确的设计具有

1.为了实现更明确的设计,程序员和其他各位相关人员都必须理解超定本质,明白它是一个明确且重要的业务规则。

2.程序员可以向业务专家展示技术工件,甚至是代码,但是应该是领域专家可以理解的,以便形成反序循环。

深层模型

有用的模型很少停留在表面层次上。随着对领域和应用程序需求的理解逐步加深,我们往往会丢掉那些最初开起来很主要的表面元素,或者切换他们的角度。这时,一些在开始时不可能发现巧妙抽象回渐渐浮出水面,而他们恰恰切中问题的要害。

 

 

猜你喜欢

转载自greatrich.iteye.com/blog/1455522
今日推荐