2009-09-24 34 views
1

我知道我在代码中负责这一点,但是在面向对象和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]; 
} 

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

我不认为我真的在这里解耦控制器的责任,所以我正在考虑将所有这些责任放在模型本身。添加方法如

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

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

回答

1

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

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

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

+0

EntriesController确实是一个视图控制器,一个表视图控制器。如果这个模型有多个视图,模型初始化代码将被复制到任何地方。此外,如果没有视图控制器,模型将不可用。感谢罗布,我现在看到了我设计中的巨大缺陷。 – Anurag 2009-09-25 00:44:16