是否需要只需要文件和 modules.rb 文件?

Is there a need for require-only files and modules.rb files?

我被指派对现有的 Ruby gem 项目进行一些维护。我不是 Ruby 本地人,但有些文件对我来说似乎是不必要的。

假设文件夹 a/b/c 是项目的根目录,代表模块 A::B::C。还有子模块A::B::C::D1A::B::C::D2A::B::C::D3

我发现第一个不合逻辑的文件是文件夹 a/b/c 中的文件 modules.rb。这包含整个项目中每个模块的空模块声明:

module A::B::C
end

module A::B::C::D1
end

module A::B::C::D2
end

# etc

我试图找出这个文件的用途,但除了 modules.rb 实际上包含所有代码的示例(例如 https://github.com/shrinidhi99/learn-ruby-for-fun/blob/master/Modules.rb, https://borg.garasilabs.org/andrew/ruby-training/-/blob/master/codes/modules.rb, https://zetcode.com/lang/rubytutorial/oop2/).在项目本身的任何地方也没有引用它。它似乎唯一能实现的是提供关于 rubydoc.info 的文档。这可能会内联在单独的文件中。


除此之外,大多数模块 Mm 文件夹旁边都有一个匹配文件 m.rb。例如,文件 a/b/c.rba/b/c/d1.rb 等。该文件只包含匹配模块中所有文件的 require 语句。这意味着文件 a/b/c.rb 也有 require 语句用于 a/b/c/d1

有两个A::B::C的子模块没有包含在这些require文件中,这些模块有自己的几个子模块。那,再加上每个文件应该只提及它的需求本身,表明这些需求文件是完全不必要的。我能想到的唯一原因在这里提到:


我认为我可以简单地删除这些文件是错误的,还是它们仍然是必要的?或者这只是“Ruby 方式”?

像这样的东西应该有用。一个文件——一个 class(或模块)。如果你有命名空间并且其中有通用逻辑——命名空间的单独文件

# a.rb
Dir[File.join(__dir__, 'a', '*.rb')].each { |f| require f }

module A
  # general A logic here
end
# a/b.rb
Dir[File.join(__dir__, 'b', '*.rb')].each { |f| require f }

module A
  module B
    # general A::B logic here
  end
end
# a/b/c.rb
module A
  module B
    module C
    end
  end
end
# a/b/d.rb
module A
  module B
    module D
    end
  end
end
# x.rb
require_relative 'a'

class X
  include A::B::C
end