Рубинисты ссылаются на аксессоры от mixins? - PullRequest
4 голосов
/ 08 февраля 2011

Считается ли плохой практикой ссылать методы доступа на расширенный объект из метода mixin? Упрощенный пример:

module WindInstrument
  def play
    mouthpiece.blow  #requires a mouthpiece
  end
end

class Saxophone
  attr_reader :mouthpiece

  def initialize
    @mouthpiece = Mouthpiece.new
  end

  include WindInstrument
end

Saxophone.new.play

В этом случае я бы просто перенес требование о мундштуке непосредственно в модуль WindInstrument, но как насчет более сложного сценария, где действительно имеет смысл жить аксессором на расширенном объекте? Это просто проблема неуместного разделения интересов?

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

  • Поместите состояние в класс и добавьте его через композицию, а не через иерархию наследования. Моя проблема с этим заключается в том, что я знаю rubyists там есть создавая миксины, которые обращаются к состоянию, что делает более читабельным, но менее интуитивным (для меня) дизайном.

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

Этот код беспокоит кого-то еще? Я знаю, что есть много умных людей, использующих рубин, поэтому я полагаю, что проблема моя. Что мне не хватает? Мне просто нужно расслабиться? Что бы вы сделали?

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

Я думаю, что это то же самое, что и в патчах обезьян: это нормально, но сначала нужно убедиться, что нет альтернатив (т. Е. Вы не можете изменять классы с помощью интерфейса), а во-вторых, выдолжен быть очень четким об этом (убедитесь, что в документах, комментариях и интерфейсе указано, что этот наш метод необходим и будет вызван) и выдать полезное сообщение об ошибке, если это не

0 голосов
/ 09 февраля 2011

Средства доступа Ruby являются интерфейсами, а не реализацией.

Например, если вы вызываете person.height_in_feet=, вы не знаете, в каких единицах высоты фактически реализована переменная экземпляра.Это могут быть метры, футы или локти.

Одним из реальных примеров использования миксинов с помощью аксессора является модуль Enumerable.Хотя я не включаю этот модуль ни в какие классы, которые создаю, я доволен тем, что он делает.Он предоставляет вам удобные методы, такие как map и each_with_index, оставаясь при этом DRY - есть только одна реализация того, какие объекты вы бы использовали со всеми методами «mixee», и есть только одно определение того, что mapделает для любого объекта, который использует Enumerable.

...