`
lllyq
  • 浏览: 34138 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

ruby mixin的硬伤

    博客分类:
  • ruby
阅读更多
今天执行一个页面的的时候发现日志输出了50行的"==> Got Users::User from cache. (0.00000)",觉得很奇怪,没有请求这么多次user啊,分析到后面发现原来是gettext跟cache_fu着两个插件的冲突引起的

他们的方法都是mixin到model中调用,都有一个cache?的方法,gettext的是判断是否cache i18n message,cache_fu的是判断是否cache model,结果gettext的cache?被cache_fu的cache?覆盖了,gettext内部调用了多次cache?就出现了上述的症状,虽然执行结果正常,但背后的行为跟期望的已经是大相径庭了,而且这样的情况还无法通过test来检查,这里要不是默认打开cache_fu的benchmark,根本就不知道问题所在

这样用mixin的时候都要小心了,不知道还有多少隐患,估计ruby以后应该会有相应的解决方案,例如在mixin的时候检查同名方法并产生警告
也给一个写module的建议,只暴露必要的方法,内部的调用还是用一个专有namespace分开
分享到:
评论
5 楼 rubynroll 2008-04-30  
标题强悍点还是有好处的,至少吸引眼球嘛,只要内容是铿锵有力的就行~

我同意楼主的意见,mixin确实有潜在的危险,一旦有冲突,mixin顺序改变了就会影响结果,危险....给出警告是非常有必要的,目前加-w参数没有给出此警告.
4 楼 lllyq 2008-04-29  
Jan 写道
re楼上的,这个和mixin无关

http://avdi.org/devblog/2008/02/23/why-monkeypatching-is-destroying-ruby/

rails的plugins并不是银弹,有些实现的其实很糟糕,一定要慎用


怎么会没关系,其实就是多继承后同名方法的处理策略问题,ruby现在相当于基于顺序的处理
3 楼 Jan 2008-04-29  
re楼上的,这个和mixin无关

http://avdi.org/devblog/2008/02/23/why-monkeypatching-is-destroying-ruby/

rails的plugins并不是银弹,有些实现的其实很糟糕,一定要慎用
2 楼 lgn21st 2008-04-29  
标题很强悍...
不过说用很多插件的确带来这样的问题...还有很多插件随意打开Object的metaclass作一些有欠考虑的事情...
不过这个不能怪ruby,mixin其实是好孩子,插件是解决快速开发和reuse问题的不错方法,如果碰到问题首选从方法角度上解决,比如提交patch,而不是思考工具好还是不好
1 楼 Readonly 2008-04-29  
maxin? mixin?

相关推荐

Global site tag (gtag.js) - Google Analytics