代码之家  ›  专栏  ›  技术社区  ›  Anurag

谁负责从远程源初始化模型

  •  1
  • Anurag  · 技术社区  · 15 年前

    我知道我要在代码中对此负责,但从面向对象和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];
    }
    

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

    我不认为我真的在这里将控制器中的职责分离开来,所以我正在考虑将所有这些职责放到模型本身中。添加类似的方法

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

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

    1 回复  |  直到 15 年前
        1
  •  1
  •   Rob Napier    15 年前

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

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

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