使用MVC时在Model中声明方法

时间:2012-07-17 10:50:54

标签: ruby-on-rails rails-activerecord

我对MVC框架有点新意,需要知道使用它时的最佳做法。

我有一个名为NewsFeed的模型类,其中包含news_title,news_publish_date,news_url等字段。

class NewsFeed < ActiveRecord::Base

  attr_accessible :description, :feed_id, :link, :publish_date, :title

  def save_news_info(feed_id, news_title, news_link, news_publish_date, news_description)
    self.feed_id = feed_id
    self.title = news_title
    self.link = news_link
    self.publish_date = news_publish_date
    self.description = news_description
  end
end

任务是读取RSS源并收集它包含的所有新闻,所以我创建了一个名为FeedReader的类,在该类中我使用gem feedzirra来解析源链接

class FeedReader

  attr_accessor :title, :url, :publish_date, :news_array

  def initialize(feed_url)
    @url=feed_url
  end

  def read
    feed = Feedzirra::Feed.fetch_and_parse(@url)
    @title = feed.title
    @url = feed.feed_url
    @publish_date = feed.last_modified
  end
end

我的问题是,如果这是一个很好的做法,就像模型(NewsFeed)类一样有一个单独的类并且在那里有一个read函数,或者我应该在我的模型类中声明read函数并删除FeedReader? (警告我一直在阅读,在模型类中放置过多的功能是不受欢迎的!!)并且将来所有功能(如清理新闻描述,剥离特定标签等)都会在模型类中进行编码,而模型类又会变得越来越大

2 个答案:

答案 0 :(得分:2)

对此有几点看法。这是我的:你正在做正确的事。有一种叫做“简单责任原则”的东西,这种说法近来有点流行,但仍然有价值:你的对象应该做一件“事情”,做得好。因此,有一个类用于处理新闻源,另一个用于处理新闻检索,这对我来说是完全合理的。

奖励点:它(据说)更容易测试。

答案 1 :(得分:1)

该方法应保留在FeedReader中,但您可以将NewsFeed实例(或可以处理NewsFeed个实例列表的集合)传递给提取的方法,来自Feed的信息(我不确定名称read在这种情况下是否如此优秀。)

你要记住,有Atom和RSS提要。并且您不应该将代码焊接到其中一种格式。相反,你应该能够通过利用多态来兼顾两者(如果需要)。

对于SRP:实际上是对它的最好解释,我听说过 - 类应该只有一个原因需要改变