Mik*_*e W 2 design-patterns ruby-on-rails strategy-pattern
我有几个问题:遵循我在该问题上得到的完美答复Businesslogic dependent on model attribute。
我计划使用策略模式,我想知道应该将类文件放在哪里(哪个文件夹中)?他们应该放在模型文件夹中吗?另外,我有一个默认行为,我是否仍然需要创建一个 Interface 类并从中派生我的默认策略,或者我将我的默认策略定义为基本策略?
这是一个主观答案,因此很可能会在某个时候关闭。
既然我已经回答了最初的问题,那么让我尝试回答这个问题。
您可以在两个位置存储此文件:
applib在这种特定情况下,我会选择lib文件夹。对于我正在开发的每个 Rails 应用程序,我通常在 lib 中都有一个特定的文件夹,该文件夹以与项目相同的名称进行调用,该文件夹代表我存储特定于我的应用程序的业务逻辑的名称空间。
例如,如果我的项目名为whatever,我有一个lib/whatever文件lib/whatever.rb,它是我的命名空间的根。
module Whatever
end
Run Code Online (Sandbox Code Playgroud)
文件夹中的每个文件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
Run Code Online (Sandbox Code Playgroud)
要减少文件数量,您只需使用一个lib/whatever/commissions.rb文件来存储所有策略即可。当每个策略的实施时间相对较短时,这种方法很有效。
# lib/whatever/commissions.rb
module Whatever::Commissions
class AlphaStrategy
end
class BetaStrategy
end
end
Run Code Online (Sandbox Code Playgroud)
相反,让我们看看为什么我不将这些文件放在app. 同样,这个回答是主观的,它基于我对相当大和复杂的 Rails 应用程序的个人经验。
我见过用来/app存储很多东西的。例如,一种常见的模式是app/workers在应用程序中创建一个文件夹。这可能是有道理的,因为工人是全球性的(仍然,您可以将它们存储在lib)。就您而言,您正在创建的内容实际上是面向单个模型的,因此拥有一个专用文件夹/app可能太多了。另外,如果您使用这样的通用名称,strategies则根本没有意义。
那为什么不呢app/models?嗯,事实上这可能是第二种选择。但是,我更喜欢仅将模型存储在该文件夹中,并且模型对我来说仅意味着与持久性相关的功能。
你所创造的东西与持久性没有直接关系。它使用持久化对象(模型的实例),但与将数据保存到数据库无关。因此,它在app/models.
在一个小项目中,您可能可以将其保存在 中app/models,但我曾经处理过拥有超过 30 个模型的项目,如果您将所有这些与持久性无关的功能存储在其中,app/models那么您的文件夹将慢慢变得一团糟。
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |