【发布时间】:2010-09-24 06:16:45
【问题描述】:
背景:
我有一个声明了许多实例方法的模块
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
我想从一个类中调用其中一些方法。在 ruby 中你通常是这样做的:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
问题
include UsefulThings 引入了来自UsefulThings 的所有方法。在这种情况下,我只想要 format_text 而明确不想要 get_file 和 delete_file。
我可以看到几种可能的解决方案:
- 以某种方式直接在模块上调用该方法,而不在任何地方包含它
- 我不知道如何/是否可以做到这一点。 (因此这个问题)
- 不知何故包括
Usefulthings,只引入它的一些方法- 我也不知道如何/是否可以这样做
- 创建一个代理类,在其中包含
UsefulThings,然后将format_text委托给该代理实例- 这会起作用,但匿名代理类是一个黑客。糟糕。
- 将模块拆分为 2 个或更多更小的模块
- 这也可行,并且可能是我能想到的最佳解决方案,但我宁愿避免使用它,因为我最终会得到几十个模块的扩散 - 管理这将是繁重的李>
为什么一个模块中有很多不相关的功能?这是来自 rails 应用程序的ApplicationHelper,我们的团队实际上已决定将其作为任何不具体到不属于其他任何地方的东西的垃圾场。主要是随处使用的独立实用程序方法。我可以把它分解成单独的助手,但是会有 30 个,每个都有 1 个方法......这似乎没有效率
【问题讨论】:
-
如果您采用第 4 种方法(拆分模块),您可以通过使用
Module#includedcallback 触发另一个模块的include,使一个模块始终自动包含另一个模块。format_text方法可以移动到它自己的模块中,因为它本身似乎很有用。这将减轻管理的负担。 -
我对模块函数答案中的所有引用感到困惑。假设您有
module UT; def add1; self+1; end; def add2; self+2; end; end,并且您想在Fixnum类中使用add1但不是add2。拥有模块功能有什么帮助?我错过了什么吗?