策略模式文件位置 Rails
Strategy pattern files location Rails
我有几个问题:
按照我对那个问题的完美回答 .
我计划使用策略模式,我想知道应该将 classes 文件放在哪里(在哪个文件夹中)?他们应该放在模型文件夹中吗?
另外,我有一个默认行为,我是否还需要创建一个接口 class 并从中派生出我的默认策略,或者我将我的默认策略定义为基本策略?
这是一个主观的答案,因此它可能会在某个时候关闭。
由于我提供了对原始问题的回答,让我尝试回答这个问题。
您可以将此文件存储在两个可能的位置:
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/workers
文件夹。这可能是有道理的,因为 worker 是全局的(不过,您可以将它们存储在 lib
中)。在你的情况下,你正在创建的是真正面向单一模型的,因此在 /app
中有一个专用文件夹可能太多了。此外,如果您使用通用名称,例如 strategies
,那将毫无意义。
那为什么不app/models
呢?好吧,事实上这可能是第二种选择。但是,我更喜欢只在该文件夹中存储模型,对我而言,模型意味着仅与持久性相关的功能。
您正在创建的内容与持久性没有直接关系。它使用持久对象(模型的实例),但与将数据保存到数据库无关。因此,它在 app/models
.
中没有任何意义
在一个小项目中,您可能会将其保存在 app/models
中,但我曾处理过拥有超过 30 个模型的项目,并且如果您将所有这些与持久性无关的功能存储在 app/models
那么你的文件夹就会慢慢变得一团糟
我有几个问题:
按照我对那个问题的完美回答
我计划使用策略模式,我想知道应该将 classes 文件放在哪里(在哪个文件夹中)?他们应该放在模型文件夹中吗? 另外,我有一个默认行为,我是否还需要创建一个接口 class 并从中派生出我的默认策略,或者我将我的默认策略定义为基本策略?
这是一个主观的答案,因此它可能会在某个时候关闭。
由于我提供了对原始问题的回答,让我尝试回答这个问题。
您可以将此文件存储在两个可能的位置:
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/workers
文件夹。这可能是有道理的,因为 worker 是全局的(不过,您可以将它们存储在 lib
中)。在你的情况下,你正在创建的是真正面向单一模型的,因此在 /app
中有一个专用文件夹可能太多了。此外,如果您使用通用名称,例如 strategies
,那将毫无意义。
那为什么不app/models
呢?好吧,事实上这可能是第二种选择。但是,我更喜欢只在该文件夹中存储模型,对我而言,模型意味着仅与持久性相关的功能。
您正在创建的内容与持久性没有直接关系。它使用持久对象(模型的实例),但与将数据保存到数据库无关。因此,它在 app/models
.
在一个小项目中,您可能会将其保存在 app/models
中,但我曾处理过拥有超过 30 个模型的项目,并且如果您将所有这些与持久性无关的功能存储在 app/models
那么你的文件夹就会慢慢变得一团糟