2009 Ruby On Rails
14Apr

重构你的Rails程序 – 读书笔记

好久没有用心读过一篇文章了,今天翻出了Railsconf 2008 Zach Dennis的Refactoring Your Rails Application,顺便记了个笔记。

首先,我了解了什么叫Code Smells异味代码

在电脑编程有一句俗话,异味的代码就是那些在源码中出现任何症状,也就是会给整个程序带来更深入问题的代码。(这些代码就是需要我们重构的)

那么有以下几种异味的代码:

  • 重复代码 Duplicated code
  • 如果你有相同的代码或者结构出现在两个以上的地方

  • 散弹枪手术 Shotgun Surgery
  • 如果你改变一个地方的代码将会影响你的程序的很多代码块的时候

  • 太过长的方法 Long Method
  • 太过长的方法比较难懂,也比较难维护,容易混淆他们的功能

  • 不恰当的关系 Inappropriate Intimacy
  • 在你的一个类里面出现了一些方法代码跟这个类毫无关系,比如说你的视图模块中出现了SQL代码,其实这些代码更适合放在你的模型类中

  • 不同的改变 Divergent Change
  • 类只有一个使其改变的原因,而一个对象却不遵循这个原则(单一责任原则SRP)

  • 体积太大的类 Large Class
  • 当一个类包括的方法过多的时候

  • 反客为主 Feature Envy
  • 当一个方法里面涉及到别的类比自身类的对象更多的时候

  • Message Chains 信息链
  • 例如:当你获得一个对象时,又从这个对象获得了另一个对象和另一个对象的结果。这样的获取重复了这个结构。

一些简单使用代码块的重构方法

  • 扩展你的类 Extract Class
  • 你有一个实现的类,但是这个类却可以分解成两个或更多。重新建立新类,把相关方法放在同一个类里面 (Reference: —Refactoring, Fowler, pg. 149.)

  • 转移你的方法 Move Method
  • 当你有一个旧方法中的一段代码正在或者将会被用在多个方法或者其他类的时候,你必须要定义一个新方法,放在你的类中。而你在旧方法中申明引用这个新方法,删除那段代码 (Reference: —Refactoring, Fowler, pg. 142.)

  • 扩展你的方法 Extract Method
  • 当你有一些代码片段可以放在一起用,那么就把这些代码放进一个方法,取一个好名字。 (Reference: —Refactoring, Fowler, pg. 110.)

接下来就来个实战第一例:在Partial中使用本地变量代替实例变量 Replace Instance Variable With Local Variable in Partial

最开始的时候,有这么一段代码:


# app/views/layouts/application.html.erb
< % if @project %>
< %= render :partial => “projects/sidebar” %>
< % end %>
# app/views/projects/_sidebar.html.erb
< %= h @project.name %>
< %= render :partial => “projects/users” %>
# app/views/projects/_users.html.erb

很显然,我们在只是一个模板调用这个partial的时候,完全没有问题,可是一旦有多个模板调用partial的时候,可能在模板内使用实例变量不是一样的了,那么这个时候,我们要将partial中的实例变量换为本地变量,然后在render的时候把实例变量传给本地变量就行了,所以代码就改为了:


# app/views/projects/_users.html.erb
< % project.users.each do |user| %>
< %= user.name %>
< % end %>
# app/views/projects/_sidebar.html.erb
< %= h @project.name %>
< %= render :partial => “projects/users”, 
                      :locals => { :project => @project } %>
# app/views/layouts/application.html.erb
< % if @project %>
< %= render :partial => “projects/sidebar”, 
                      :locals => { :project => @project } %>
< % end %>

« | »

Leave a Reply

blog comments powered by Disqus

@ Douban.com