猴子修补基础红宝石课是一种不好的做法?

时间:2013-04-30 18:27:59

标签: ruby monkeypatching

我正在开发一个ruby项目,我们计划在其中使用ruby字符串进行一些操作。有些操作很简单(比如计算单词数),其他操作比较复杂(比如检查给定字符串是否使用正确的语言)。

实现此目标的一种可行方法是使用额外方法修补String类,修改任何现有方法,并添加"some string".word_count和{{1}等行为}。

另一种基于"some string".cjk?的方法是创建一个充满方法的类或模块,并始终使用字符串作为参数,如FileUtilsOddClassName.word_count("some string")。由于可读性,我们更喜欢第一个。

我理解猴子修补基本类,如第一个替代方案中所描述的可以有名称冲突。但是,如果这是主应用程序,而不是库,我应该担心它吗?

所以,问题是:

  • 将方法添加到ruby基类是一种不好的做法吗?如果是,那是在所有情况下还是仅在某些情况下?
  • 实现这一目标的最佳方法是什么?
  • 'OddClassName'的名称是什么?

请建议任何替代方案。

2 个答案:

答案 0 :(得分:4)

除非你编写没有PatchedClass相关行为的奇怪方法(例如,String.monkeyPatchForMakingJpegFromString相当糟糕,但是Jpeg.fromString足够好),猴子补丁不被认为是一种不好的做法。)

但是如果你的项目相当大,你在其中使用的库可能碰巧有碰撞的补丁,所以你可能还有一个问题就是所有这些补丁。在Ruby 2.0中,改进得到了帮助。它们的工作方式如下:在其中定义modulerefine您的(甚至核心)类,然后在必要时使用该模块。因此,在您的代码中,它的工作原理如下:

YourClass.new.refinedMethodFromCoreClass #=> some result

但是

CoreClass.refinedMethodFromCoreClass

产生undefined method例外。

这就是所有猴子修补内容:猴子修补很有用且方便,但改进添加了一些功能,使您的代码更安全,可维护和整洁。

答案 1 :(得分:1)

我会使用一个新类,称之为Doc或其他东西,因为获取单词计数和检查语言听起来就像是文档的操作。

让它将字符串作为构造函数参数并使用修改链来返回新的Doc。还给它一个返回字符串的to_s方法。

class Doc
  def initialize(str)
    @str = str
  end

  def to_s
    @str
  end

  define word_count, cjk?, etc.
end

Doc.new("Some document").word_count
# => 2