0

我正在开发一个基于 MVC 的应用程序。我有一个包含客户名称的数组。该数组是从数据库中填充的。

控制器(Java) 将此数组传递给视图( JSP) 并由视图呈现它。客户列表需要按升序显示。此外,如果存在名为 XYZ 的客户端,则该 XYZ 客户端应始终显示在列表的首位。还有其他这样的规则。

问题是,设计的角度来看,排序应该发生在哪里?它应该发生在控制器(Java)还是视图(JSP)中?

顺便说一句,我还需要提一下,我更喜欢用 Java 编程而不是用 JSP/JavaScript。如果没有“正确”或“错误”的做法,那么我肯定更喜欢在控制器本身中对其进行排序。

另外,从性能的角度来看,哪个更好?

4

4 回答 4

3

从设计的角度来看,控制器应该控制排序规则,但它不应该自己执行排序。相反,它应该将此任务委托给模型。在理想的世界中,控制器不应该对数据进行任何修改,只告诉模型它希望如何修改数据。

不幸的是,现实经常会干扰理想的设计:当允许用户控制排序时,例如通过单击列标题,通常会采用允许视图对数据进行排序的快捷方式来减少与模型的往返次数(这通常是实现为数据库),从而减轻了 RDBMS 的负担。这个决定的一个不幸的副作用是与分页缺乏一致性:在视图中排序当前页面上的数据,忽略其他页面中应该在当前显示内容之前或之后出现的数据。这个缺点通常作为“特征”呈现给用户。

在您的情况下,排序似乎是“业务规则”的一部分:“XYZ”记录必须保留在顶部,并且存在“其他此类规则”这一事实表明排序不是纯粹的视觉问题。考虑设计一种可以保存有关排序的“元数据”的“排序描述符”。您的控制器应创建此“排序描述符”的实例,并将其传递给模型进行处理。模型应该“解释”描述符的内容,并以正确的顺序生成数据。

于 2013-07-18T15:56:34.857 回答
0

排序可以在 SQL Query 本身中完成(如果排序不复杂),然后您可以通过控制器将数据传递给视图。

但是,如果您有大量的规则不能全部在 SQL 语句中实现,我会简单地在控制器中完成。

您始终可以创建一个存储过程并调用它,我认为这确实是一种偏好。

只是为了 MVC 模式,我喜欢把它放在控制器中,因为控制器是用来做这种事情的。

于 2013-07-18T15:45:22.053 回答
0

从设计的角度来看,我会说控制器不应该知道视图如何显示数据;它已排序并具有其他规则的事实纯粹是显示约束;哎呀,根本不需要在控制器中订购日期,它可能是在一个HashMap或这样的。

话虽如此,在控制器中订购东西可能更有效。

于 2013-07-18T15:55:56.263 回答
0

默认排序顺序应在数据库中处理。如果数据库设计还负责将正确的索引放在适当的位置(例如正在执行默认排序的列上的聚集索引),那么执行此类操作是经过高度优化的。但是,即使在最坏的情况下,它也不会迟于在代码中执行的时间进行排序。

二级排序顺序应该在视图层中处理,因为是它的工作——处理数据的显示方式。视图可以理想地使用s 来支持不同的Comparator排序顺序。如果您有表格数据的视图并且用户请求对其他列进行排序;它应该按视图(而不是控制器模型)排序。

控制器与它无关。它只是编排流程或将数据移出模型;标识正确的视图并使其可供视图使用。控制器不处理数据;这是模特的工作。

但是,排序与处理无关;它是关于以某种顺序渲染的,它应该保持灵活并取决于视图。通过在模型中执行此操作,您将强制执行数据的显示方式,并且取决于它是哪种应用程序(Web 或桌面),可能会对事物进行两次排序。

我可以看到的模型中排序的唯一用例是在您的数据源根本不排序时提供默认排序顺序(例如,它不是数据库,它是 Web 服务),或者当您想要覆盖时一组视图共享的顺序(它们本身不对数据进行排序)。

于 2013-07-18T16:03:58.073 回答