1

在私有方法中隐藏实例变量初始化是一个好习惯吗?

例如,我有一个带有一些操作的用户控制器:

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

有人说它看起来像一个魔法,但它是干燥的。你怎么看?

4

2 回答 2

0

这对我来说太干了。

before_filter对于诸如实例变量初始化之类的例行事情,我发疯了,因为该方法显示为空白,但事情正在发生。如果方法是空的,这没什么大不了的,但是大的方法可能会掩盖过滤器,或者您可能会完全忽略它。然后,您必须寻找过滤方法并在脑海中重建工作流程。它使维护比需要的更加困难。

我会放弃过滤器并就地调用 getter/setter 方法:

def show
  get_user
end  

这样你就可以看到初始化发生在哪里。如果您坚持使用过滤器,请在方法中添加注释,告知正在应用过滤器。

就个人而言,我before_filter只保留条件逻辑。

于 2013-01-19T12:16:06.873 回答
0

它们不是隐藏的,它们就在那里。

就个人而言,当谈到 DRY 时,我喜欢遵循一条规则(我在某处读过,但我不记得在哪里,请原谅我)——当你第一次想要复制内容时,你会皱着眉头复制并粘贴它,但是如果你想再次复制它,那就是将它提取到一个地方。

你的:load_user例子很好,但我不会打扰:set_user.

于 2013-01-19T10:51:47.750 回答