为什么说基于贫血模型的MVC架构违背OOP

我们大部分的业务开发都是MVC架构的,但是我们平时使用的基于贫血模型的MVC架构它对吗?为了搞清楚这个问题,我们先来理清楚几个概念。

一、贫血模型VS充血模型

贫血模型与充血模型是软件开发中两种常见的设计模式,它们各自具有独特的特点和适用场景。

贫血模型,也被称为数据驱动模型,主要基于数据库的建模。在这种模型中,数据和操作被分离,数据对象主要存储数据,而操作则全部放在业务逻辑层中实现。领域对象通常只包含getter和setter方法,没有具体的行为,所有的业务逻辑都放在业务逻辑层处理。这种设计模式的优点在于使系统的层次结构清晰,各层之间单向依赖,有利于代码的清晰和可维护性,同时也提高了代码的可重用性和扩展性。然而,其缺点在于领域对象只是作为保存或传递状态使用,缺乏真正的对象行为,这在一定程度上降低了代码的面向对象性。

充血模型则基于对象的建模,通过面向对象的方式抽象系统关系。在充血模型中,领域模型不仅包含自身的属性状态,还包括方法行为等,即领域对象不仅包含数据,还包含对这些数据的操作。这使得领域模型更加生动和灵活,能够更好地反映真实世界的业务逻辑。充血模型的优点在于它更符合面向对象的理念,领域对象具有完整的生命周期和行为,这使得代码更加易于理解和维护。同时,由于业务逻辑和数据操作都在领域对象中,也提高了代码的内聚性。

综上所述,贫血模型和充血模型各有其优势和适用场景。在选择使用哪种模型时,需要根据项目的具体需求、团队的技术能力和维护成本等因素进行综合考虑。对于简单的业务场景,或者当领域对象的业务逻辑较为简单时,可以选择使用贫血模型;而对于复杂的业务场景,或者需要更好地体现面向对象特性的情况,充血模型可能更为合适。

可见我们平时使用的MVC模式,是面向过程的一种编程思维,但是由于历史原因和真实业务的情况,反而是基于贫血模型的MVC架构使用的更多。

二、MVC

MVC(Model-View-Controller)是一种软件设计模式,主要用于构建用户界面和应用程序的架构。MVC将应用程序的输入、处理和输出分开,使其更加易于管理和维护。MVC模式通过将应用程序分为三个主要组件来工作:模型(Model)、视图(View)和控制器(Controller)。

  1. 模型(Model)
    • 模型是应用程序的核心部分,代表应用程序的数据和业务逻辑。
    • 它负责数据的存储、检索和状态管理。
    • 模型不依赖于视图或控制器,这意味着模型可以被多个视图共享,并且可以独立于视图进行测试。
    • 模型通常包含数据访问逻辑,与数据库或其他数据源进行交互。
  2. 视图(View)
    • 视图是用户界面的表示,负责显示数据给用户。
    • 它从模型中获取数据,并将其以特定的格式(如HTML、JSON等)呈现给用户。
    • 视图通常是被动的,它等待控制器发送数据来更新其内容。
    • 视图不应该直接访问模型,它应该通过控制器来获取数据。
  3. 控制器(Controller)
    • 控制器是模型和视图之间的协调者。
    • 它接收用户的输入(如点击事件、表单提交等),并决定如何处理这些输入。
    • 控制器可能会从模型中获取数据,并发送给视图进行显示,或者根据用户的输入更新模型的状态。
    • 控制器确保模型和视图保持同步,并且负责响应用户请求。

MVC模式通过将应用程序的输入、处理和输出分离,使得代码更加模块化,提高了代码的可维护性和可重用性。当业务逻辑或用户界面需要改变时,只需要修改相应的组件,而不需要对整个应用程序进行大规模的修改。

MVC模式广泛应用于各种Web应用程序和桌面应用程序中,是软件开发中非常重要的一种设计模式。通过使用MVC模式,开发人员可以更好地组织和管理代码,提高应用程序的可扩展性和可维护性。

三、拓展问题(MVC模式中的Entity,bo,vo可以合并成一个类吗?)

在MVC(Model-View-Controller)模式中,EntityBO(Business Object)和VO(Value Object)通常各自具有特定的职责,不建议将它们合并成一个类。以下是它们各自的作用和为什么不建议合并的原因:

  1. Entity(实体)
    • 代表数据库中的一张表或数据模型。
    • 通常与数据库表字段一一对应,包含主键、外键等数据库相关的特性。
    • 负责数据的持久化,与数据库交互。
  2. BO(Business Object,业务对象)
    • 封装了业务逻辑,包含了与业务相关的属性和方法。
    • 通常用于处理复杂的业务逻辑,如计算、验证等。
    • 可能是由多个Entity组成的一个复合对象,或者对Entity进行了封装和扩展。
  3. VO(Value Object,值对象)
    • 主要用于数据的传输和展示,通常用于前后端之间的数据交换。
    • 只包含数据,不包含行为(方法)。
    • 可能是Entity的一个子集,或者是对Entity数据的重新组合和格式化。

为什么不建议合并它们

  • 职责分离:每个对象都有其特定的职责。将它们合并会导致一个对象承担过多的责任,使得代码难以理解和维护。
  • 耦合度增加:合并这些对象会增加它们之间的耦合度,使得修改其中一个对象可能影响到其他对象。这违反了“高内聚、低耦合”的软件设计原则。
  • 可重用性降低:如果合并成一个类,那么在不同的场景中(如不同的业务逻辑、不同的数据展示需求)使用这个类时,可能需要进行大量的条件判断和逻辑分支,降低了代码的可重用性。
  • 测试困难:合并后的类将包含多种不同的功能和逻辑,这使得对其进行单元测试变得更加困难。

在实际开发中,通常建议根据项目的具体需求和设计原则,合理地使用这些对象,并根据需要进行适当的封装和组合,以达到更好的代码质量和可维护性。

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值