MVC:为什么要分离模型、视图和控制器?

2024-02-16

除了它的“哲学”方面之外,让我的控制器也成为我的模型是一个坏主意吗?

看来节省了一些编程时间。我不必在控制器和模型之间创建逻辑,因为它们是同一件事。我可以直接与视图交互。

把M和C分开有什么意义?模块化——即能够将一个模型和控制器组替换为另一个模型和控制器组的能力——是分开它们的唯一原因吗?在我看来,“交换”模块的情况比(例如)必须更新模型和控制器要少得多,因为模型中的某些内容正在发生变化。


根据 MVC 概念,一个简单的计算器应该同时具有控制器和设置视图(例如默认设置等),这似乎很奇怪。我知道这是一个简单的例子,但它似乎适用于所有情况(框架除外)。


主要原因是代码的可重用性。如果您在职业生涯中只打算编写一个程序,那么也许这并不重要。如果您打算以此为职业,那么拥有可重复使用的部件就很有价值。设计良好的模型、控制器和视图类很容易放入其他程序中。我一直这样做。

考虑UITableViewController,这是一个控制器。现在想象一下,如果它专门设计用于处理音乐曲目(模型),并且当您想要处理其他事情时,您需要创建一个完全不同的表管理类。避免这个噩梦就是 Cocoa 中大量使用 MVC 的原因。

还有其他方法可以分割事物。有些语言大量子类化而不是委托化。但在Cocoa中,分割程序的主要手段是MVC,而且效果很好。

EDIT:只是来自开发商业应用程序世界的更多原因。

  • MVC 中的内存处理要容易得多。当视图对象(以及许多控制器对象)离开屏幕时,您可以保留模型对象并丢弃它们。

  • 序列化未包含控制器和视图的模型对象更容易,并且以多种方式显示相同的数据也更容易。即使在“简单”的文本编辑器中,您也可能希望能够进行分屏,或者有多个窗口显示同一文档。在 MVC 中这非常简单。

如果您现在或将来不需要灵活性,则不需要太多架构。但大多数实际项目并不那么简单。 MVC 源于 Xerox 编写大型程序的经验以及将所有内容放在一起时遇到的困难。


EDIT 2:我正在查看您之前的编辑:“根据 MVC 概念,一个简单的计算器应该同时具有控制器和设置视图(例如默认设置等),这似乎很奇怪。”

这正是 MVC 的原因。必须重新编码专门为计算器应用程序保存用户设置所需的所有内容似乎很疯狂。您需要一个与 UI 完全分离并且可以重复使用的通用“请保存这些用户设置”。在 OS X 上它被称为NSUserDefaults,以及Calculator应用程序正是以这种方式存储其配置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC:为什么要分离模型、视图和控制器? 的相关文章

  • Android应用程序架构——MVVM还是MVC?

    我有一个正在开始处理的 android 项目 我希望它的结构尽可能健壮 我有 WPF MVVM 背景 并且阅读了一些有关 Android 应用程序架构的内容 但我找不到关于我应该使用哪种架构的直接明确的答案 有些人建议使用 MVVM htt
  • MVC 的替代方案 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 模型视图控制器的替代 设计方法 有哪些 MVC 似乎很流行 SO 是用它构建的 我知道很多 但它是唯一使用的方法吗 关于几种不同的交互
  • 用户输入是否进入控制器或模型?

    现在我已经拆分了模型 但我的控制器和视图仍然组合在一个 12k 行文件中 我一直在寻求为此创建一个真正的 MVC 系统 拆分视图 但是在寻找要拆分的内容时 我注意到我的控制器正在执行大量可能属于模型的工作 例如 假设我有 if isset
  • 如何实现基于角色的REST API

    我在我的项目中扮演两个不同的角色 ROLE USER and ROLE ADMIN 我想通过以下方式获取所有用户的列表REST API 的 url users 但有些字段 例如email 只能看到那些通过身份验证的人ROLE ADMIN 所
  • Hibernate Spring - @OneToMany - 外键未存储在数据库中

    要求 对于食谱应用程序 用户可以输入食谱名称和成分 用户可以在JSP页面上输入食谱的多种成分 数据库模型 创建了 2 个表 食谱可以有不止一种成分 Recipe recipe id primary key name Ingredient i
  • Spring MVC 静态资源位于单独的 jar 中

    最近 我的同事问我是否可以将静态资源 css 图像 js 放在单独的 jar 文件中 并从 spring mvc 应用程序访问这些静态资源 我在谷歌上搜索 但没有发现任何有趣的东西 所以我的问题是 可能吗 如果是的话 您能解释一下该由谁来做
  • 在 Rails 中显示某些用户的博客文章

    好吧 开始学习 Rails 当然是从编写带有个人博客的服务 例如 livejournal 开始 我有帖子脚手架和用户模型 感谢 Devise 现在我试图在 url 中显示某些用户的所有帖子 例如 username posts 但真的无法理解
  • ASP.NET MVC - 模型绑定一组动态生成的复选框 - 如何

    我正在尝试对一组动态生成的复选框进行模型绑定 以便在控制器操作中处理它们 但无法进行模型绑定 这是场景 我的 ViewModel 类 DocumentAddEditModel 包含一个字典 Dictionary 其中每个条目的字符串是每个复
  • 如何在不使用某些框架的情况下在 php 中实现 MVC

    我对模型 视图 控制器模式有一些 也许是基本的 知识 我想使用它创建一个网站 但我发现如何实际实现这一点有点令人困惑 我陷入了细节之中 假设我有一个网站 每个用户都保存一些待办事项列表 你会如何处理这个问题 你会创建什么类 哪个类将输出 H
  • 具体来说,什么属于模型、视图和控制器?

    我一直在学习模型 视图 控制器范例 MVC 但我很困惑 因为有些教程与其他教程相矛盾 我目前对这个过程的理解是这样的 路由器 调度器 前端控制器 尽管 MVC 名称中没有具体提及 但 Router 仍然是一个非常重要的部分 正是在这里 请求
  • 为树视图创建 Qt 模型

    我正在用 Qt 使用 C 编写一个应用程序 我需要在树视图中表示一个对象结构 实现此目的的方法之一是为此创建一个模型 但在阅读有关该主题的 Qt 文档后我仍然很困惑 我的 结构 非常简单 有一个Project持有的物体Task中的对象std
  • 如何在 Spring MVC 中使用延迟加载

    Spring MVC中如何使用延迟加载 我现在正在使用 eager 但这会使我的应用程序运行速度变慢 这是我的域的一部分 ManyToMany fetch FetchType EAGER JoinTable name NEWS TAG jo
  • 如何在中等规模的 Rails 应用程序中组织控制器?

    我正在开发一个具有相当多相关模型的应用程序 并且想听听一些关于如何最好地组织控制器的意见 以下是我一直在考虑的一些选择 1 为控制器命名空间 例如 有一个controllers admin 目录和一个controllers public 目
  • Joomla 2.5 中基于类别的文章的替代布局

    目前 我的 Joomla 2 5 安装中的文章有 2 个 布局 default php default links php feature link php feature link php 当在 文章管理器 的 替代布局 下的 编辑文章
  • Objective C 视图到控制器通信

    在视图中接受用户输入然后将其传输到该视图的控制器的正确方法是什么 我知道通知中心是一种选择 但肯定有一种更优雅的方式将数据从视图传输到其控制器吗 非常感谢所有帮助 我总是接受答案 使用委托协议设计模式 或通过子类化目标操作UIControl
  • Cakephp:将 AppController 抽象到另一个层次,可能吗?

    我想知道是否可以在 AppController 和我的应用程序的其他控制器之间添加另一个抽象控制器 这样我的控制器 例如UsersController 扩展了 SecureController SecureController 扩展了 Ap
  • 我使用 jsp/jstl/spring 动态生成 css 和 js。如何将此结果放置在头部的链接标记中。不在头部的脚本标签中

    我在jsp中生成css 输出是 现在我在 jsp 中使用以下代码调用此代码 它有效并且输出是这样的
  • 您知道 PAC 设计模式的任何示例吗?

    任何人都可以指出正在使用的任何网站或网络应用程序表现 抽象 控制 http www dossier andreas net software architecture pac html设计模式而不是MVC 像这样的桌面应用程序很容易找到 例
  • 服务层或存储库中的密码哈希等?

    作为 MVC 的最佳实践 在发送到数据库之前处理密码散列 加盐或数据格式化等事务的逻辑应该放在哪里 我读到存储库应该仅用于处理数据访问的逻辑 这是属于服务层的东西吗 控制器 这还重要吗 我倾向于将散列放在存储库层中 如果只是出于实际原因 即
  • Node 和 General 中的 MVC:模型如何与视图绑定?

    我从 node js 开始 正在制作一个简单的 MVC 框架 到目前为止 我已经有一个前端控制器 或 调度程序 如果你愿意的话 可以工作 路由通过调度程序配置模块进行 如图所示 我的问题在最后 紧接代码之后 另外 这是学习node的练习 请

随机推荐

  • 将 netCDF 文件转换为 csv

    我正在努力将几个 Berkeley Earth netCDF 文件转换为 CSV 或其他表格格式 我意识到以前曾提出过类似的问题 但我无法应用我遇到的任何解决方案 例如 这个数据集 http berkeleyearth lbl gov au
  • 将图像绕一个圆圈

    在这个例子中我想做的是将图像包裹在一个圆圈上 如下所示 为了包装图像 我简单地使用 trig 计算了 x y 坐标 问题是计算出的 X 和 Y 位置被四舍五入以使其成为整数 这会导致上面的包裹图像中出现空白像素 x y 位置必须是整数 因为
  • 如何在 JSF 托管 bean 中创建、访问和销毁会话?

    目前 我正在为在线购物车创建一个 Web 应用程序 我需要在每个 jsf 页面上维护会话 我的问题是 如何在托管 bean 中创建和销毁会话 如何访问存储在会话变量中的值 像这样 FacesContext getCurrentInstanc
  • 我的react-native expo 应用程序的已编译 typescript js 文件在哪里?

    我刚刚创建了一个默认的打字稿博览会项目expo init 并且它有一个简单的App tsx主目录中的文件 我可以对文件进行更改并将这些更改反映在我的应用程序中 但我似乎找不到相应的输出文件 App js文件随处可见 我觉得这很令人困惑 深入
  • 选择器 div + p(加号)和 div ~ p(波形符)之间的区别

    那样的方式w3学校 http www w3schools com 短语它 它们听起来是一样的 W3Schools 的 CSS 参考 http www w3schools com cssref css selectors asp div p选
  • 如何在 Nginx 服务器上允许 PUT 文件请求?

    我正在使用一个需要的应用程序PUTHTTP 服务器上的文件 我使用 Nginx 作为服务器 但得到了一个405 Not Allowed错误返回 以下是使用 cURL 进行测试的示例 curl X PUT H Content Type app
  • IIS 连接池询问/泄漏跟踪

    根据这个有用的文章 http www 15seconds com issue 040830 htm我已确认运行 W2k3 的 IIS 6 服务器上的某些应用程序存在连接池泄漏 困难的部分是 我正在从该服务器的 6 个应用程序池中为 700
  • React-Testing-Library - 使用 Redux 和 Router 包装组件

    我正在尝试设置一个测试文件来在我的应用程序上呈现路线 页面 我试图用 Redux 和 Router 包装所有内容 这就是我所拥有的 import React from react import render from react testi
  • 如何与 Talend 中的 joblet 共享数据库连接

    我有一个带有 tMSSqlConnection 设置的作业 我需要与 joblet 共享该连接 我在网上找到了说明 说将其注册为共享连接 然后在具有该连接名称的 joblet 组件的动态设置中添加一个选项 以便可以从连接的组件列表中选择它
  • 使用 MVC 控制器进行 ServiceStack 身份验证

    我已遵循 SocialBootstrapAPi for ServiceStack 中的示例 但我不明白重定向是如何连接的 当我进入未经身份验证的安全控制器时 我会被重定向回索引页面 我无法在我自己的应用程序中复制该行为 未找到此接线的位置
  • java 多重映射数组列表

    是否可以将键映射到多维数组列表 有些事情就像下面的例子 Map
  • iOS 自定义 URL 方案与通用链接和 Android 对应方案

    我正在寻找这样的功能 当用户收到一条消息 假设通过 WhatsApp 应用程序 包含以特定方案 前缀 开头的链接时 当用户点击该链接时将调用我的应用程序 据我所知 此功能已经作为 自定义 URL 方案 提供 但我现在也注意到通用链接也有类似
  • 如何在 Swift 5.5 中将 async/await 与 SwiftUI 一起使用?

    我一直在测试 Swift 5 5 版本中预览的异步 等待功能 但我无法从异步函数收集结果并使用 SwiftUI 显示它们 这是我的代码 import SwiftUI struct AsyncTestView View State var t
  • 如何在不接触磁盘的情况下创建带有目录的内存中 zip 文件?

    在 python Web 应用程序中 我将一些内容打包在 zip 文件中 我想在内存中完全动态地完成此操作 而不接触磁盘 只要我创建一个平面目录结构 使用 ZipFile writestr 就可以了 但是如何在 zip 中创建目录呢 我使用
  • 声明一个未知大小的二维数组 C

    我有一个数组声明为 C 中结构的成员 该数组声明为 char mValue MAXROWS MAXCOLUMNS where MAXROWS and MAXROWS是 300 有更好的方法吗 我的意思是 我应该将它们声明为指针吗 Thank
  • 添加 UIButton 作为 UIWebView 的子视图并在缩放时调整其大小

    我有世界地图的图像 svg我加载到UIWebView 我使用了svg格式和UIWebView 因为图像太大而无法加载到UIImageView中 我想在这张地图上放置一堆具有固定位置的图钉 例如 如果我在巴西放置了一个图钉 则无论我滚动或缩放
  • 没有可供该商家使用的可接受银行卡 - Google Pay

    我正在尝试将 Google Pay 网络集成到我的网站中 但是当我单击 使用 googlepay 付款 时 它显示以下错误 该商户没有可使用的可接受的银行卡 当我阅读文档时 它说您可以添加示例作为商家进行测试 我只想使用测试环境 但它仍然不
  • 如何让我的viewpager从右向左滑动

    我有一个viewpager 它包含一些信息 但它允许我从左向右滑动页面 如何让它从左向右滑动 这意味着改变其方向 我认为你可以使用将当前页面设置为最后一页viewPager setCurrentItem 然后它会从左向右滑动
  • (Docker)构建 docker 文件时出现错误:docker-php-source:没有这样的文件或目录

    当我尝试在以下位置构建 docker 文件时 https github com docker library php blob 3f43309a0d5a427f54dc885e0812068ee767c03e 7 1 Dockerfile
  • MVC:为什么要分离模型、视图和控制器?

    除了它的 哲学 方面之外 让我的控制器也成为我的模型是一个坏主意吗 看来节省了一些编程时间 我不必在控制器和模型之间创建逻辑 因为它们是同一件事 我可以直接与视图交互 把M和C分开有什么意义 模块化 即能够将一个模型和控制器组替换为另一个模