Разбить класс 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
испускает сильный запах кода В последнем случае (очень специфические методы), если ваш класс настолько велик, что его файл неуправляемо большой, вам, вероятно, нужно что-то реорганизовать. Может быть, ваш класс несет ответственность за слишком много? Может быть, он может использовать некоторые подклассы (которые имеют смысл в отдельных файлах)?