@kyanny's blog

革命は金銭ではない - 孫文

インスタンス変数を使うべきときと使うべきでないとき

今日教わったことが、とても腑に落ちる説明で勉強になったのでメモっとく。

Rails なアプリのコントローラでアクションを書いてて、

def hoge
  @hoge = Hoge.find_by_xxx
  response.headers['X-Hoge-Moe'] = @hoge.moe
  render :text => 'OK'
end

こんなコードを書いたとき、「ビューや他のアクションで @hoge を参照しないなら、そこはインスタンス変数じゃなくてローカル変数にするべき」だと指摘された。

Perl でいうとこういう感じのコードになるかもね、といわれた。

# 例えば Sledge の場合
sub dispatch_hoge {
  my $self = shift;
  our $hoge = Hoge->find_by_xxx;
  $self->r->header_out('X-Hoge-Moe' => $hoge->moe);
  # ...
}

具体的に Sledge なコードを書いてもらったわけではないけど、この説明はとてもわかりやすく、腑に落ちた。

「@hoge ってかいてあると、これどこか他のところで使ってるのかなーと気になる」という感覚らしいのだけど、そういうある種カルチャーっぽいところはある程度使い込んでいかないとなかなか気づかないので、早めに教えてもらえたのはありがたい。たしかに、サブルーチンの中で our 宣言するコードがあったら、「ん? my でよくね?なんか意味あんのかな」って気になるもんな。