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

2024-04-08 20:36
文章标签 模型 架构 mvc oop 贫血 违背

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

为什么不建议合并它们

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

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

这篇关于为什么说基于贫血模型的MVC架构违背OOP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886406

相关文章

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2