繁体   English   中英

策略模式文件位置Rails

[英]Strategy pattern files location Rails

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

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

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

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

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

  • 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多个模型的项目,如果您将所有这些非持久性相关的功能存储在app/models那么您的文件夹将慢慢变为一团糟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM