作者giive (lala)
看板Ruby
标题DRY or not DRY
时间Tue Oct 17 08:43:03 2006
出自我的 Blog
http://lightyror.blogspot.com/2006/10/dry-or-not-dry.html
DRY 也就是 Don't Repeat Yourself 的简称,Ruby on Rails 导入许多机制只是为了更好 DRY your code ,使用 DRY 可以有效减少需要维护的 Code。
不过也发生一些小问题,有些时候,到底要不要 DRY ? 像是 Partial Template 这个机制,本来也是为了 DRY 而产生的。可是遇到一个情况
当许多 template 都会呼叫到同一个 partial
但是每个 template 呼叫的 partial 都希望有微小的改变
像是 A template 是外面的人看到的页面,他呼叫partial X ,你不希望 partial X出现管理的 link ,让外人可以进入管理的页面。但是B template 是已经经过认证的 User,他也呼叫 partial X,但是他却希望partial X出现管理的 link 。
难道你要为了新增一个 link ,另外写一个页面?
这样就不够 DRY 了,所以我们其实可以在 Partail X 这样搞
if params[:controller] == 'A_controller' and params[:action] == 'B_action'
show_link
end
其实parmas 变数里面有 controller 跟 action 变数,可以记载这个 template 现在正在那边。一般来说没有用到的必要,因为 controller 跟 view 的对应是 1:1 的关系。只不过,我们用到 partial template 时,如果遇到刚刚的情况,可以使用这两个变数来探知现在这个 partial 被那个 controller 跟 action 所呼叫,并且做出不同反应。
听起来很棒,其实是另外一个问题的开始。Ruby on Rails 之所以 Controller 跟 Action 会预设 1:1 对应其实也让 coder 清楚程式架构的因素在。如果你 过量 使用上述的方式,会让你的 view code 出现
if params[:controller] == 'A_controller' and params[:action] == 'B_action'
show_link
elsif params[:controller] == 'C_controller' and params[:action] == 'D_action'
show_link2
elsif params[:controller] == 'E_controller' and params[:action] == 'F_action'
show_link3
elsif params[:controller] == 'G_controller' and params[:action] == 'H_action'
show_link4
elsif params[:controller] == 'I_controller' and params[:action] == 'J_action'
show_link5
elsif params[:controller] == 'K_controller' and params[:action] == 'L_action'
show_link6
elsif params[:controller] == 'M_controller' and params[:action] == 'N_action'
show_link7
end
这样的code 太可怕了。
回到 Ruby on Rails 的根本,这一切的一切都是为了加快开发速度而设计的。
为什麽要使用 DRY ?因为要减少 Code 量,Code 量少就会减少 Code 的维护成本。减少 Code 维护成本才能增加开发速度。但是虽然我们使用 DRY 原则减少了程式的 code 量,但是却增加了阅读的难度。这有意义吗?并且 view 层本来就不能安插太多程式,这会造成架构上的混乱。因为上述的情况并不会有效的减少 Code 维护成本,某种程度还会增高维护成本,所以为了大原则 加快开发速度 ,我们必须给予重写。
但是话说回来
if params[:controller] == 'A_controller' and params[:action] == 'B_action'
show_link
end
这段对我来说并不会下降可读性,却又拥有 DRY 的优点,对我来说这是会加快开发速度的,所以我允许我自己这样写。一般来说,partial 出现 if 二选一,或是三选一我是允许的,四选一的话,重构吧。
凡事过与不及都不好,要怎麽取得平衡才是大学问呀。
--
lighty RoR 是一个介绍 lighttpd , SQLite , Ruby and Rails 的 Blog
http://lightyror.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.230.102.201
※ 编辑: giive 来自: 61.230.102.201 (10/17 08:43)
※ 编辑: giive 来自: 61.230.102.201 (10/17 08:43)
1F:推 PttHuge:请问partial是ruby还是CS的术语吗? 10/17 09:48
2F:推 giive:Rails 的 render :partial 10/17 11:57