【问题标题】:Declaring methods in Model when using MVC使用 MVC 时在 Model 中声明方法
【发布时间】:2012-07-17 10:50:53
【问题描述】:

我对 MVC 框架有点陌生,需要知道使用 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)类一样的单独类并在那里有一个读取函数是一个好习惯,还是应该在我的模型类中声明读取函数并删除 FeedReader? (因为我一直在读到在模型类中放置太多功能是不受欢迎的!!)并且将来所有的功能(如清理新闻描述、去除特定标签等)都会在模型类中编码,而模型类又会变得越来越大.

【问题讨论】:

    标签: ruby-on-rails rails-activerecord


    【解决方案1】:

    对此有多种意见。这是我的:你做对了。有一种叫做“简单责任原则”的东西,这在当今是一个流行词,但仍然有价值:你的对象应该做一件“事情”,并且把它做好。因此,拥有一个用于处理新闻提要的类和一个用于处理新闻检索的类,对我来说完全有意义。

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

    【讨论】:

      【解决方案2】:

      该方法应该保留在FeedReader 中,但您可能会受益于将NewsFeed 实例(或一个可以处理NewsFeed 实例列表的集合)传递给从提要中提取信息的方法(我我不确定名称read 在这种情况下是否很好)。

      请记住,Atom 和 RSS 提要都有。而且您不应该将您的代码焊接到其中一种格式。相反,您应该能够通过利用多态性来同时使用两者(如果需要)。

      至于 SRP:实际上最好的解释是,我听到的是跟随 - 类应该只有一个改变的理由

      【讨论】:

      • 谢谢!因此,如果在某个时候我更改了我的数据库架构,这反过来又需要我更改 feedreader 类,这不会被认为是一个糟糕的设计?
      • 仅当您的读者直接访问 NewsFeed 的变量时(这意味着破坏封装)。
      猜你喜欢
      • 2011-05-22
      • 2022-01-09
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 2013-11-09
      相关资源
      最近更新 更多