Использование mixins против прямого вызова метода - PullRequest
3 голосов
/ 18 марта 2011

Я хотел бы знать, когда лучше всего использовать миксин против прямого вызова метода.

Например, рассмотрим HTTParty. На одном из его примеров https://github.com/jnunemaker/httparty/blob/master/examples/basic.rb

Вы можете использовать HTTParty.get ('http://twitter.com/statuses/public_timeline.json') или создать класс, включающий HTTParty, а затем использовать его так же, как при вызове самого HTTParty.

Какая разница со мной, просто создавая что-то вроде этого:

class Partay
  @base_uri = 'http://localhost:3000'
  def self.post(endpoint, options)
    HTTParty.post(@base_uri + endpoint, options)
  end
end

против приведенного примера:

class Partay
  include HTTParty
  base_uri 'http://localhost:3000'
end

Правда, в таком тривиальном примере, возможно, использование include позволит сохранить больше символов, но я думаю, что в гораздо более сложном классе это не имеет большого значения.

Несколько уточняющих вопросов: Будет ли это связано с аргументом «состав против комбинации»? Есть ли какой-либо лучший дизайн или архитектура в этом отношении? Должен ли я рассматривать миксины как своего рода наследование и использовать их как таковые (наследование, если оно представляет собой отношение, состав, если это отношение имеет отношение и т. Д.)? Стоит ли смешивать модуль только в том случае, если он предназначен для этого (поскольку в документах говорится, что он ожидает от вас определенных методов, например, Enumerable), или это просто хорошая практика? Означает ли использование mixin более тесную связь между модулем и моим классом (и относительно ли это хорошо или вообще плохо)?

1 Ответ

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

В данном примере нет большой разницы, за исключением того, что синтаксис гораздо более дружественен к миксину и потенциально может стать DSL, который вы можете использовать позже.

В целом, миксины позволяют вамиспользовать одни и те же функции в разных классах, не повторяя себя и не расширяя другой класс (например, миксины - это способ обойти тот факт, что ruby ​​не допускает множественное наследование).Это способствует повторному использованию и идет в ногу с философией DRY, дорогой для пользователей ruby.Так как ruby ​​типизирован по типу утки, mixins позволяет вам в полной мере использовать полиморфизм без наследования.

Еще одно большое преимущество mixins заключается в том, что их можно добавлять в runtime , так чтодобавить поведение к классу "динамически".

Обновление: я лично предпочитаю использовать модули в качестве миксинов, а не вызывать методы для него, поскольку методы затем становятся частью вашего класса, что означает, что они могут получить доступ к другим членамкласса.Однако я неохотно называю это отношениями is-a , хотя на практике это так.Как говорит «Обоснованный Рубиист», классы моделируют объекты или вещи (имена классов, как правило, являются существительными), модули инкапсулируют свойства или характеристики (имена модулей, как правило, являются прилагательными).

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