要通过 mixins 或普通定义将 Ruby class 分解成单独的文件?
To break up Ruby class into separate files by mixins or plain definitions?
将 class 分成多个文件的首选方法是什么? Mixins 可以工作,但在我的例子中,我只想更好地组织一个非常大的 class。在下面介绍的两种方法中,一种比另一种 "better" 好吗?
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
您的支持方法是否足够通用以至于它们可能对其他完全不相关的 classes 有用?如果是这样,mixin 是执行此操作的正确方法,因为它可以让您轻松地重用支持代码。
但是,如果您的支持方法非常特定于 ReallyBigClass,并且如果包含在其他地方不太可能起作用,那么重新打开 class 是可行的方法。使用 mixin 可能会使这些方法看起来比实际更通用,而实际上它们应该只与特定 class.
的实例一起使用
话虽如此,我认为您的问题表明存在更大的设计问题。如果你是前一种情况(通用方法),你应该首先设计更通用的模块以避免紧耦合。名为 ReallyBigClassFileB
的模块散发出强烈的代码气味。在后一种情况下(非常具体的方法),如果你的 class 太大以至于它的文件大得无法管理,你可能需要重构一些东西。也许您的 class 负责太多?也许它可以使用一些子classes(这在单独的文件中有意义)?
将 class 分成多个文件的首选方法是什么? Mixins 可以工作,但在我的例子中,我只想更好地组织一个非常大的 class。在下面介绍的两种方法中,一种比另一种 "better" 好吗?
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
您的支持方法是否足够通用以至于它们可能对其他完全不相关的 classes 有用?如果是这样,mixin 是执行此操作的正确方法,因为它可以让您轻松地重用支持代码。
但是,如果您的支持方法非常特定于 ReallyBigClass,并且如果包含在其他地方不太可能起作用,那么重新打开 class 是可行的方法。使用 mixin 可能会使这些方法看起来比实际更通用,而实际上它们应该只与特定 class.
的实例一起使用话虽如此,我认为您的问题表明存在更大的设计问题。如果你是前一种情况(通用方法),你应该首先设计更通用的模块以避免紧耦合。名为 ReallyBigClassFileB
的模块散发出强烈的代码气味。在后一种情况下(非常具体的方法),如果你的 class 太大以至于它的文件大得无法管理,你可能需要重构一些东西。也许您的 class 负责太多?也许它可以使用一些子classes(这在单独的文件中有意义)?