fot*_*nus 5 ruby monkeypatching
我正在开发一个 ruby 项目,我们计划使用 ruby 字符串进行一些操作。有些操作很简单(例如计算单词数),而其他操作则更复杂(例如检查给定字符串是否采用正确的语言)。
实现此目的的一种可能方法是使用String
额外的方法修补类,而不修改任何现有方法"some string".word_count
,并添加和 等行为"some string".cjk?
。
另一种方法FileUtils
是创建一个充满方法的类或模块,并始终使用字符串作为参数,例如OddClassName.word_count("some string")
和OddClassName.cjk?("some string")
。由于可读性,我们更喜欢第一个。
我知道猴子修补第一个替代方案中描述的基本类可能会发生名称冲突。但是,如果这是主应用程序,而不是库,我应该担心它吗?
所以,问题是:
请提出任何替代方案。
猴子修补并不被认为是一种不好的做法,除非您正在编写没有 PatchedClass 相关行为的奇怪方法(例如,String.monkeyPatchForMakingJpegFromString
相当糟糕,但Jpeg.fromString
已经足够好了。)
但是,如果您的项目相当大,您在其中使用的库可能会碰巧有冲突的补丁,因此您可能会遇到所有这些补丁内容的又一个问题。在 Ruby 2.0 中,改进起到了帮助作用。它们的工作方式如下:您在其中定义一个module
(refine
甚至是核心)类,然后在需要时使用该模块。因此,在您的代码中它的工作原理如下:
YourClass.new.refinedMethodFromCoreClass #=> some result
Run Code Online (Sandbox Code Playgroud)
但
CoreClass.refinedMethodFromCoreClass
Run Code Online (Sandbox Code Playgroud)
产生undefined method
异常。
这就是猴子修补的全部内容:猴子修补非常有用且方便,但改进添加了一些功能,使您的代码更加安全、可维护和整洁。