瞎扯淡 元编程 —— 装逼专用?(其实用 Rails,并不需要太高的 Ruby 技能)

hiveer · 2015年12月12日 · 最后由 hewe 回复于 2015年12月21日 · 6618 次阅读

大家都懂元编程吧,这里就不解释了。 之前面试过好几个 Rails 开发,多数都会提起自己学习元编程 (like reading <>)。 似乎大家都很看重自己元编程的能力,至少看起来是这样。 那么,问题来了: 在我们的日常开发中,什么样的情况下才该用元编程呢? 是不是应该用元编程秒杀一切重复代码? 还是说元编程只是作为大家装逼专用?

只有开发一个"框架"的时候才能体会到元编程的作用

rails 这种多人协作的工程,最担心的是有搜索不到的函数 项目中滥用元编程,你的队友会打死你的

滥用元编程和觉得元编程装逼都是两个极端。

attr_accessor 就是元编程,术语:类宏。

#2 楼 @rei 同感,但是评价滥用的标准就不好说了。

#1 楼 @mizuhashi 比如以前用的 alias_method_chain 就经常搜不到函数。

感觉看那本书的主要还是加深自己对 ruby 各种概念的理解,看看到是好的,作者也很给力分享;拿出来炫耀无非让人觉得自己懂,别人都是菜鸟,心态、人品问题。

没有觉得别人面试的时候提到元编程就是炫耀阿,心情可以理解。

我觉得《Ruby 元编程》最后一章就写的很好了:元编程不过是编程。

在 Ruby 中,元编程和普通编程的界限会变得越来越模糊。等你对这门语言有了深刻认识后,你会发现界定一种技巧或用法是元编程还是普通编程是非常困难的。

 

实际上,元编程已经渗入 Ruby 的血液之中,你很难写出一段符合规范的 Ruby 代码,却完全不使用元编程的法术。这门语音实际上鼓励你操纵语言的构件,扩展对象模型,重新打开类,动态定义方法,以及用块来管理作用域。还是那句话:“根本就没有元编程,从来就只有编程。”

怎么好写怎么来呗。遍历 50 个字段当然是用 send 方便了

现在生活中用的还是比较少的。。。。

当 IDE 遇到元编程..... ,总有一丢丢不酸爽

自己开发高级软件时,是非常需要元编程的,可以大大提高程序可读性(设计好的 DSL),和可维护性。

元编程编程的思想更重要,而不是它到底能不能在项目中有没有用的到吧

#7 楼 @rei 感觉作者其实期望不要另眼相看元编程,无所谓特别,用 Ruby 而不用元编程其实还不如不用 Ruby。

#1 楼 @mizuhashi 这个只是增加了一定的难度去找到这个方法在哪儿产生的,不管是动态定义或者不是,一个方法总有一个 caller,一个 receiver,所以其实还是可以较好定位的。

我觉得元编程更多的是一种编程思想。

只是 “编程” 而已,感觉你极端化了

@easonlovewan 我其实就是抛出了这个问题,并不能表现出我是否极端。但是在我的工作经验中,确实遇到一些看似极端的现象,就是大家其实在尽量避免元编程的一些用法,像是方法代理 (method_missing),方法动态定义 (define_method),等等。所以,在此抛出此问题主要是看看大家对元编程用法的见解。

应该是说写业务逻辑的时候不怎么能用的到元编程

#18 楼 @nine 请教下,写业务逻辑的时候用的最多的是什么?

#19 楼 @pathbox if......elsif.....else,别小看判断语句,业务逻辑要考虑现实的各种情况,还有各种情况下的分支,各种情况的冲突、包含,绝对能把人绕晕,比什么拉格朗日定理、斐波那契数列复杂多了。

觉得 if else 太多一般都是逻辑没有理清楚,没有做好 OO

#21 楼 @lithium4010 能把业务逻辑用 OO 的形式写出来,说明不是行业的开拓者,都是存在过的并且有公认的标准的逻辑。比如结算、用户管理、内容管理这些逻辑,很多系统都会用到,路走三熟,然后就可以自己把业务逻辑封装起来了。对于从来没有开拓过的未知领域,除非是上帝,凡人不可能把它抽象出来的。这是开拓者和劳动者的区别。

特别是外包行业,做久了就会发现,那些客户们的需求大部分都是可以复用的,把可以复用的部分封装起来直接调用,太方便了,甚至做的次数多了可以形成自己的一套解决领域问题的框架。但这只是路走三熟,不是创造,创造是实现从来没有过的东西,去实现别人从来没想过的想法,实现的是世界上第一次出现的逻辑。

ruby 本身的玩法就根 python ,java 啥的不一样,换句话说就是 ruby 中 “好” 的标准与其他语言(说的就是类 C 风格的语言)有一些区别。元编程那写技术用的好的,能用非常 “漂亮” 的方式搞定问题,这里的漂亮也指的是 ruby 社区认为的漂亮,很可能在其他社区中就不 “漂亮” 了。我觉得元编程这东西只要你觉得带来的价值比带来的问题更多,就值得多用用

ruby 元编程,就像暗黑法师 30 级会瞬移

他不会帮你打倒敌人,但会助你冲突难关,关键时刻救命

再说了,职场上,装得一手好逼,也是个 big plus

元编程, 就像原子弹, 不能没有,但又不能乱用!

@ery 那该什么时候用呢?

想到一个滥用的例子:明明可以好好写代码,却偏偏要用 method_missing。

@yue 你这回复让人摸不着头脑啊。什么叫做好好写代码?为什么偏偏不能用method_missing?

#28 楼 @hiveer 给个🌰就好理解了。

# 好好写
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,用用看。

@yue 很多时候确实是不好界定什么时候用合适,什么时候用不合适。但是在 stackoverflow 上看到了一总结,感觉挺能接受的

Summary: When to use? When it will make your life easier and not complicate others' lives.

#20 楼 @hi2016 哈哈,最近狂写 if elsif。。。。。。

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 就不一样了,黑科技想用就用,毕竟是自己独立面对一个复杂问题的解法.

#29 楼 @yue 运行时效率损失还是很大的,应该对写出这种代码的新人进行批评指正 哈哈

业务代码不用,写组件或者插件,架构一般会用到

来凑个热闹!

首先回答楼主的问题,元编程,当然是可以拿来装逼的!

但是,绝不仅仅只是可以装逼而已!当深刻理解了元编程的概念后,实际上会发现,即使是在 rails 框架当中的业务逻辑,有时候自己也很自然的使用了元编程,而却不自知。

当然也不需要用元编程去秒杀一切重复代码!而且实际上,我认为,ruby 目前的元编程能力,也不足以完完全全的秒杀一切代码!

元编程的使用量评判的唯一标准其实也是没有什么标准的,我是说,其取决于实际情况:假设项目的开发人员只有你一人,有或者项目开发的模块划分的异常清晰,不同开发人员之间没有什么代码交集,那么,整个世界都是你的游乐场,你怎么用我觉得都不算过分。 然而,当有太多人看你的代码的情况下,还是收敛一些比较好,算是为他人着想。

要是必须要说什么标准的话,那么唯一的标准就是代码的人性化,足够方便的进行整个项目的推进,整个项目完全依赖你一人,那么你当然可以随意使用元编程,因为很明显,快速完成功能和探寻未知的好奇没有什么可以被阻止。如果项目依赖多人,那么方便维护也是要考虑在其中的一个重要因素了,就要依据于整个项目中其他人的技术能力和情况,适度的调整元编程的使用量。

『其实用 Rails,并不需要太高的 Ruby 技能』 坑也是这么挖出来的。

#37 楼 @liwei78 真的吗?我怎么感觉需要很深的水平,虽然我是个新手。。。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册