在私有方法中隐藏实例变量初始化是一个好做法吗?
例如,我有一个带有一些动作的用户控制器:class UsersController < ApplicationController
before_filter :get_user, only: [:show, :edit, :update, :destroy]
before_filter :set_user, only: [:new, :create]
def index
@users = User.all
end
def show
end
def new
end
def edit
end
def create
if @user.save
redirect_to @user, notice: 'User was successfully created.'
else
render action: 'new'
end
end
def update
if @user.update_attributes(params[:user])
redirect_to @user, notice: 'User was successfully updated.'
else
render action: 'edit'
end
end
def destroy
@user.destroy
redirect_to users_path
end
private
def get_user
@user = User.find(params[:id])
end
def set_user
@user = User.new(params[:user])
end
end
有些人说它看起来像一个魔法,但它是DRY。你觉得呢?
它们没有被隐藏,它们就在那里。
就我个人而言,说到DRY,有一个我喜欢遵循的规则(我在某个地方读过,但我不记得在哪里了,原谅我)——第一次你想复制内容,你皱着眉头复制粘贴,但如果你想再次复制,那就把它提取到一个地方。
您的:load_user
示例很好,但我不会为:set_user
费心。
这对我来说太干了。
before_filter
为例程的东西,如实例变量初始化让我疯了,因为方法看起来空白,但事情正在发生。如果方法是空的,这没什么大不了的,但是大的方法可能会模糊过滤器,或者您可能会完全忽略它。然后,您必须寻找过滤器方法并在心里重构工作流。它使维护比需要的更加困难。
我将放弃过滤器并调用getter/setter方法:
def show
get_user
end
这样你就可以看到初始化发生在哪里。如果您坚持使用过滤器,请在方法中添加注释,告知正在应用过滤器。
我个人认为,before_filter
只用于条件逻辑。