我有几个问题: 遵循我对该问题的完美回应Business logic dependent on model attribute。
我计划使用策略模式,我想知道我(在哪个文件夹中)应该放置类文件的位置?他们应该进入模特文件夹吗? 另外,我有一个默认行为,是否仍然需要创建一个Interface类并从中派生出我的默认策略,或者我将默认策略定义为基本策略?
答案 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}}然后你的文件夹将慢慢变得一团糟。