大家都懂元编程吧,这里就不解释了。之前面试过好几个 Rails 开发,多数都会提起自己学习元编程 (like reading <>)。似乎大家都很看重自己元编程的能力,至少看起来是这样。 那么,问题来了: 在我们的日常开发中,什么样的情况下才该用元编程呢?是不是应该用元编程秒杀一切重复代码?还是说元编程只是作为大家装逼专用?
我觉得《Ruby 元编程》最后一章就写的很好了:元编程不过是编程。
在 Ruby 中,元编程和普通编程的界限会变得越来越模糊。等你对这门语言有了深刻认识后,你会发现界定一种技巧或用法是元编程还是普通编程是非常困难的。
实际上,元编程已经渗入 Ruby 的血液之中,你很难写出一段符合规范的 Ruby 代码,却完全不使用元编程的法术。这门语音实际上鼓励你操纵语言的构件,扩展对象模型,重新打开类,动态定义方法,以及用块来管理作用域。还是那句话:“根本就没有元编程,从来就只有编程。”
#1 楼 @mizuhashi 这个只是增加了一定的难度去找到这个方法在哪儿产生的,不管是动态定义或者不是,一个方法总有一个 caller,一个 receiver,所以其实还是可以较好定位的。
@easonlovewan 我其实就是抛出了这个问题,并不能表现出我是否极端。但是在我的工作经验中,确实遇到一些看似极端的现象,就是大家其实在尽量避免元编程的一些用法,像是方法代理 (method_missing),方法动态定义 (define_method),等等。所以,在此抛出此问题主要是看看大家对元编程用法的见解。
#21 楼 @lithium4010 能把业务逻辑用 OO 的形式写出来,说明不是行业的开拓者,都是存在过的并且有公认的标准的逻辑。比如结算、用户管理、内容管理这些逻辑,很多系统都会用到,路走三熟,然后就可以自己把业务逻辑封装起来了。对于从来没有开拓过的未知领域,除非是上帝,凡人不可能把它抽象出来的。这是开拓者和劳动者的区别。
特别是外包行业,做久了就会发现,那些客户们的需求大部分都是可以复用的,把可以复用的部分封装起来直接调用,太方便了,甚至做的次数多了可以形成自己的一套解决领域问题的框架。但这只是路走三熟,不是创造,创造是实现从来没有过的东西,去实现别人从来没想过的想法,实现的是世界上第一次出现的逻辑。
ruby 本身的玩法就根 python,java 啥的不一样,换句话说就是 ruby 中“好”的标准与其他语言(说的就是类 C 风格的语言)有一些区别。元编程那写技术用的好的,能用非常“漂亮”的方式搞定问题,这里的漂亮也指的是 ruby 社区认为的漂亮,很可能在其他社区中就不“漂亮”了。我觉得元编程这东西只要你觉得带来的价值比带来的问题更多,就值得多用用
# 好好写
class Test
def do_something
end
end
# 非要用 method_missing
class Test
def method_missing(method_name, *args, &block)
if(method_name =~ /do_something/)
puts "catch and do something"
else
super
end
end
end
例子很极端?但我所在的 code base 有类似代码。
我:为什么这么写? 开发:新学了 method_missing,用用看。
There is no such thing as metaprogramming. It’s just programming all the way down. 根本就没有元编程,从来就只有编程。
如果是 Rails 项目,最好别用了.Rails 和 Ruby 是两回事,框架已经告诉你怎么去处理关键问题了.
https://github.com/bbatsov/ruby-style-guide#syntax 这个里面关于元编程第一句话就是 Avoid needless metaprogramming.
但是如果是自己写 Gem 就不一样了,黑科技想用就用,毕竟是自己独立面对一个复杂问题的解法.
首先回答楼主的问题,元编程,当然是可以拿来装逼的!
但是,绝不仅仅只是可以装逼而已!当深刻理解了元编程的概念后,实际上会发现,即使是在 rails 框架当中的业务逻辑,有时候自己也很自然的使用了元编程,而却不自知。
当然也不需要用元编程去秒杀一切重复代码!而且实际上,我认为,ruby 目前的元编程能力,也不足以完完全全的秒杀一切代码!
元编程的使用量评判的唯一标准其实也是没有什么标准的,我是说,其取决于实际情况:假设项目的开发人员只有你一人,有或者项目开发的模块划分的异常清晰,不同开发人员之间没有什么代码交集,那么,整个世界都是你的游乐场,你怎么用我觉得都不算过分。 然而,当有太多人看你的代码的情况下,还是收敛一些比较好,算是为他人着想。
要是必须要说什么标准的话,那么唯一的标准就是代码的人性化,足够方便的进行整个项目的推进,整个项目完全依赖你一人,那么你当然可以随意使用元编程,因为很明显,快速完成功能和探寻未知的好奇没有什么可以被阻止。如果项目依赖多人,那么方便维护也是要考虑在其中的一个重要因素了,就要依据于整个项目中其他人的技术能力和情况,适度的调整元编程的使用量。