热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MVC,大家都知道的模式……不太好

MVC,大家都知道的模式……不太好“MVC是引用最多(也是最错误引用)的模式之一”——MartinFowlerCréditphoto:史蒂夫·约翰逊与许多关于这个主题的文章和评论相

MVC,大家都知道的模式……不太好

“MVC 是引用最多(也是最错误引用)的模式之一”——Martin Fowler


Peinture abstraite multicolore

Crédit photo: 史蒂夫·约翰逊

与许多关于这个主题的文章和评论相反, MVC 不是全栈或后端模式, 这是一个仅限前端的模式。

作为初级开发人员,我们经常会掉入陷阱……但要完全了解 MVC 的真正含义,让我们首先了解一些基本原理。

一个 Web 应用程序通常分为 3 个部分,也称为 3 层架构。


数据表示层

它负责转换和显示要返回给用户的数据。这是应用程序的整个 UI 部分。这取决于业务层


业务层

这包含公司活动的所有逻辑和业务规则。它通常位于服务器端,不像表示层可以驻留在服务器端(服务器端渲染)或客户端(客户端渲染)。


数据持久层

该层负责持久化业务层希望“保存”的数据。她抽象出 “如何保存数据” 对于业务层。它与数据库、API 和其他连接器交互,以保存和检索上层所需的数据。

在这个架构中,有一个重要的概念需要记住:这些是层之间的依赖规则。业务层(应用程序的核心)理论上没有依赖关系。它完全抽象出知道如何使用其数据(由表示层)以及如何保存其数据(由持久层)。*

因此,Model Vue Controller (MVC) 模式错误地与 3 层架构相关联,如下所示:



  • View = 数据表示层

  • 控制器 = 业务层

  • 模型 = 数据层

您必须承认,这两个概念很好地结合在一起,但是...

这是错的 ! ❌


但是 Jamy,MVC 是如何成为仅前端模式的?

让我们谈谈控制器,它是故事中的罪魁祸首......

控制器 MVC 的模式元素是控制 Vue .这意味着他与后者强烈耦合,因为他……控制着她。小学我亲爱的华生。

或者,si le C 控制器 认识她 Vue ,它不能驻留在业务层,因为让我们记住: 业务层独立存在 .所以 控制器 MVC 在数据表示层上运行良好,因为它依赖于 Vue ! CQFD


但是为什么我们(错误地)认为 MVC 控制器与业务层相关联呢?


从历史上看,Web 应用程序在服务器端呈现 HTML 页面。因此,客户端发送一个 HTTP 请求,服务器返回一个 HTML 格式的响应,浏览器简单地显示在用户的屏幕上。

在此配置中,HTTP 控制器是 控制器 MVC 因为它收到来自客户端的请求,所以查询 模型 检索数据,然后构建 Vue (HTML)发送回客户端。

最近,随着 Angular 或 React 等框架的到来,整个表示层现在都在客户端。渲染在浏览器中完成;这是著名的 客户端渲染 .除了我们忘记移动所有与之相关的概念外,这就是产生歧义的地方!

因此,在应用程序中 客户端渲染 , HTTP 控制器不是 MVC 控制器。 在这种配置中,HTTP 控制器有一个完全不同的功能:它只是通过 HTTP 协议上的 API 来打开业务层。它的唯一作用是接收客户端请求、查询业务层和呈现数据,通常以 JSON 格式呈现。它不再在数据呈现中扮演任何角色,只在业务层的边缘运行。

所以,混淆了 控制器 MVC 与 HTTP 控制器,我们扭曲了基本概念。我们将业务层定义为 “C” 来自 MVC。这就是混乱的地方!


模型,附带损害

通过将 HTTP 控制器错误识别为 控制器 MVC,它歪曲了对模式的整体理解。事实上,通过这个棱镜,我们可以很自然地将持久层识别为这个著名的理想候选者 模型 ,由我们使用 控制器 ,正如 MVC 向我们展示的那样。

正如您已经可以想象的那样……这是一个错误! 模型不等同于持久层。 根据 MVC, 模型 应该包含业务逻辑,这就是业务层的角色。这 模型 因此是由后者渲染的!


具体来说,在所谓的“经典”Web 应用程序中, ** 模型** 因此被使用 ** 控制器** 客户端。当。。。的时候 ** 控制器** “更新” ** 模型** ,这将转换为对公开业务层的 API 的 http 调用。为了应对变化 ** 模型** , 这 ** 控制器** 所以更新 ** Vue** ,它将被呈现到最终用户的屏幕上。



而这一切的观点?

为了 MVC,我们已经有点赢家了,这部分已经在正确的层了。 — 伊皮!

介于两者之间 客户端渲染 或者 服务器端渲染 , 原理不变;这 控制器 从中检索项目 模型 ,然后构建它的 Vue 和。这 Vue 然后仅限于 HTML 部分。它由 控制器 ,具体取决于您要呈现给用户的数据和逻辑。

如果你使用 反应 或者 ,你可能在不知不觉中做 MVC。

在角度



  • 组件 .TS 包含控制器的所有逻辑

  • 组件 .HTML 是你的看法

  • 服务(API 等)是允许您阅读和更新您的 楷模

并做出反应



  • React 组件包含 控制器

  • render() 函数渲染 Vue

  • 服务(API 等)是允许您阅读和更新您的 楷模

所以 !希望对 MVC 的真正含义有所启发,我希望您不再使用这个词来指定 3 层架构!

很好的一天!


来源

https://martinfowler.com/eaaCatalog/modelViewController.html

Robert C Martin — 清洁架构和设计


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/37434/55361802



推荐阅读
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了一种处理AJAX操作授权过期的全局方式,以解决Asp.net MVC中Session过期异常的问题。同时还介绍了基于WebImage的图片上传工具类。详细内容请参考链接:https://www.cnblogs.com/starluck/p/8284949.html ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文讲述了作者从最初对软件工程的选择迷茫到逐渐喜欢并坚持学习的经历。作者在大学期间通过学习专业课和参与项目开发,不断挑战自己并取得成就感。虽然曾考虑过转专业和复读,但最终决定坚持学习软件工程,并为自己的未来努力奋斗。作者还提到了大学生活与自己最初的预期不同,但对此并没有太多抱怨。 ... [详细]
  • 使用J2SE模拟MVC模式开发桌面应用程序的工程包的介绍
    以我开发过的一个娱乐管理系统为例:下图为我系统的业务逻辑的MVC流程:下图为以Eclipse开发中各包的说明:转载于:https:blog ... [详细]
  • wpf+mvvm代码组织结构及实现方式
    本文介绍了wpf+mvvm代码组织结构的由来和实现方式。作者回顾了自己大学时期接触wpf开发和mvvm模式的经历,认为mvvm模式使得开发更加专注于业务且高效。与此同时,作者指出mvvm模式相较于mvc模式的优势。文章还提到了当没有mvvm时处理数据和UI交互的例子,以及前后端分离和组件化的概念。作者希望能够只关注原始数据结构,将数据交给UI自行改变,从而解放劳动力,避免加班。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • 数据库锁的分类和应用
    本文介绍了数据库锁的分类和应用,包括并发控制中的读-读、写-写、读-写/写-读操作的问题,以及不同的锁类型和粒度分类。同时还介绍了死锁的产生和避免方法,并详细解释了MVCC的原理以及如何解决幻读的问题。最后,给出了一些使用数据库锁的实际场景和建议。 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • 今天写一篇blog,已经多长时间没有更了,两个月了吧,没办法,现在银行开发,不能连外网,天天用虚拟机,真烦今天随手写点东西,主要是这两天对于springboot启动的分析,有所领悟 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
author-avatar
mobiledu2502872453
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有