问题标签 [separation-of-concerns]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3356 浏览

model-view-controller - MVC:模型和实体对象是不同的概念吗?

前段时间我在这里询问了一些关于理解 MVC 的帮助,因为我对这个话题很陌生。我以为我对它有一个不错的理解,这在我最近写的一篇关于这个主题的博客文章中有记录。我的理解基本上可以归结为:

控制器:确定需要做什么来满足请求,并根据需要利用它需要收集/修改的任何模型。它基本上是给定流程的管理者。

视图:仅演示。一旦控制器收集到它需要的东西,它就会创建一个特定类型的视图,将信息传递给它,然后说“不管你怎么做都给用户展示”。

模型:应用程序的行为。当控制器要求它提取或修改某些东西时,它知道如何去做。它还知道触发其他模型来执行相关任务(据我了解,当模型尝试在 StackOverflow 上“为某事投票”时,该模型知道询问是否也应该因此授予徽章。控制器不需要关心)。

我的问题是,假设所有这些或多或少是准确的,实体对象是从哪里来的?模型和实体是同一回事,每个对象都知道如何保存自己的数据,还是实体是独立存在并在整个应用程序中使用的独立概念?

我的钱是后者,因为这将允许模型独立运行,而所有三层(模型、视图和控制器)都可以根据需要利用实体来传递数据。此外,对象和数据库持久性似乎是应该分开的问题。

老实说,我对 MVC 的了解越多,我就越困惑。我已经准备好接受核心概念(将表示与逻辑分开)并以任何感觉正确的方式运行它,而不必太担心“MVC”标签。

0 投票
3 回答
190 浏览

ruby-on-rails - 这个 Rails 3 Controller 方法会让我看起来很胖吗?

这是一个新应用程序,我在 Search 控制器上有一个 index 方法。这也用作应用程序的主页,我试图从设计模式的角度确定我是否走错了路。

该方法已经有 35 行长。以下是该方法的作用:

3 行设置变量以确定正在搜索的分层数据的“级别”。

另外 10 行根据子域是否在请求中填充一些视图变量。

一个 10 行的部分,根据以下内容重定向到两个页面之一:

1) 如果用户没有访问权限,并且已登录,并且尚未请求访问,请告诉他们“单击此处请求访问该品牌”。

2) 如果用户没有访问权限、已登录并且已经请求访问权限,请告诉他们“某某正在审查您的请求”。

另外 10 行来构建动态 arel。

我无法直截了当地弄清楚如何将这些问题分开,或者即使它们应该分开。感谢您提供的任何帮助!

0 投票
1 回答
49 浏览

language-agnostic - 类应该支持接口,但这需要以侵入方式向类添加逻辑。我们可以防止这种情况吗?

我有一个 C++ 应用程序,它从数据库加载大量数据,然后对这些数据执行算法(这些算法是 CPU 和数据密集型的,所以我事先加载了所有数据),然后保存所有数据改回数据库。

数据库部分与应用程序的其余部分很好地分开。事实上,应用程序不需要知道数据来自哪里。应用程序甚至可以在文件上启动(在这种情况下,一个单独的文件模块将文件加载到应用程序中,最后将所有数据保存回文件)。

现在:

  • 数据库层只想将更改的实例保存回数据库(而不是完整的数据),因此它需要知道应用程序更改了哪些内容。
  • 另一方面,应用程序不需要知道数据来自哪里,因此它不想被迫为每个数据实例保持一个更改状态。

为了使我的应用程序及其数据结构与加载和保存数据的层(可以是数据库或文件)尽可能分离,我不想用有关实例自启动以来是否更改的信息污染应用程序数据结构或不。

但是为了使数据库层尽可能高效,它需要一种方法来确定应用程序更改了哪些数据。

复制所有数据并在保存时比较数据不是一种选择,因为数据很容易填满几 GB 的内存。

将观察者添加到应用程序数据结构中也不是一种选择,因为应用程序算法中的性能非常重要(循环遍历所有观察者并调用虚函数可能会导致算法中的重要性能瓶颈)。

还有其他解决方案吗?或者如果我不想以侵入性方式向我的应用程序类添加逻辑,我是否试图过于“模块化”?在这些情况下,务实一点会更好吗?

ORM 工具是如何解决这个问题的?它们是否还强制应用程序类保持某种变化状态,或者它们是否强制这些类具有变化观察器?

0 投票
3 回答
298 浏览

c# - 如何避免两次声明数据库字段,一次在数据库中,一次在存储库/模型中?

我最近开始阅读Pro ASP.NET MVC 框架

作者谈到了创建存储库,以及使用接口设置快速自动化测试,这听起来很棒。

但它带来的问题是必须两次声明数据库中每个表的所有字段:一次在实际数据库中,一次在 C# 代码中,而不是使用 ORM 自动生成 C# 数据访问类。

我确实明白这是一个很好的做法,并且启用了看起来也很棒的 TDD。但我的问题是:

是否有任何解决方法必须两次声明字段:在数据库和 C# 代码中?我不能使用自动生成 C# 代码但仍允许我执行 TDD 而不必在 C# 中手动创建所有业务逻辑并为每个表创建一个存储库(以及一个假的)的东西吗?

0 投票
3 回答
6041 浏览

model-view-controller - 在 JSF2 托管 bean 中实现 MVC 的最佳实践

随着我正在处理的 Web 项目的复杂性增加,包含 MVC 结构的需求变得更加紧迫。我的模型类定义明确,但视图和控制器代码往往会混在一起。我也一直在网站上使用相当繁重的 AJAX(主要是 RichFaces jsFunctions),这使事情变得稍微复杂一些。

有没有人找到使用 JSF2 实现 MVC 的好策略?我不想在项目中引入另一个框架(例如 Spring MVC)。

到目前为止的一些想法,我还没有开始做

  • 对于带有大量 ajax 的页面,有一个“视图”bean 用于记住选定的选项卡、选定的项目、提供过滤的数据列表等......
  • 有一个“控制器”bean 来处理模型更改等操作
  • 在 JSF 页面和控制器之间有“命令”bean。jsFunction 使用参数填充命令 bean,调用command.execute()会导致命令 bean 调用控制器 bean 上的正确方法以执行操作。'command' bean 可能包含一些要在完成时调用的 javascript。它还可以指定要重新呈现的页面区域。

有什么想法吗?

编辑

我经常看到的是托管 bean,它们倾向于做所有事情:跟踪用户的选择、更新模型、获取过滤列表等......

我们目前使用的是 JSF 1.2,所以我们不能使用带有参数的动作/动作监听器。例如,我们的托管 bean 包含变量,例如m_selectedDate其唯一目的是在调用updateFilteredItemsBasedOnDate(). 如果额外的变量可以消失就好了,因为它们只是暂时的。JSF 2 的带参数的 EL 应该会有所帮助,但我很好奇是否有可用的替代解决方案。

我很好奇是否有一种方法可以将 MVC 应用于托管 bean,或者某种分离关注点的方法,这样我们就不会得到试图做所有事情的大型 bean。

0 投票
2 回答
430 浏览

php - 关注点分离 - 在 MVC 结构中刷新()的位置(控制器与服务层)

我有一个应用程序,我使用 PHP 与 Zend 框架和 Doctrine2 作为 ORM。我的问题与控制器最好应该了解多少底层模型和持久层有关。理想情况下,我自己会说这“什么都不是”——控制器不应该知道实体是如何/何时被持久化的。但是我觉得这并不总是最好的解决方案(?)。

我尝试遵循“关注点分离”设计指南。我通过创建一个在我的模型上执行 CRUD 操作的服务层来做到这一点。请参见以下示例:

如您所见,控制器对持久性一无所知,但要获得此结果,我需要在每次调用服务层的 createXXX() 或 updateXXX() 方法时同时执行 persist() 和 flush()。我宁愿做这样的事情:

但这会导致 Doctrine2 失败,因为它确实以错误的顺序将对象持久保存到数据库中 - 特权在部分之前保留(不知道是否可以指示 Doctrine 以有序的方式执行此操作??)。权限为尚未保留的部分获取错误的 ID。

无论如何,这里的大问题是我是否应该尝试推迟刷新,直到所有对象都被创建并设置好关系。目标是让一个事务完成所有写入数据库 - 因此必须由控制器触发(因为它是唯一知道何时完成对象和关系构建的事务),从而“污染”控制器与持久层?

0 投票
4 回答
604 浏览

asp.net-mvc - 我的 CRUD LINQ 代码在哪里?ASP.NET MVC

我目前正在一个项目中使用 ASP.NET MVC 框架(几乎是我的第一次)

我使用 Linq2SQL 作为我的数据模型..

我应该在哪里有这种代码:

我目前在控制器中有这种代码,并将我得到的数据传递到视图中..

这个可以吗?

如果不是,我如何让我的 linq2sql 数据模型包含这种代码?

谢谢

丹尼尔

0 投票
2 回答
347 浏览

domain-driven-design - 通过域封装的持久性,还是通过存储库的持久性?

如果我的域模型不应该知道/关心存储库,那么.UpdateOrder(...)封装 CRUD-Update 的一些行为如何与存储库接口?通过域服务?

好的,那么我的存储库有一个有效的 CRUD 更新,它与我的.UpdateOrder(...). 没关系。但我不希望有人在存储库上使用 Update 方法,我希望他们通过实体上的行为(改用 UpdateOrder() )。我更喜欢与我的域模型满足不变量的方式相似 - 通过它的设计(私有集属性等) - 我的存储库公开替代方法来“更新”/持久化实体。

这只是一个访问修饰符问题,我没有在 Repo public 中使用 Update 方法来解决。还是有“更好”的答案?请帮助我 DDD 忍者。

0 投票
1 回答
192 浏览

model-view-controller - 数据注释是否违反关注点分离?-asp.net mvc

在 asp.net mvc 中,当我在 Model 中使用 dataannotations 进行自定义验证和验证消息时,它不会违反关注点分离吗?即:自定义验证可能与业务逻辑有关,并且可能必须使用视图特定参数(如本地化)来验证错误消息?

您对此有何看法和看法。什么是对数据进行验证的最佳方式,同时又能很好地分离关注点?

0 投票
2 回答
25273 浏览

web-services - 如何在 Visual Studio 2010 Pro 中创建 .NET 4.0 Web 服务项目?

Web 服务模板不在 .NET 4.0 项目列表中——仅 .NET 3.5,但我的服务需要依赖于具有我的模型/数据库功能的 .NET 4.0 程序集。该程序集依赖于 4.0,因为需要数据提供程序(dotConnect for MySQL)

Web 服务将需要对此业务逻辑程序集的引用,以便它可以将其参数传递给所述程序集并盲目返回。但是,我能否在 .NET 4.0 应用程序池中运行 Web 服务项目,而数据提供者不会出现任何问题?

我有 Visual Studio 2010 Professional,而不是 Ultimate(我读过有模板)——有什么办法解决这个问题吗?