哪个是Ruby中最好/最常用的单例编码约定?

时间:2011-01-12 23:54:58

标签: ruby singleton coding-style

在Ruby标准库中,我们有Singleton类:
http://ruby-doc.org/stdlib/libdoc/singleton/rdoc/index.html

我们可以通过在内部包含这个类来使任何类成为单例。我很少看到这个用过。什么时候使用这个Singleton类而不仅仅使用普通的旧类方法 - 也称为单例方法?

以另一种方式说:哪种Singleton编码约定是最好的,为什么?以下是我能想到的三种方式:

require 'singleton'
class Foo
  include Singleton
  # method definitions go here...
end

Foo.instance.do_something!

对战

class Foo
  class << self
    # method definitions go here...
  end
end

Foo.do_something!

对战

module Foo
  class << self
    # method definitions go here...
  end
end

Foo.do_something!

2 个答案:

答案 0 :(得分:4)

警告:提前意见!


如果您只需要一个对象,只需使用一个对象:

class << (Foo = Object.new)
  # method definitions go here...
end

Foo.do_something!

模块用于在对象之间共享行为。类是对象的工厂。请注意复数:如果您只有一个对象,则既不需要共享行为的工具也不需要工厂来生成多个副本。

这是否被认为是惯用的Ruby在很大程度上取决于你所谈论的“Ruby”:你是在谈论Rails程序员使用的Ruby,Smalltalk程序员使用的Ruby,Java程序员使用的Ruby还是Ruby编写的Ruby Ruby程序员使用?这些不同社区使用的风格存在显着差异。

例如,旧时代像David Alan Black这样的Rubyist倾向于使用对象和单例方法开始始终。只有当他们稍后发现对象之间的重复行为时,他们才会将该行为提取到mixin中并将extend对象提取出来。 (注意,在这个阶段,仍然没有任何类!)

同样,只有通过重构而不是通过前期设计创建类,当和对象之间存在重复结构时 时才会创建类。

答案 1 :(得分:0)

我见过的最常见的方法既不是单身也不是你永远不会实例化的类。最常见和惯用的方法是模块。