4

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

实现这一点的一种可能方法是String使用额外的方法修补类,而不修改任何现有的方法,并添加类似"some string".word_count和的行为"some string".cjk?

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

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

所以,问题是:

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

请提出任何替代方案。

4

2 回答 2

4

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

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

YourClass.new.refinedMethodFromCoreClass #=> some result

CoreClass.refinedMethodFromCoreClass

产生undefined method异常。

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

于 2013-04-30T19:06:44.890 回答
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
于 2013-04-30T19:03:53.140 回答