之前没注意这篇 blog,感谢 @hpyhacking 在 http://ruby-china.org/topics/10381 写了这么一段让我注意到
所以我认为脚本语言是一个祸害,它几乎永远是错误的决定。
我们应该尽一切可能避免使用脚本语言。在没有办法的情况下(比如老板要求),也应该在脚本里面尽可能的使用通常的程序设计原则。
摘自 http://www.yinwang.org/blog-cn/2013/03/29/scripting-language/
我基本上赞同王垠博客里的观点,事实上这也是我一直以来比较注意的一个事情,除了 rails/sinatra 这样“手把手”的框架外,很多人(包括我)写的 ruby 代码基本上就是脚本堆砌,我见过公司的另外一个同事写的运维脚本,除了使用 ruby 语言,我找不到和(新手写的)bash shell 有什么不同——同样无结构、缺设计,而这是难以维护和不能长久的。
举个例子吧,类似的现象常出现在对 AR 的使用上,我们知道,在 M.F.的企业应用架构模式中,与领域模型做对比,还有一个业务脚本(也翻译成事务脚本)模式,后者的困难在于难以迎接业务的演化,所以结合 ORM 技术,我们 rails 中使用了充血模型,但是 AR 本身并不能保证你不写出“业务脚本”,比如:
Product.where("created_at > ?", Time.now).where(:owner => user).order(:id).limit(5)
这句话并不比
select * from products where created_at > now() and owner_id = #user.id order by id limit 5
更加结构化和易复用
当然,有经验的人都知道,正确的做法是使用 relation 技术复用各种 scope。但是,如果没有 AR 或者 Rails,有多少人能够意识到什么才是正确的做法呢?而王垠这篇博客的观点其实正好提醒我们——虽然 ruby 号称是脚本语言,但是作为一个程序员,你必须知道在必要的时候用严谨的方式使用通常的程序设计原则
,避免“脚本面条”
BTW:之前很多同学都在讨论面试时怎样体现“深入”,我想,能充分理解这些做法的来龙去脉,利用工具而不是受到工具的支配算是一个方向吧。