id:hirokiky です。
- 「変数に値を置くタイミングって何ですか?」
- 「小まめに変数に入れずに if 文内で直接計算したらダメな理由はありますか?」
というご質問を PyQ メールサポートにいくつかいただきました。
たしかにこれは、実務でプログラムを書いているときにも悩みものです。 レビューの観点としても重要かもしれません。
今回はそんな、変数に置くタイミングの悩みをサポートできればと思います。
質問
PyQの模範解答では x + y
の計算を result = x + y
と一旦保存してから、
if result < 20:
と判定しています。
result = x + y if result < 20: ...
この場合 if x + y < 20:
でも正しいですが、違いや利点、理由はありますか?
if x + 5 < 20: ...
- resultと一旦変数に置く理由は?
- resultと一旦置かないとき、今後プログラムが複雑化する可能性などはありますか?
回答
回答いたします。 練習用に書いているプログラムではメリットやデメリット、違いが分かりにくいかもしれません。
ですのでなるべく、実務でのプログラムなども考えて回答できればと思います。
1. 変数を一旦他の値として置いたほうが良い理由
計算結果を変数に一度置いたほうが良いのは、以下の利点があります
- 変数名によって、計算の意味を説明できること
- デバッグの際などに変数を使いやすいこと
変数名でプログラムの意味を説明する
プログラムの意味を説明する方法としては、コメントやdocstringがあります。 ですが良い変数名に一旦置くことで、プログラムの意味を説明してくれる利点があります。
例えば以下のように price * 1.08
の結果を price_inc_tax
という変数名に置くことで、
「なるほど、消費税込みの価格を計算したんだな」と想像しやすくなります。
price_inc_tax = price * 1.08 if price_inc_tax > 1000: ...
(もちろん一例ですので、消費税は別途値として共通化したほうが良かったり関数化したほうが良かったりします)。
このように変数名として置くことで計算やプログラムの意図を説明しやすくなります。
細かく細かくコメントを入れるよりも、見ればわかる変数名をつけるほうが大事です。
デバッグしやすくなる
これはチョットした便利さのためです。
例えばprint関数を入れて動作を確認したいなというときに、 print(result)
とすると結果がすぐにわかります。
result = x + 5 print(result) # デバッグのために一行入れるだけ if result > 5: ...
pdbを使う場合やloggingする場合、Djangoのトレースバックを見るときやSentryに通知されるときも含めて、 変数に置いておけばデバッグ情報として残されるので値の確認がしやすくなります。
過剰にやる必要はありません
たしかに x + y
などの計算の「意味」が簡単な場合はワザワザ変数に置くのは大げさかもしれません。
変数に置くにしても、変数名から意味が分かりにくければ説明という意味も効果が薄れます。
ですがPyQのカリキュラムの始めの問題は、なるべく分かりやすくお伝えしたいと思っていますので、
- プログラム内では複数のことを1行に詰め込まず、(とくに初歩的な内容の場合は)丁寧に分かりやすくしたい
- プログラムを過剰にまとめず1行1行書いて読みやすく書く習慣をお伝えしたい
という意図で、プログラムはなるべく変数に保存するようにしています。
2. 変数に置かない場合の問題
例えばPyQの問題でも if x + y > 5:
のようにまとめて書ける場合は多いです。
とくに簡単なプログラムの場合は問題になりませんが、複雑になってくると問題になります。
例えば先ほどの消費税計算の例をもう一度考えると、以下のif文は分かりにくくなっていますね。
price = 120 if price * (1 + 0.08) < 500: ...
このような場合考えられる今後の問題:
- 中長期開発の場合、後で見返したときに分かりにくい
- 消費税計算のプログラムが各所に書かれるおそれがある
「変数に入れる」という習慣になっていれば、変数の意味を考える機会も増えます。 そうすればプログラムの意味を考えて、「この処理は関数に切り分けられるかも」という発想も湧きやすくなります (副次的な効果ですが)。
例えば、このような関数に切り分けるということです。
def calc_tax_included(price, tax_rate=0.08): return price (1 + 0.08) price = 200 tax_included_price = calc_taxt_included(price) if tax_included_price < 500: ...
プログラムが複雑になればなるほど、まとめて書いてしまうリスクはでやすくなりまし、 逆に、細かく変数に入れすぎて読み難くなるリスクもでてきます。
プログラムは何度も書く中で勘所を身につけるものです。 今回は少し抽象的な話になってしまいましたが、 プログラムを書いて覚えるという実践はぜひPyQで積んでいただければと思います。
ぜひ、PyQで「プログラムの勘所が分かる」、「レビューで重要な意見交換に集中できる(細かな点はお互いうまく書けるので見なくても済む)」ようなプログラミングのスキルを身につけて貰えればと思います。