Какое наилучшее / наиболее используемое соглашение о кодировании синглтона в Ruby? - PullRequest
3 голосов
/ 13 января 2011

В стандартной библиотеке 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 ]

4 голосов
/ 13 января 2011

ПРЕДУПРЕЖДЕНИЕ : Мнения впереди!


Если вам нужен только один объект, просто используйте один объект:

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

Foo.do_something!

Модули для обмена поведением между объектами. Классы - это фабрики для объектов. Обратите внимание на множественное число: если у вас есть только один объект, вам не нужны ни средство для совместного использования поведения, ни фабрика для производства нескольких копий.

То, считается ли это идиоматическим, Ruby во многом зависит от того, о каком "Ruby" вы говорите: вы говорите о Ruby, используемом программистами Rails, Ruby, используемом программистами Smalltalk, Ruby, используемом программистами Java, или Ruby используется программистами Ruby? Существуют значительные различия в стилях, используемых этими различными сообществами.

Например, старые Рубиисты, такие как Дэвид Алан Блэк, обычно начинают всегда только с объектов и одноэлементных методов. Только если они позже обнаружат дублированное поведение между объектами, они извлекут это поведение в миксин и extend объекты с ним. (Обратите внимание, что на данном этапе еще нет классов!)

Классы создаются, опять же, только путем рефакторинга, а не с помощью предварительного проектирования, когда и только , когда между объектами имеется дублированная структура.

0 голосов
/ 13 января 2011

Самый распространенный подход, который я видел, это ни синглтон, ни класс, который вы никогда не создаете. Наиболее распространенный и идиоматический способ сделать это - модуль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...