1

我有一个使用文档扫描仪(Epson WorkForce 545)的 Rails 应用程序。我有两个模型:文档和扫描仪。我很难确定我应该将代码放在哪里进行实际扫描操作。我最初认为我应该在 Scanner 模型中有一个scan方法来存放代码。但是,根据我的阅读,我应该只在模型中保留与数据库相关的操作(请参阅Yehuda 的回答here)。在模型中包含扫描仪逻辑似乎违反了这个想法。

然后我想我应该创建一个名为 ScannerUtilities 的模块并将其放在 /lib 文件夹中。我想这会起作用,但是将与模型密切相关的代码卡在 /lib 文件夹中是否有意义?此外,由于扫描仪用于创建 Document 对象,因此我从 Document 控制器调用scan方法。因此,代码涉及多个模型和控制器。

从我的 OO 思维来看,对象所做的应该被定义为该类的方法。那么,如果扫描仪扫描,扫描方法不应该在 Scanner 模型中吗?

放置此代码的最佳位置在哪里?

谢谢!

4

2 回答 2

2

你是对的,scan method应该在扫描仪类中,有几个原因:

  • 自然主义:扫描是扫描仪所做的;在面向对象的世界中,您拥有扫描仪,它们所做的一件事就是扫描东西
  • 干码:你将可以从任何地方调用扫描方法;在控制器中,您需要在需要它的每个控制器中复制它;不是很
  • 胖模型:它遵循“胖模型,瘦控制器”范式 - 看看这个演示文稿
  • 语言:它是惯用的和直观的。有些人可能不同意我的观点,但我认为 Rails 鼓励你用英语思考而不是用 Ruby 思考。只是谈论它可以清楚地表明扫描仪可以扫描事物

所以是的,我会把scan method罐头模型放在里面。

于 2013-02-13T00:09:31.497 回答
0

我会赞成“混合”方法。

考虑创建一个执行扫描的类,但通过 Scanner 模型访问它:

class Scanner

  def scan
    ScanExecutor.new(scanner: self).call
  end

end

这既满足了“扫描仪就是扫描”的自然方法,也满足了实用程序与模型的分离,这将防止你的胖模型变得肥胖。

它还鼓励在定义扫描操作时使用好的代码,因为它不必被压缩到单个方法中,而是可以成为一个结构良好的自己的类。

于 2016-12-05T20:58:52.353 回答