策略模式文件位置 Rails

Strategy pattern files location Rails

我有几个问题: 按照我对那个问题的完美回答 .

我计划使用策略模式,我想知道应该将 classes 文件放在哪里(在哪个文件夹中)?他们应该放在模型文件夹中吗? 另外,我有一个默认行为,我是否还需要创建一个接口 class 并从中派生出我的默认策略,或者我将我的默认策略定义为基本策略?

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

由于我提供了对原始问题的回答,让我尝试回答这个问题。

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

  • 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/workers 文件夹。这可能是有道理的,因为 worker 是全局的(不过,您可以将它们存储在 lib 中)。在你的情况下,你正在创建的是真正面向单一模型的,因此在 /app 中有一个专用文件夹可能太多了。此外,如果您使用通用名称,例如 strategies,那将毫无意义。

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

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

中没有任何意义

在一个小项目中,您可能会将其保存在 app/models 中,但我曾处理过拥有超过 30 个模型的项目,并且如果您将所有这些与持久性无关的功能存储在 app/models 那么你的文件夹就会慢慢变得一团糟