Разбить класс Ruby на отдельные файлы по миксинам или простым определениям?

Каков предпочтительный способ разбиения класса на несколько файлов? Mixins может работать, но в моем случае я просто хочу лучше организовать очень большой класс. Из двух методов, описанных ниже, один из них "лучше", чем другой?

file_A.rb

require 'file_B_class'
require 'file_B_mixin'

class ReallyBigClass
  include ReallyBigClassFileB

   def primary_method
    puts "I'm the primary method"
  end
end

file_B_class.rb

class ReallyBigClass

  def support_method_as_class
    puts "I'm included in the main class by appending code"
  end

end

file_B_mixin.rb

 module ReallyBigClassFileB

  def support_method_as_mixin
    puts "I'm included in the main class by mixin"
  end
end

1 ответ

Решение

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

Однако, если ваши методы поддержки очень специфичны для ReallyBigClass и вряд ли будут работать, если они включены где-то еще, переоткрытие класса - это путь. Использование там миксина может создать впечатление, что методы являются более общими, чем они есть на самом деле, тогда как на самом деле их следует использовать только с экземплярами определенного класса.

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

Другие вопросы по тегам