gpt4 book ai didi

ruby-on-rails - 策略模式文件位置 Rails

转载 作者:行者123 更新时间:2023-12-02 04:15:23 29 4
gpt4 key购买 nike

我有几个问题:遵循我在该问题上得到的完美答复Business logic dependent on model attribute .

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

最佳答案

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

既然我已经回答了最初的问题,那么让我尝试回答这个问题。

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

  • 应用
  • lib

在这种特定情况下,我将使用 lib 文件夹。对于我正在开发的每个 Rails 应用程序,我通常在 lib 中都有一个特定的文件夹,该文件夹以与项目相同的名称进行调用,该文件夹代表我存储特定于我的应用程序的业务逻辑的 namespace 。

例如,如果我的项目名为 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 中,那么你的文件夹会慢慢变得一团糟。

关于ruby-on-rails - 策略模式文件位置 Rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34121051/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com