その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

temp という名前の変数について

結論から申し上げますと、「変数の内容を一時的に待避させる」目的*1 以外ではtemp (あるいは tmp) という名前の変数は使いません。
それ以外の用途で temp という名前の変数が使われている場合、そのコードはイケてない可能性が高いです。気をつけましょう。

そもそも temp とはなにか

http://ejje.weblio.jp/content/temp
http://ejje.weblio.jp/content/temporary
辞書を引いてみると「一時的な」、「臨時の」という意味合いのようです。

変数の名前

変数の名前は「その変数が何者か」という事を *シンプルに* 表している必要があります。
つまり、temp という名前の変数を利用したい場合は、「一時的な」とか「臨時の」とか、という意味合い以外で使ってはならないのです。

以下の2つの簡単なコードを比較してみましょう。
names = ['Alice', 'Bob', 'Charles']
names.each do |name|
  puts "Hello, #{name}"
end
names = ['Alice', 'Bob', 'Charles']
names.each do |temp|
  puts "Hello, #{temp}"
end

`puts` で出力している部分に注目しましょう。
先に挙げたコードでは、
puts "Hello, #{name}"
となっており、一目で「名前を表示しているのだな」と理解することが出来ます。
が、後に示したコードは、
puts "Hello, #{temp}"
となってしまい、この文を読んだだけでは何を表示しているのかが全く分かりません(そもそも、「一時的なもの」を表示しているとは?)。
「この`temp` が何者であるのか」は前行の
names.each do |temp|
の部分を読まなければなりません。
コードを上から順に読み下すだけで意味が理解出来るコードは一般的に可読性が良いとされていますが*2
この場合だと、コードの意味を理解するために前の行に戻って読み直さなければならない為、良くない感じになってしまいます。
(まあ、この程度の規模のコードだったら全然問題にならない感じではありますが)

このように temp という名前の変数を定義してしまうと、その変数がどういった目的で利用されるのかが一目で理解出来なくなってしまいます。これは問題だ。
(swap 処理は「一時的に待避させるための変数」という、temp という単語の意味がそのまま目的として利用されるので、temp という名前の変数でも無問題)

命名責任を放棄してはならない

temp という名前の変数にものを代入すると、その中身が一体何者なのかがさっぱりわかりません。
が、もしもこれが name という名前の変数に代入されていれば「これは名前を表しているのだな」という事が一目で分かります。

つまり、適切な変数名を設定するというのはコード1文あたりが持つ情報量を増加させることを意味します。これは可読性を向上させることに繋がります。
一方で名前が適切に設定されていないコードは、1文あたりの情報量が少ない為、前後の文脈を把握しながらでないとコードの挙動を理解することが難しくなります。

なので、安易に「じゃ、これは temp で良いか!」みたいな感じで、いいかげんに変数を命名してしまうと、
そのコードが大きく育ってきたときに、間違い無くその temp 変数は負債となります。
命名責任を放棄して適当な名前を付けてしまうのは、破滅へ1歩近づくと言うことに他ならないのです。

ああ、そうそう。DQN ネームを自分の子供に付けちゃう人も、そこら辺に気をつけた方が良いと思う。

(おまけ)さらに破滅した例

temp1 = ['Alice', 'Bob', 'Charles']
temp1.each do |temp2|
  puts "Hello, #{temp2}"
end
オオ、もう……

*1:例えば swap 処理

*2:要出典