Скрытые переменные экземпляра в методе before_filter

Является ли хорошей практикой скрывать инициализацию переменной экземпляра в частных методах?

Например, у меня есть пользовательский контроллер с некоторыми действиями:

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

Некоторые люди говорят, что это похоже на волшебство, но это СУХОЕ. Что вы думаете?


person exAspArk    schedule 19.01.2013    source источник


Ответы (2)


Они не спрятаны, они прямо здесь.

Лично, когда дело доходит до DRY, мне нравится следовать правилу (где-то я его читал, но не помню где, простите меня) - когда вы в первый раз хотите продублировать контент, вы копируете и вставляете его с хмурым взглядом, но если вы хотите продублировать его снова, это когда вы извлекаете его в одно место.

Ваш пример :load_user хорош, но я бы не стал возиться с :set_user.

person sevenseacat    schedule 19.01.2013

Это слишком СУХО для меня.

before_filter для рутинных вещей, таких как инициализация переменной экземпляра, сводит меня с ума, потому что метод кажется пустым, но что-то происходит. Ничего страшного, если в остальном метод пуст, но большие методы могут скрыть фильтр, или вы можете вообще его не заметить. Затем вам нужно найти метод фильтрации и мысленно реконструировать рабочий процесс. Это делает обслуживание более сложным, чем это необходимо.

Я бы отказался от фильтров и вызывал методы getter/setter на месте:

def show
  get_user
end  

Таким образом, вы можете видеть, где происходит инициализация. Если вы настаиваете на использовании фильтров, поместите в метод комментарий, сообщающий, что фильтры применяются.

Лично я резервирую before_filter только для условной логики.

person Substantial    schedule 19.01.2013