为什么说基于贫血模型的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数据的重新组合和格式化。

为什么不建议合并它们

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

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

相关推荐

  1. 为什么基于贫血模型MVC架构违背OOP

    2024-04-09 00:46:01       37 阅读
  2. 什么是架构理解

    2024-04-09 00:46:01       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 00:46:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 00:46:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 00:46:01       89 阅读
  4. Python语言-面向对象

    2024-04-09 00:46:01       97 阅读

热门阅读

  1. HarmonyOS开发的项目运行在ArkUI-X详解

    2024-04-09 00:46:01       28 阅读
  2. 理解Linux中的文件删除、硬链接和软链接

    2024-04-09 00:46:01       42 阅读
  3. 3dmax fbx模型批处理

    2024-04-09 00:46:01       37 阅读
  4. 9.最大极小值与最小极大值[省模拟赛

    2024-04-09 00:46:01       36 阅读
  5. 网络I/O处理

    2024-04-09 00:46:01       32 阅读
  6. kafka命令行高级命令

    2024-04-09 00:46:01       35 阅读
  7. Vue3学习和进阶

    2024-04-09 00:46:01       34 阅读
  8. 外贸建站公司排名

    2024-04-09 00:46:01       36 阅读