猴子-修补Vs。S.O.I.L.D.原则?
-
08-07-2019 - |
题
我慢慢地移动,从PHP5向Python上的一些个人项目,和我是目前爱的经验。才选择去Python路线我看着红宝石。什么我没有通知红宝石社区是那只猴子-修补是这两种共同的高度重视。我也遇到了一个 很多 恐怖故事关于试验的调试红宝石s/w因为有人包括一个相对较无害的图书馆做一个小小的工作,但它修补一些大量使用的核心对象没有告诉任何人。
我选择了Python为(除其他原因)清洁的语法和事实上,它可以做一切红宝石可以。蟒蛇是使OO击比PHP曾经有,我是读书越来越多的OO原则来加强这更好的了解。
今天晚上我已经读 罗伯特*马丁的固体 原则:
- S简单的责任的原则,
- Open/关闭的原则,
- 我iskov替代的原则,
- 我nterface隔离的原则,
- Dependency反转原则
我目前正在起来 O: 软件的实体(课程、模块的功能,等)。 应该是开放的,用于扩展,但关于修改.
我的头在旋在冲突之间确保一致性OO设计和整个猴子修补的事情。我的理解是,它可能做到猴子-修补在蟒蛇。我还理解,正在"python"是按照共同点,以及进行测试,面向对象的最佳做法和原则。
我想知道是社会的意见,在相对的两个科目; 他们是如何相互操作,当它最好用一个比其他,无论是猴子-修补工作应在所有的...希望你能提供一个解决该问题对于我。
解决方案
之间是有区别的猴子-修补(重写或修改预先存在的方法)和简单的加的新方法。我认为后者是完全没有,并且前者应该被看,形迹可疑,但我仍然赞成保持它。
我遇到了相当多的这些问题在一个第三方扩展monkeypatches的核心图书馆和打破东西,他们真的不吸。不幸的是,他们全都看起来干从第三方扩展开发人员采取阻力最小的通道,而不是思考如何实际上建立自己的解决方案的正常。
这个很烂,但它没有更多的故障的猴子打补丁比这是错误的刀策者,人们有时会削减自己。
唯一的时候,我曾经看过合法需要的猴子修补的工作围绕错误的第三方或核心图书馆。对于这种孤独,这是无价的,我真的会很失望的如果他们除能力做到这一点。
时间表中的错误C#程序我们不得不:
- 读奇怪的错误报告和跟踪问题的一个小错误在CLR图书馆。
- 投资天来了一个变通办法涉及捕获异常在奇怪的地方和很多黑客妥协的代码很多
- 花天解救哈克解决方法时的Microsoft释放服务包
时间表中的错误一个轨程序我们不得不:
- 读奇怪的错误报告和跟踪问题的一个小错误在有红宝石的标准图书馆
- 花上15分钟执行小猴子程序,以消除错误的红宝石图书馆和地方警卫周围的旅行,如果它运行的版本错误的红宝石。
- 进行正常的编码。
- 简单地删除monkeypatch后,当下一个版本的红宝石被释放。
在之前的进程类似,除了与monkeypatching,这是一个15分钟的解决方案,和一个5-第二'的提取',而没有它,痛苦和苦难随之而来。
PS:以下的例子是"技术上"monkeypatching,但是它"道德"monkeypatching?我不会改变任何行为--这或多或少只是在做AOP在红宝石...
class SomeClass
alias original_dostuff dostuff
def dostuff
# extra stuff, eg logging, opening a transaction, etc
original_dostuff
end
end
其他提示
在我看来,monkeypatching是有用的,但有的东西,可能会被滥用。人们往往发现它,感觉就像它应该用于每一种情况,在那里也许是一个混合或其他建构可能更合适。
我不认为它的东西,你应该逃犯,这只是一些红宝石的家伙喜欢使用。你可以做类似的事情与Python但社会已经采取的立场,事情应该是更简单和更加显而易见的。
猴子修补是不是红宝石的明确,其完成所有javascript也有负面的(海事组织)的影响。
我个人认为猴子修补只应做到
a)功能添加到了旧版本的语言这是可以在新版本中的语言需要。
b)在没有其他的"逻辑"的地方。
有许多许多简单的方法来做猴子修补真的很可怕,如有能力改变基本功能,例如 除了 的工作。
我的立场是,如果可以避免它,这样做。
如果你可以避免在一个不错的方式,荣誉。
如果你不能避免它,得到的意见,200人因为你可能只有没有想过这个硬够的。
我讨厌宠物 是脱延伸 功能 对象。是的,你可以做到这一点。而人们只是学习如何javascript:
setTimeout(function(){
foo(args);
}, 5000 );
加入一个新的方法,以每一功能目的,(是的,我不是开玩笑的)因此,现在有自己的职能。
foo.delay( 5000 , args );
其中有的额外效果的这种废话正在有效:
foo.delay.delay( 500, [ 500, args ] );
和这样循环往复。
结果呢?你不再拥有一个图书馆和语言,你的语言的蝴蝶结的图书馆如果在图书馆发生的范围,你没有语言,你不能只是做事情的方式,他们做的时候你学习语言,而是必须要学会一个 新的 子的命令只是要没有它倒下面(在成本的速度过慢!)
可我注意到,foo。延迟也返回了一个目的,用其自己的方法,所以你能做的
x = foo.delay( 500, args );
x.clear();
甚至
x.clear.delay(10);
这可能听起来过分有用,...但你必须考虑大规模的开销用于可行的。
clearTimeout(x);
这么辛苦!
(免责声明:它已经有一段时间,因为我使用武,必须试着忘记它,和功能的姓名/结构可能是不正确的。这不是一个API reference。请查看他们网站的详细信息(对不起,他们的API reference糟透了!))
Mokeypatching通常是错误的。创建一个适当的小类,并添加的方法。
我用monkeypatching一旦在生产码。
问题是,其余的使用GET,POST,把和删除。但Django测试的客户仅提供获得和职位。我monkeypatched方法为投入(如员额)以及删除(如得到)。
因为紧密的结合之间的Django客户和Django的试验驾驶员,这似乎是最简单的到monkeypatch它支持全休息试验。
你可以找到富有启发性 这次讨论 关于红宝石的开放式课程和开放关闭的原则。
虽然我喜欢红宝石,我感到猴子-修补是一个工具的最后手段来把事情做好。所有的事情都是平等的,我更喜欢使用传统的OO技术与撒功能编程的善良。
在我眼里,猴子-修补是一种形式的AOP。该文章 面向方面的设计原则:经验教训对象为导向的设计 (PDF)给出了一些想法如何固体和其他面向对象的原则可以适用于AOP。
我首先想到的是那只猴子-修补违反了路电,由于客户的种类应该能够期待这类工作保持一致。
猴子-修补的只是普通的 错误的, ,恕我直言。我没有碰到过的开/闭的原则提前,但它是一个原则我早就举行了我自己,我同意它100%。我认为猴子-修补码-气味上一较大的规模,一个编码-哲学-气味,因为它是。