alias_method_chain

2019-11-05  本文已影响0人  will2yang

这个方法已经没有了,在看rails5.1+的源码里,但是还是记录一下这些方法演变的过程。

alias_method_chain产生的原因

因为给原方法增加新功能的想法在Rails中十分普遍。
传入 target(需要被包装的方法), feature(希望添加的特性名)。就会定义target_without_feature和target_with_feature的方法,且保持原方法相同的可见性。

回顾validations模块

在早期的ActiveRecord::Validations里: save和save!就被这样的方式包装上了validation的特性。

alias_method_chain方法的衰亡

像这样的方式,通常会污染你的类,可能会破坏以后的代码。更糟糕的是你难以追踪真正调用方法的是哪个版本。

通过重写加super的方式能更为干净的达到效果,虽然并没有很酷炫。

Module#prepend

通过prepend的方式,修改祖先链的顺序,在prepend的模块里可以复写super来修改增加功能。在需要处理一些想要修改却不太好修改的库时,这将会变得很方便,比如Rails中的一个类库。

上一篇 下一篇

猜你喜欢

热点阅读