Ruby最佳实践:使用类

时间:2012-05-25 10:27:55

标签: ruby

请参阅下面的示例,我想最好使用第二种方法,但第一种方法也可以。 哪种方法最好,使用另一种方法的后果是什么?

class Test 
  def start 
    p "started"
  end
  test = Test.new 
  test.start 
end 

class Test2
  def start 
    p "started"
  end
end
test2 = Test2.new 
test2.start 

4 个答案:

答案 0 :(得分:4)

我想说第二种变体更有意义。第一个不会导致错误,但是对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:

var = "string"

class A
  var = A.new
end

puts var #=> string

没有闭包,外var与班级内的initialize不同。这意味着您的对象在创建后“迷失”,将无法再访问,并最终受GC影响。

当您说第一个示例“有效”时,在此上下文中工作意味着 可以在类范围内创建该对象后立即调用新创建的对象上的方法。但是不可能将该对象作为参考以供以后使用(不将其分配给类(实例)变量)。

如果您不需要参考以供以后使用,并且您真的想要进行这样的“一次性”操作,那么使用可以在不实例化对象的情况下调用的类方法或执行必要的操作将更加惯用在{{1}}中,如果它必须在每个实例化上完成。

答案 1 :(得分:3)

你可以通过多种方式做到这一点,这取决于你。这是一个有趣的...

class Test 
  def start 
    p "started"
  end
  new 
end.start

更严重的是,您的第一个示例将所有内容封装在一个类中。对于剧本来说没关系;它将所有内容放在您自己的命名空间中,并且主要避免了神秘的主对象上下文。如果需要,可以定义嵌套类。

然而,第二种方法更为传统。

答案 2 :(得分:3)

定义一个在加载时创建自身对象的类不是一个好主意。 该对象只能用于自己,而不能用于其父级的范围(当然您仍然可以通过ObjectSpace::each_object访问它。)

答案 3 :(得分:2)

Ruby类的一些最佳实践

  • 在类定义中使用一致的结构。
  • 不要在类中嵌套多行类。尝试将这些嵌套类分别放在名为like包含类的文件夹中的自己的文件中。
  • 仅使用类方法将模块添加到类中。只有在有意义的情况下才能使用类。
  • 如果要将模块的实例方法转换为类方法,请在expand self上使用module_function。
  • 在设计类层次结构时,请确保它们符合Liskov替换原则。
  • 尽量让您的课程为SOLID
  • 始终为表示域对象的类提供正确的to_s方法。
  • 使用attr系列函数来定义普通的访问器或变更器。
  • 避免使用attr。请改用attr_readerattr_accessor
  • 考虑使用Struct.new,它为您定义了简单的访问器,构造函数和比较运算符。
  • 不要扩展由Struct.new初始化的实例。扩展它会引入一个多余的类级别,如果多次需要该文件,也可能会引入奇怪的错误。
  • 考虑添加工厂方法,以提供其他合理的方法来创建特定类的实例。
  • 喜欢对继承进行鸭子打字。
  • 由于继承中的“讨厌”行为,避免使用类(@@)变量。
  • 根据方法的用途为方法(私有,受保护)分配适当的可见性级别。不要把一切都公之于众(这是默认的)。毕竟我们现在用Ruby编写,而不是用Python编写。
  • 缩小publicprotectedprivate方法,与它们适用的方法定义一样多。在可见性修饰符上方留一个空行,在下面留下一个空行,以强调它适用于它下面的所有方法。
  • 使用def self.method定义类方法。这使得代码更容易重构,因为类名不会重复。

这是红宝石最佳做法的最佳文档:https://github.com/bbatsov/ruby-style-guide