有一个数据对象列表和一些可视化的东西来表示每个对象,你会在哪里编写排序/过滤逻辑?为什么?
编辑:到目前为止所有的答案都很好,但我忘了添加另一个约束。如果我不想每次都重建视图怎么办?
取决于排序/过滤操作的复杂性以及视图控件是否本机提供这些服务。如果视图控件提供过滤并且它只是重新格式化内存中的数据,则将其保留在视图中。如果排序/过滤器需要再次访问数据源,则将其全部保存在控制器中。
答案在于数据。模型提供数据。如果所有数据都在视图中,则过滤和排序可以包含在视图中。如果数据被分块,模型必须传递数据并包含一些过滤/排序(视图可能仍然包含过滤/排序)。
控制器不应该包含这些功能,因为它是一种路由机制,不应该知道如何解释数据。
我会在控制器中放入排序和过滤方法,并从视图中调用这些方法。
您的视图应该只处理显示输出。将任何过滤/排序放入您的业务逻辑并将其返回到视图。
我相信排序应该是分开的。您不应该对模型进行排序,因为您希望保持原样。基本上,模型中的更改意味着视图的重新渲染,而您可能不希望这样做(例如,如果您想为过滤器前后状态之间的过渡设置动画)。
我的建议是模型提供数据来创建视图的视觉对象列表和排序器对象。排序器对象将输出一个渲染列表,该列表只是一个链接到视觉对象的标识符列表(对象列表中的索引或其他)。ID 出现的顺序代表排序的顺序,任何不在渲染列表中的 ID 都会被隐藏。每次视图接收到渲染列表时,它都会更新它的显示。