【问题标题】:Who is responsible for initializing a model from remote sources谁负责从远程源初始化模型
【发布时间】:2009-09-24 21:33:03
【问题描述】:

我知道我在代码中对此负责,但在面向对象和 MVC 的意义上,谁应该真正加载模型。我有一个模型来表示从 url 加载的 RSS 提要。该模型非常薄,控制器管理 XML 的下载和解析,然后将其传递给模型。这样做更好还是让模型自己负责初始化?

控制器中管理检索提要的代码如下所示:

// EntriesController.m
- (void)getFeedsFromWeb {
    Parser *parser = [[Parser alloc] init];
    [parser addListener:self];
    Downloader *downloader = [[Downloader alloc] initWithParser:parser];
    [downloader getFeed:@"http://www.example.com/rss"];
    [parser release];
}

- (void)notify:(Feed *)aFeed {
    self.feed = aFeed;
    [self updateView];
}

Downloader 开始下载和累积响应数据,并将其传递给 Parser。当 Parser 完成后,它会调用 EntriesController 类中的回调方法notify:(Feed *)feed,从而更新它的模型。

我认为我并没有真正将 Controller 中的职责解耦,因此我正在考虑将所有这些职责放在模型本身中。添加方法,如

// Feed.h
- (void)initWithContentsOfURL:(NSURL *)feedURL
- (void)initWithContentsOfDatabase:(sqlite *)database

它在模型类本身中完成所有工作。 这是一种好方法吗?模型是否应该负责从各种数据源中获取数据?

【问题讨论】:

    标签: iphone model-view-controller design-patterns model


    【解决方案1】:

    这里的“EntriesController”是视图控制器还是模型控制器?如果它是视图控制器,我建议将逻辑推入 Model 类。视图控制器的真正工作是管理视图并与模型协调;不要真正控制模型。

    如果它真的是一个模型控制器(即它没有 UI 元素),那么根据我的经验,同时拥有您编写的控制器和模型类有点不寻常。一般来说,所有的控制器逻辑都可以放入模型中,而控制器只是一个不需要的层。

    一般来说,我的经验是,在 MVC 世界中,您倾向于编写其中两个,而 Apple(或 XIB)提供另一个。如果你自己写这三个,可能涉及的层太多。

    【讨论】:

    • EntriesController 确实是一个视图控制器,一个表视图控制器。如果此模型有多个视图,则模型初始化代码将被复制到任何地方。而且,如果没有视图控制器,模型将无法使用。谢谢 Rob,我现在看到了我设计中的巨大缺陷。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多