[英]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.