策略模式文件位置Rails

时间:2015-12-06 18:31:35

标签: ruby-on-rails design-patterns strategy-pattern

我有几个问题: 遵循我对该问题的完美回应Business logic dependent on model attribute

我计划使用策略模式,我想知道我(在哪个文件夹中)应该放置类文件的位置?他们应该进入模特文件夹吗? 另外,我有一个默认行为,是否仍然需要创建一个Interface类并从中派生出我的默认策略,或者我将默认策略定义为基本策略?

1 个答案:

答案 0 :(得分:3)

这是一个主观的答案,因此可能会在某个时候关闭。

当我提供原始问题的答案时,让我试着回答这个问题。

您可以在两个位置存储此文件:

  • app
  • lib

在这种特定情况下,我会使用lib文件夹。对于我正在处理的每个Rails应用程序,我通常在lib中有一个特定的文件夹,名称与项目的名称相同,代表我存储特定于我的应用程序的业务逻辑的命名空间。

例如,如果我的项目被称为whatever,我有一个lib/whatever以及一个文件lib/whatever.rb,它是我的命名空间的根。

module Whatever
end

lib/whatever文件夹中的每个文件都嵌套在该命名空间中。在这种情况下,您可以在lib/whatever/commissions创建特定于佣金策略的文件夹,并创建以下文件

# lib/whatever/commissions/alpha_strategy.rb
class Whatever::Commissions::AlphaStrategy
end

# lib/whatever/commissions/beta_strategy.rb
class Whatever::Commissions::BetaStrategy
end

要减少文件数量,您只需拥有一个lib/whatever/commissions.rb文件即可存储所有策略。当每个策略的实施相对较短时,这很有效。

# lib/whatever/commissions.rb
module Whatever::Commissions
  class AlphaStrategy
  end

  class BetaStrategy
  end
end

让我们看看为什么我不会将这些文件放在app中。同样,这种反应是主观的,它基于我对相当大而复杂的Rails应用程序的个人经验。

我已经看到使用/app来存储很多东西。例如,常见的模式是在app中创建app/workers文件夹。这可能是有意义的,因为工人是全球性的(仍然,你可以将它们存储在lib中)。在您的情况下,您创建的内容实际上是针对单个模型,因此在/app中有一个专用文件夹可能太多了。此外,如果您使用诸如strategies之类的通用名称,则根本不会有意义。

那么为什么不app/models呢?嗯,实际上这可能是第二种选择。但是,我更喜欢只在该文件夹和模型中存储模型,对我来说,只意味着与持久性相关的功能。

您创建的内容与持久性没有直接关系。它使用持久化对象(模型的实例),但它与将数据保存到数据库无关。因此,它在app/models

中确实没有意义

在一个小项目中,您可以将其保存在app/models中,但我已经处理过您拥有30多个模型的项目,并且如果您将所有这些与非持久性相关的功能存储在{{} 1}}然后你的文件夹将慢慢变得一团糟。