Ruby:如何从两个模块类方法重构代码?

时间:2014-01-17 07:17:16

标签: ruby class inheritance module singleton-methods

以下是代码:

module A
  class C1
    def self.grovel(x)
      return A::helper(x) + 3
    end
  end

  class C2
    def self.grovel(x)
      return A::helper(x) + 12
    end
  end
  private
  def helper(y)
    y + 7
  end
  module_function :helper
end

f = A::C1.grovel(7)
puts f
puts A::C2.grovel(25)

我正在处理遗留代码,试图避免改变太多。我不确定 我会使用相同的方法创建两个单独的类,仅作为每个类 包含一个方法,使用通用代码。我想将常用代码提取出来 只有A中的方法可以看到但仍需要调用它的方法 它的完全限定名称(“A :: helper”)。

有更好的方法吗?理想情况下,我想包装常见的 一个方法中的代码(让它仍然称之为“帮助”),可以从中调用 在类grovel方法中没有任何限定,但不容易 可用于模块A之外的代码。

感谢。

2 个答案:

答案 0 :(得分:1)

如何创建另一个模块?

module A
  module Helper
    def helper(y)
      y + 7
    end
  end  

  class C1
    class << self
      include A::Helper    

      def grovel(x)
        return helper(x) + 3
      end
    end
  end

  class C2
    class << self
      include A::Helper    

      def grovel(x)
        return helper(x) + 12
      end
    end
  end


end

puts A::C1.grovel(7)
puts A::C2.grovel(25)

您创建A的子模块,并将其作为Mixin包含在您的类中。这样只有这些类才能访问该方法。

您可以在http://rubyfiddle.com/riddles/31313

中看到它正常工作

答案 1 :(得分:0)

Minixs非常有用,例如,当无法应用正确的继承时,类必须继承其他两个类的属性,因此您可以在此处使用继承机制:

module A
  class C
    def self.helper(y)
      y + 7
    end
  end

  class C1 < C
    def self.grovel(x)
      return self.helper(x) + 3
    end
  end

  class C2 < C
    def self.grovel(x)
      return self.helper(x) + 12
    end
  end
end

puts A::C1.grovel(7)
puts A::C2.grovel(25)