Rails系列教程(3):Database-centric Programming
上一篇 /
下一篇 2008-02-02 15:50:47
/ 个人分类:RoR
执行SQL语句的做法通常有2种:1)在程序里面嵌入sql代码(embed)2)使用preprocessor
1.ruby中使用嵌入sql语句的做法:
def update_sales_tax
update = @db.prepare("update orders set tax=? where id=?")
@db.select_all("select id, amount from orders") do |id, amount|
tax = calc_sales_tax(amount)
update.execute(tax, id)
end
end
其实这样的做法已经比java的做法简单很多了,更不用说是c语言对sql的操作,这种特性不是来自于rails,而是来源于ruby,当然作为层次型语言对平面型数据库的操作,本来就有很多不好的地方,其实,最好的解决应该是把数据库转化成层次型,这样更加直接,方便,能够更好的应对需求变更,但是现在的层次型数据库毕竟还没有兴起,只能看看以后的发展情况了
但是这样的写法实际上是不好的,我们可以看见程序里面有sql,sql被涵盖在程序的可能出现的角落,结果application logic和database logic纠缠到了一起,这样的纠缠带来了错综复杂的关系,有可能造成了这样一种情况,修改了表里的一个属性项,需要修改很多程序的地方,而且这些地方不一定是明显的,这样的方式把数据暴露出来,就像我们使用继承的时候,使用class instance variables而不去使用方法是一样的,结果是恶劣的,当然这样的行为影响的是维护(maintain),同时我也相信,世界上没有系统一次就能开发完善以致于不需要任何维护。其实这也包含了一个复用和封装的问题,一段代码,如果以非methods的形式出现,而是通过copy来实现,那么这样的拷贝会带来很多的麻烦
记住,封装(encapsulation)是解决重复代码的一个很有效的方法,encapulation解决的是:一处修改,处处更新
收藏
举报
TAG:
RoR