(静态语言倾向外部 DI 和 oop 动态语言倾向特征混入?)
简单来说,充血模型表示实体对象负责实现与自己相关的功能,相对应地,贫血模型表示实体对象只负责数据模型,相关功能一般由相应的 Manager 类实现。
《松本行弘的程序世界》里详细区分过这两个概念。
举例来说,你有一个 Human 类,在类里实现了 walk 方法,通过 person.walk() 这种形式调用,可以理解为充血模型,因为这个 Human 类是活的,不需要借助其它方式辅助就能走路。
对应的贫血模型可以实现一个 WalkManager 类,以 WalkManager.walk(person) 这种形式调用,这里 Human 本身不能走路,需要 WalkManager 扶着它走,就好像一个失血的人一样。
我觉得面向对象是一种比较好的管理复杂度的方法,贫血模型本身很反面向对象,没有对数据进行细致地分类,很容易出来一堆长参数列表的方法,那些 manager 也很容易被设计成单例或者干脆就是只含静态方法的类。而这些方法里边的逻辑本该可以被更好地组织起来。
哈哈,说白了我个人比较排斥贫血模型。