策略模式文件位置Rails

我有几个问题:遵循我对该问题的完美回应。 业务逻辑依赖于模型属性 。

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

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

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

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

  • app
  • lib

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

例如,如果我的项目被调用,我有一个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呢? 嗯,实际上这可能是第二种选择。 但是,我更喜欢只在该文件夹和模型中存储模型,对我来说,只意味着与持久性相关的function。

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

在一个小项目中,您可以将其保存在app/models ,但我已经处理过您拥有30多个模型的项目,如果您将所有那些与持久性相关的function存储在app/models那么您的文件夹将慢慢变为一团糟。