【领域驱动设计】领域模型的纯粹性和完备性
一、结论
***领域模型无法在不损耗性能的情况下同时具备纯粹性和完备性***
二、什么是领域模型
在我们开发一个应用之前,会找出业务场景中的一系列实体,然后用类来表示这些实体,这些类有属性和方法,互相联系彼此协作完成业务逻辑。这些类、类与类之间的关系便是领域模型。
三、领域模型的纯粹性和完备性
领域模型应该是纯粹的,即只依赖于其他领域模型和编程语言提供的基本数据类型。领域模型也应该是完备的,即业务逻辑不外泄,领域模型已经包含了所有业务逻辑。
然而有的时候,这些领域模型并不能只靠自己就能完成所有业务逻辑,或者说代价很大,例如:在新增用户的时候需要验证用户名是否重复,验证重复有两种方法,一是让领域模型能够同时包含所有用户对象,验重时将新增用户名与这些用户对象的用户名一一进行对比。二是通过用户名去查数据库,能查到就说明重复了。在第一种方法中,领域模型不依赖外界便能完成业务逻辑,业务逻辑也没有外泄,这样的领域模型便满足了纯粹性和完备性,但是领域模型拥有所有用户对象便意味着它们都被加载到了内存,这会损害性能,甚至在数据量很大的情况下直接内存溢出。而在第二种方法中,可以避免大量数据加载到内存,只是这时领域模型的纯粹性和完备性便无法同时满足了。因为若将查数据库的逻辑放在领域模型之外,领域模型便不完备了;若将查数据库的逻辑放在领域模型之内,领域模型便不纯粹了。
四、纯粹性、完备性和性能
纯粹性、完备性和性能这三者的关系是:能且只能同时满足其中的两种。虽然实际上在上面例子中可以将验证用户名是否重复的逻辑抽象为一个接口放到领域模型中,这样领域模型便不依赖外界也看似包含了所有业务逻辑,从而同时满足纯粹性和完备性而不损耗性能。但是这样的领域模型只是能够通过编译而已,在运行前必须先实现其接口,所以,这只是在编译的层面上看似满足三者,事实上仍然不满足。