DDD贫血模型、充血模型

贫血模型

贫血模型是一种软件开发中的设计模式,它指的是将数据和业务逻辑分离的一种设计模式,其中数据和领域模型是独立于业务逻辑的。在贫血模型中,数据由数据对象存储,而业务逻辑由服务对象处理。这种设计模式的优点是使代码更加清晰和可维护,使得领域模型更具可重用性和扩展性。

优点:

  1. 可维护性:贫血模型能够更好地分离业务规则和数据操作,使得后续维护和修改更加方便。

  2. 可测试性:由于业务规则被抽象出来,更容易进行单元测试和集成测试。

  3. 灵活性:由于数据操作独立于业务规则,可以更加灵活地进行数据操作。

  4. 易于管理:贫血模型能够更好地支持模块化开发,使得项目管理和团队协作更加方便。

  5. 性能优化:由于数据操作和业务规则分离,可以更好地进行性能优化,例如通过缓存数据等手段来提高效率。

缺点:

  1. 数据处理过多:因为数据操作都集中在数据对象中,所以数据对象需要处理大量的业务逻辑,这会导致数据对象过于庞大,难以管理。

  2. 破坏了面向对象的封装原则:贫血模型中,数据对象暴露了很多属性和方法,导致了数据的封装性变得比较差。这样会使得代码难以维护和扩展。

  3. 领域对象失去行为:在贫血模型中,领域对象失去了自己的行为,所有的业务逻辑都由服务层处理。这使得代码耦合度高,难以进行单元测试和重构。

贫血模型实现要求

cs 复制代码
public long Id { get; set; }
public DateTime UserDateTime { get; set; }
public string UserName { get; set; }
public int UserInt { get; set; }

充血模型

充血模型(Rich Domain Model)是面向对象软件设计中的一种模式,指的是将领域模型的知识和行为尽可能地包含在对象内部,将对象设计为拥有自身的属性和方法,而不是简单的数据结构。这种模式的核心思想是使软件系统更贴近实际领域,从而更加易于理解和维护。在充血模型中,对象不仅包含自身数据的状态信息,还包括了领域知识、业务逻辑、验证规则和操作方法等。

优点:

  1. 更加真实:充血模型直接将业务逻辑表示在对象中,更加贴近现实世界。

  2. 更容易测试:由于业务逻辑被封装在对象中,可以更加容易地对其进行单元测试和集成测试。

  3. 更容易扩展:充血模型的对象具有自主性,可以更加容易地进行扩展和修改,而不会对其他部分产生影响。

  4. 更加灵活:充血模型可以根据不同的业务需求进行灵活的调整和运用,使得系统更加适应变化和需求的变化。

缺点:

  1. 复杂性高:充血模型需要在业务逻辑中处理大量的业务规则和逻辑,导致代码复杂度高,难以维护。

  2. 依赖性强:充血模型中的业务规则和逻辑耦合在实体对象中,导致实体对象的重用性和可测试性较差。当业务规则发生变化时,需要修改实体对象的代码。

  3. 性能问题:充血模型需要加载整个实体对象,包括其所有关联数据,而且大量的业务逻辑会导致实体对象的状态频繁变化,对于复杂的业务场景,可能会影响系统性能。

  4. 对象状态管理困难:充血模型需要维护实体对象的状态,包括持久化、缓存、序列化和反序列化等,这些状态管理需要占用大量的内存和CPU资源。

什么时候使用充血模型

充血模型适用于需要处理大量业务规则和复杂业务逻辑的项目,比如金融、电商等领域。以下是使用充血模型的情景:

  1. 订单处理系统:订单处理涉及到多种业务逻辑,如库存管理、价格计算、优惠券使用等。采用充血模型可以将这些业务逻辑封装到订单对象中,使得代码更加清晰、可维护性更高。

  2. 购物车系统:购物车系统需要处理多种商品和促销活动的组合,需要考虑库存和价格等因素。

  3. 游戏开发:充血模型可以用于游戏中各种复杂的对象的建模,如玩家、怪物、游戏物品等。

充血模型实现要求

cs 复制代码
internal class User
{

    public long Id { get; init; }//设置为只读
    public DateTime UserDateTime { get; init; }//只能在初始化中赋值,后续不可更改
    public string UserName { get; private set; }//只能方法更改
    public int UserInt { get; set; }//可以外部修改


    public User(string myxm)//程序员用的
    {
        this.UserName = myxm;
        this.UserDateTime = DateTime.Now;
        this.UserInt = 0;
    }
    //如果有参的构造方法参数不能对应我们所创建的变量需要构造一个无参的构造方法
    private User()//给编辑器用的
    {

    }

    public void NewUserName(string ym)
    {
        if (ym.Length > 10)
        {
            Console.WriteLine("长度不能大于10");
            return;
        }
        this.UserName = ym;
    }
}

两者区别:

  1. 数据处理方式不同:充血模型中,领域对象包含了业务逻辑和数据相关操作,它们能够自己进行数据访问,也可以对其它对象进行操作,这种模型下数据对象相对较多;而贫血模型则是将数据抽象为对象,所有的业务逻辑都在服务端(或其它层)进行处理。

  2. 灵活性不同:充血模型中,由于对象自身拥有数据操作权,因此更能够适应需求变化,更具灵活性;而贫血模型则由于在客户端或服务端进行数据处理,因此更加安全稳定,但可扩展性稍次。

  3. 复杂度不同:充血模型下的对象较多,它们承担了较多的业务逻辑,因此模型相对来说更加复杂,编写、维护成本更高;而贫血模型下的对象较少,主要负责数据的存储和传输,因此模型相对来说简单。

相关推荐
白总Server2 小时前
JVM解说
网络·jvm·物联网·安全·web安全·架构·数据库架构
CodingBrother3 小时前
软考之面向服务架构SOA
微服务·架构
SongYuLong的博客4 小时前
C# (定时器、线程)
开发语言·c#
百锦再6 小时前
详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送
windows·c#·计算机外设
无敌最俊朗@7 小时前
unity3d————协程原理讲解
开发语言·学习·unity·c#·游戏引擎
程序设计实验室7 小时前
在网页上调起本机C#程序
c#
Crazy Struggle10 小时前
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
c#·.net·.net core
随遇而安622&50810 小时前
分布式微服务项目,同一个controller方法间的转发导致cookie丢失,报错null pointer异常
分布式·微服务·架构·bug
fs哆哆10 小时前
C#编程:优化【性别和成绩名次】均衡分班
开发语言·c#
未命名冀11 小时前
微服务day07
微服务·架构·jenkins