首先,这是否违反了封装的OO原则?
是的。
其次,作为一名程序员,有没有办法可以在我的代码中保证我使用的是未修改版本的类?
还没有。 Ruby 2.0 中的 Classboxes(希望)将成为解决方案。
第三,我是否应该在我的代码中“打开”类,出于任何原因?
仅作为最后的手段。
你应该永远对你自己的类进行猴子补丁。根本没有意义。你控制他们,你可以让他们做你想做的事。
您永远不应该在库中对类进行猴子补丁。 (此规则的例外是那些唯一目的是对某些东西进行猴子补丁的库,例如 Marc-André Lafortune 的 backports 库,它对 Ruby 1.8.6、1.8.7、1.9 进行了猴子补丁.0 和 1.9.1 尽可能多地具有 Ruby 1.9.2 的功能。)您可以提供一个附加库,该库提供猴子补丁,使您的库更易于使用(例如,您有一个提供Kryptonite.encrypt(str) 方法的加密库,并且您提供了一个附加组件String#encrypt 方法),但该附加组件应该在一个单独的库中,用户需要明确require。它应该是完全可选的。
您不应该对核心类进行猴子补丁。这指的是像 Ruby 中的 Array 或 Symbol 这样的类,但是对于 Rails 库,我还会在“核心”标签下包含像 ActiveRecord::Base 这样的类。 (与上述相同的警告。例如,在 3.0 之前的 Rails 版本中,没有明确定义的插件 API,monkey-patching 是扩展 Rails 的唯一方法。没有违反此规则的人,将从来没有任何插件,Rails 也不会是现在的样子。)
先尝试继承。首先尝试组合(包装器、代理、外观、适配器……)。先尝试重构。首先尝试辅助对象。 只有如果这不起作用,请转向猴子补丁。
在进行猴子补丁时要尊重:如果要添加新方法,请确保它不存在,如果存在则处理它(例如,从您的方法中调用它)。如果您要包装现有方法,请确保如果其他人已经包装了它,他们的包装器会被调用,并且当有人想在之后包装它时,您的包装器允许这样做。 (特别是,这意味着您必须保留该方法的现有合同。)
如果可能的话,把你的猴子补丁放在一个 mixin 中。这样,它们就会出现在继承链中,这将使任何尝试调试代码的人都有机会弄清楚发生了什么。将你的猴子补丁放在单独的、明显命名的文件中。
最后,在大规模的生产编码环境中如何处理这类事情?换句话说,编程行业的人真的会在其他人会使用的代码中这样做吗?或者即使他们不这样做,你如何确保某处的某个插件作者没有做这样的事情会破坏你程序的重要部分?
不要和你所说的“非常糟糕的程序员”一起工作。
这听起来很简单,但基本上就是这样。是的,当然,您可以编写测试、进行代码审查、练习结对编程、使用静态分析工具、在启用警告的情况下运行代码(例如,您在问题中发布的代码将生成 warning: method redefined; discarding old ==)。但对我来说,这都是一个不是很差的程序员会做的事情。