Модули в ruby ​​предназначены только для использования, когда несколько объектов требуют его функциональности? - PullRequest
2 голосов
/ 24 марта 2011

Я читал, что основной сервис, предоставляемый модулем, состоит в том, чтобы содержать и группировать похожие функции, которые необходимы нескольким объектам. Но стоит ли создавать модуль для чего-то вроде парсера, даже если вы уверены, что только один объект когда-либо будет нуждаться в его услугах?

Ответы [ 6 ]

3 голосов
/ 24 марта 2011

Модули служат двум целям.Во-первых, как вы заметили, необходимо разрешить добавление функциональных возможностей к разнообразному набору классов (различное значение вне дерева наследования).Второе, гораздо более распространенное использование - это организация пространства имен.Когда вы видите код, подобный ActiveRecord::Base или BSON::ObjectID, авторы этих драгоценных камней помещают свои функциональные возможности в модуль ActiveRecord и BSON соответственно, что предотвращает конфликт их имен классов с приложениями, в которые они включены или другимибиблиотеки.

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

2 голосов
/ 24 марта 2011

Это может помочь организации создать модуль, даже если вы используете его в одном месте. Например, у вас может быть много методов, которые все связаны, но на самом деле не связаны с кодом, в который включен модуль. Это похоже на организацию, которую предоставляет класс, за исключением того, что модуль не ориентирован на объект.

1 голос
/ 24 марта 2011

основной сервис, предоставляемый модулем, состоит в том, чтобы содержать и группировать аналогичные функции, которые необходимы нескольким объектам

Я бы перефразировал его, чтобы "группировать подобные функции, которые могут понадобится как минимум одному объекту ".Очень часто вы не знаете, сколько классов в итоге будет включать или расширять модуль (например, если вы пишете библиотеку)

Независимо от этого, я вижу еще две «основные цели»:

  • Это способ предоставления областей (вы можете упаковать несколько классов и других модулей в один модуль).
  • У них есть обратный вызов, называемый included.Это может показаться тривиальным, но этот обратный вызов является ключевым во многих интересных методах метапрограммирования.
0 голосов
/ 25 марта 2011

Когда я сталкиваюсь с чрезмерно большим классом, иногда я делю его на пару модулей в зависимости от его функциональности, и у меня есть практически пустой класс, включающий только эти модули.

0 голосов
/ 24 марта 2011

Но стоит ли создавать модуль для чего-то вроде парсера, даже если вы уверены, что только один объект когда-либо будет нуждаться в его услугах?

Да.

В Ruby модули очень помогают в разделении задач и очень хороши для "аспектно-ориентированного" программирования (т. Е. Для забавы с миксинами).

# Basic Hierarchy
class X
  def say ; 'X' end
end
class Y < X
  def say ; super + 'Y' end
end
y = Y.new
y.say #=> 'XY'

# Throwing in an aspects/mixins
module A
  def say ; super + 'A' end
end
class Y
  include A
end
y.say #=> 'XAY'

# Throwing in another aspects/mixins
module B
  def say ; super + 'B' end
end
class Y
  include B
end
y.say #=> 'XABY'
0 голосов
/ 24 марта 2011

Я бы пошел на урок (если у вас не слишком много кода).Поместите его в / lib

class Parse
  def self.xml(xml_string)
    ...
  end
end

Parse.xml("<xml></xml>")
  1. Вы можете вызвать его из любого места.
  2. http://en.wikipedia.org/wiki/Separation_of_concerns

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

class Xml
  acts_as_parser
end

class Json
  acts_as_parser
end

...

acts_as_parser загрузит группу функций из модуля.

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