什么是将大型课程分解为模块的好红宝石成语?

Ben*_*ini 3 ruby refactoring module

我有一个很大的类,有很多方法,它开始变得有点无组织,难以导航.我想将其分解为模块,其中每个模块都是类和实例方法的集合.也许是这样的:

更新:我现在意识到这是一个非常糟糕的例子.您可能不希望将验证或属性移出核心类.

class Large
  include Validations
  include Attributes
  include BusinessLogic
  include Callbacks
end
Run Code Online (Sandbox Code Playgroud)

在阅读了Yehuda关于Better Ruby Idioms的文章之后,我很好奇其他人如何解决这个问题.这是我能想到的两种方法.

第一种方法

module Foo
  module Validations
    module ClassMethods
      def bar
        "bar"
      end
    end

    module InstanceMethods
      def baz
        "baz"
      end
    end
  end

  class Large
    extend Validations::ClassMethods
    include Validations::InstanceMethods
  end
end
Run Code Online (Sandbox Code Playgroud)

第二种方法

module Foo
  module Validations
    def self.included(base)
      base.extend ClassMethods
    end

    module ClassMethods
      def bar
        "bar"
      end
    end

    def baz
      "baz"
    end
  end

  class Base
    include Validations
  end
end
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 有一个更好的方法吗?
  • 如何以最少的魔法为一组类/实例方法获得单行模块mixin?
  • 如何在没有命名空间类本身的情况下将这些模块命名为基类?
  • 你如何组织这些文件?

Avd*_*vdi 10

将类分解为模块,同时诱惑(因为在Ruby中很容易),很少是正确的答案.我通常认为应该突破模块的诱惑,因为代码告诉我它希望被分成更紧密集中的类.如果你想将它分成多个文件那么大的类几乎可以保证违反单一责任原则.

编辑:详细说明为什么将代码分解为模块是一个坏主意:它让读者/维护者感到困惑.一个类应该代表一个紧密聚焦的概念.当你必须滚动数百行来查找在长类文件另一端使用的实例方法的定义时,这已经够糟糕了.当你遇到一个实例方法调用并且必须在另一个文件中寻找它时,情况会更糟.