何时定义静态红宝石类是一个好主意?

时间:2019-06-04 22:52:40

标签: ruby ruby-on-rails-3 static backend

在定义静态类而不是实例化类时,是否存在一些适用的规则?

仍然困扰于惯用的ruby初始化和静态类定义。

根据我的发现。

静态类似乎非常有效。

  1. ruby​​既是功能语言又是面向对象的语言。两种样式都可以写。功能样式对于“功能”事物超级有用。
  2. 我会定期观察从静态到实例化的类,然后非常迅速地膨胀。 “现在我们有了所有这些东西。为什么不做更多呢?!”我看到实例化的类很自然地倾向于承担更多的责任。 我发现当类从静态过渡到实例化时,我们获得的单元测试可信度会降低,因为运行时的事情可能会在内存分配/分配方面发生变化(例如,有人可能会意外地进入实例化和调用之间) 。 我发现静态类更易于阅读,因为我们不必考虑潜在的状态更改注意事项。更少的变异=更少的复杂性。

对我来说。主要问题是:

  1. 课堂上做的不只一件事。
  2. 大型旧红宝石代码库中的模式不稳定。

为了解决这两个问题,我认为静态方法(在可能的情况下)似乎给代码施加了很大的压力,要求他们遵守SOLID原则。

静态

Serializer.transform(fruit:)

实例化

Serializer.new(fruit:).transform

什么使您无法使用红宝石?

3 个答案:

答案 0 :(得分:2)

您的意思是,您只想将类用作纯函数的名称空间。

这没什么不对,您可以以这种方式使用ruby,但是您将在许多方面与该语言背道而驰。这是一个更长的讨论。

此外,我不会将其构造为静态或实例化。您实际上是在询问纯功能还是OO方法。最后,不要将OO等同于“突变”。您可以在ruby中使用不可变值对象,我建议您使用它们。您可能需要检查dry-rb生态系统,以一种纪律严明的方法提倡纯功能概念,该方法应与ruby对对象的自然支持相协调。

答案 1 :(得分:0)

从同事[CH]复制的另一个答案。

我总是喜欢对其中一些决定进行基准测试

require 'benchmark'

class ClassMethod
  def self.do_work
    1_000_000 * 1_000_000
  end
end

class InstanceMethod
  def do_work
    1_000_000 * 1_000_000
  end
end

class InstanceMethodHiddenByClassMethod
  def self.do_work
    new.do_work
  end

  def do_work
    1_000_000 * 1_000_000
  end
end

iterations = 10_000_000

Benchmark.bm do |x|
  x.report("class method") do
    iterations.times do
      ClassMethod.do_work
    end
  end

  x.report("instance method") do
    iterations.times do
      InstanceMethod.new.do_work
    end
  end

  x.report("class hiding instance pattern") do
    iterations.times do
      InstanceMethodHiddenByClassMethod.do_work
    end
  end
end

结果

user                           system     total      real
class method                   0.520000   0.010000   0.530000 (  0.531997)
instance method                1.130000   0.000000   1.130000 (  1.131185)
class hiding instance pattern  1.270000   0.010000   1.280000 (  1.282921)

答案 2 :(得分:0)

嗯。统治原则?

何时编写静态ruby类:

  • 在那里封装了很少输入的简单逻辑。诸如使用单个参数进行“序列化模型”或做出“业务决策”之类的事情。
  • 当内存管理规模是一个关键问题时。

何时编写要初始化的ruby类:

  • 需要持久性时。 (例如活动记录模型)
  • 常见的代码段(带有多个参数)经常被注入。
  • 具有注入的依赖项的“编排或路由”逻辑时。

无论如何。在我看来,团队聚在一起并概述在其依赖关系图上静态或实例化哪些重复模式是很重要的。