更改模型中数据的最佳方法是什么?

时间:2011-08-15 22:13:05

标签: model-view-controller architecture

想象一下包含一些项目的列表。 每个项目都是一部电影,包括:

  • 标题
  • 星级排名(1-5)
  • 添加到我的列表按钮
  • 您可以发表评论的文本框

怎么做:

  • A)将侦听buttonClicked事件,然后调用模型上的方法:

    onClick: function(event){
       this.model.addToMyList();
    }
    

    无需指定movieId,因为“model”适用于此项目。在其他情况下,该模型适用于所有项目。

  • B 列表将侦听一个项目以发送buttonClicked事件,从事件中获取数据并将调用模型上的方法:

    model.addToMyList(movieId)
    
  • C 列表将侦听一个项目来发送buttonClicked事件,此事件将继续执行项目的索引(不是电影的id) ,然后使用列表中的索引找到movieId,并将在模型上调用方法:

    model.addToMyList(movieId)
    

1 个答案:

答案 0 :(得分:1)

你没有提及任何语言,所以我会给出一种语言中立的回应。

不推荐C:通过列表中的索引识别项目似乎是一个简单的选项,但任何扩展功能或可维护性可能会在以后变得混乱(突然排序列表,让用户过滤列表等)。

考虑到可维护性(不是先发制人的设计,而是更容易适应变化的设计),事件处理程序最好能够识别正在处理的内容。这样,您就可以修改将应用于所有项目的处理程序。

使用B:我更多地保留了一个更改的集合,其意图是控件/组件正在侦听集合更改(例如INotifyCollectionChangedin .net)。所以说不知道你是否想要对这个系列采取特定行动是一件困难的事情,但除非收集(作为数据模型)改变决定其他方面,否则它不会是我的第一选择。

因此,考虑到上述情况,(这听起来像AB混合,但它是一种常用的解决方案):创建的新项目已注册到事件处理程序(只是代码一个事件处理程序) ,并传入对项目行本身的引用或标识符。所以,如果可能的话,你会看到:

onClick: function(MyEvent e)
{
   this.model.addToMyList(e); //or this.model.addToMyList(e.ID)
}

因此,您有多个项目注册同一事件,一个要维护的事件处理程序以及保存该处理的能力,如果您的列表通过过滤器,排序等进行更改。