论坛首页 编程语言技术论坛

ruby mixin的硬伤

浏览 3043 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-29  
今天执行一个页面的的时候发现日志输出了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分开
   发表时间:2008-04-29  
maxin? mixin?
0 请登录后投票
   发表时间:2008-04-29  
标题很强悍...
不过说用很多插件的确带来这样的问题...还有很多插件随意打开Object的metaclass作一些有欠考虑的事情...
不过这个不能怪ruby,mixin其实是好孩子,插件是解决快速开发和reuse问题的不错方法,如果碰到问题首选从方法角度上解决,比如提交patch,而不是思考工具好还是不好
0 请登录后投票
   发表时间:2008-04-29  
re楼上的,这个和mixin无关

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

rails的plugins并不是银弹,有些实现的其实很糟糕,一定要慎用
0 请登录后投票
   发表时间:2008-04-29  
Jan 写道
re楼上的,这个和mixin无关

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

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


怎么会没关系,其实就是多继承后同名方法的处理策略问题,ruby现在相当于基于顺序的处理
0 请登录后投票
   发表时间:2008-04-30  
标题强悍点还是有好处的,至少吸引眼球嘛,只要内容是铿锵有力的就行~

我同意楼主的意见,mixin确实有潜在的危险,一旦有冲突,mixin顺序改变了就会影响结果,危险....给出警告是非常有必要的,目前加-w参数没有给出此警告.
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics