【问题标题】:MVC - Theory QuestionMVC - 理论问题
【发布时间】:2011-02-01 21:37:44
【问题描述】:

这更多是一个理论问题,而不是特定于语言的问题,但我主要指的是 AS3。

假设我有一个通过几个导航级别显示按钮的应用。

例如artistsAlphabetical->albums->songssongsAlphabetical->songalbumsAlphabetical->album->song

所以我们要建立一个包含所有歌曲的模型(数据)(最小公分母 - 它会在歌曲对象中包含艺术家/专辑/年份等信息)

假设我们没有专辑的数据集,需要从歌曲中提取数据。或者我们确实有一个数据集,需要匹配它们。

那应该属于哪一类?模型还是控制器?

我都可以找到原因,但我想知道“更正”的方法是什么。

接下来,我们有一个带有所有按钮的视图来进行排序。

当您点击排序按钮 Artists-A - 这是视图向控制器发送消息以执行某些操作(获取以 A 开头的按字母顺序排列的艺术家列表 )。最终结果应该是一个新的(必要时分页视图),每个艺术家都有按钮。

MVC 的哪个部分应该负责每个步骤?

生成以 A 开头的艺术家列表

会不会是控制器说 - '嘿模型 - 现在以 'A' 开头的艺术家!'

或者,它更像是“模型 - 给我发一份所有艺术家的名单,我需要找到 A-dawgs”?

本质上应该模型进行排序(如果可能/需要缓存它)还是逻辑应该在控制器下,模型可以存储缓存?

因此,一旦我们有了艺术家列表,我们就需要为所有适合屏幕的艺术家创建一个按钮,以及一些上一个/下一个按钮。谁应该创建按钮?

应该有一个视图控制器吗?仅处理创建视图所需的逻辑的子控制器?还是逻辑会成为视图的一部分?在我看来,应用程序的控制器就像“不在我的工作描述中......我给了你需要休息的清单,由你决定” p>

我觉得我在 MVC 的两个视图之间存在冲突,一个 (mvC) - 其中 Controller 像一个母亲一样工作,而 Model 是一个美化的数据持有者,而视图管理 DisplayObjects .或者(一个MVc),其中控制器是确保模型和视图正确通信的管理器/委托者,因此模型和视图将具有相当多的逻辑,并且控制器将处理沟通并委托顶级交互。

虽然我的大部分工作都是在 AS3 中完成的,但我很好奇其他语言会如何处理这个问题。例如,在 PHP 框架中,您无需像使用 as3 那样担心按钮逻辑和事件处理,您需要在其中查看垃圾收集,因此其中一个组件的工作量可能与 Cinder++ 中不同,处理或动作脚本应用程序。

【问题讨论】:

  • 您使用的是 MVC 框架,还是更直接的 AS3 MVC 实现之一(即 Moock 的)?
  • 这只是一个说明问题细节的例子。我试过 PureMVC,但不喜欢它。我很少与其他开发人员同时从事项目工作,而且我觉得这有点矫枉过正。我不知道 Moock 的实现是什么,我得研究一下。我只是将代码分为三个 MVC 部分,仅此而已。如果你愿意,我可以写一个程序。
  • 我回避了框架,直到我意识到它们帮助我在项目之间保持更一致,并且在项目的范围发生了一些严重的变化之后。 Moock 的 MVC 是他在 Essential Actionscript 书籍中描述的(不确定他的 AS3 书中是否有实现,可能在 AS3 Design Patterns 书中)。

标签: actionscript-3 model-view-controller design-patterns programming-languages


【解决方案1】:

我不知道 AS3。我同时使用 Spring MVC/Java,它真的可以让你使用任何一种方法,以及 Ruby on Rails,它有利于智能模型和哑控制器。我更喜欢智能模型/哑控制器方法。

所以对我来说,任何与排序和过滤数据有关的事情都应该在模型中完成,从歌曲列表中提取专辑的过程也应该如此。

在 Rails 中,我会将创建按钮集的过程毫无疑问地放在视图层中。如果涉及实际逻辑,那将进入视图辅助方法。

【讨论】:

  • 啊,很高兴获得一些更好的术语(智能模型/哑控制器)我可以看到如何在网络应用程序中 - ruby​​/php 等,这将是首选情况。在这个例子中,这几乎完全属于 View 领域(除了数据的存储和排序),因为 Controller 关心的是像整个应用程序的安全性和流畅运行这样的后果问题。在 actionscript 中,需要做很多更精细的工作才能让每个按钮正常工作以及管理内存(这是任何 as3 应用程序架构的重要组成部分)。感谢您的评论
【解决方案2】:

正如您已经说过的,这主要取决于偏好,但通常我会选择在控制器中进行排序。我倾向于让我的模型纯粹用于数据存储,并减少其中的功能量。因此,在您的示例中,模型的工作是保存所有艺术家的数据,而控制器的工作是从该数据中提取以“A”开头的艺术家,然后将排序后的数据传递给视图。

【讨论】:

    【解决方案3】:

    我不再使用传统的 MVC,所以我现在倾向于更多地考虑 PureMVC(代理、中介和命令)。

    一般来说,我倾向于更多的功能代理(想想模型),其中数据被抽象(因为抽象数据的典型原因)。因此,在您的情况下,会有一个 MusicLibrary 代理,并且可能会有 byArtist()、byTitle()、byRandom() 等方法。

    在 PureMVC 应用程序中,您的场景的序列如下所示:

    1. 组件捕获鼠标点击并发送 Mouse.CLICK
    2. 调解组件的中介捕获事件,并发送通知 SORTBY_ARTIST_CLICKED
    3. 请求 SORTBY_ARTIST_CLICKED 通知的命令,调用代理上的 byArtist() 方法,构建带有数据的通知 NEW_MUSIC_LIST 并发送它
    4. 中介请求 NEW_MUSIC_LIST 的通知然后做它的事情并更新组件正在争吵

    我认为这与 JacobM 所描述的智能模型/哑控制器一致。我认为这种方法可以更好地重用,也可以更好地将影响与更改隔离开来。

    我会说,一般来说,如果我对相同数据有不同的视图(比如你的情况),我会使用命令来推送数据,但如果一个视图只是获取数据更新,我通常会有查看只是从代理中提取数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 2010-10-17
      • 2020-07-19
      • 2010-12-12
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多