[C/C++] わかりやすいif文(条件式)の書き方

プログラムが複雑になってくると、データ数が増え、条件式も複雑なものが多くなってきます。
複雑な条件式は可読性が落ちてしまい、プログラムの理解に時間がかかったり、バグを引き起こす要因にもなる場合もあります。
そこで、わかりやすい条件式の書き方について、いくつかの方法を解説します。

スポンサーリンク

定数との比較

変数と定数を比較する場合は、変数を左辺へ、定数を右辺へ記述すると読みやすくなります。

// 変数が左辺:〇
if(A >= 20)

// 変数が右辺:×
if(20 <= A)

上記の例で、Aさんの年齢を判定していると仮定します。
ぱっと見でどう感じるでしょうか?
変数が左辺の場合、「Aさんの年齢が20歳以上の場合」と読み取れますが、
変数が右辺の場合、「年齢が20歳以上なのがAさんの場合」となり、文章化したときに違和感があり、情報が頭に入りにくくなります。
たったこれだけのことですが、可読性に大きく影響しますので、基本的には変数が左辺にくるように条件式を書きましょう。
チームで開発している場合に、これを守っていないと嫌われるかも。。。💦

ただし、例外もあります。
次に解説する、「変数値の範囲を判定」する場合は、必ずしも変数が左辺に来る方が分かりやすいとは限りません。

変数値の範囲の判定

変数値の範囲の判定は、大体が次の2パターンになります。

パターンA
パターンB

下記のように条件式を書くと、変数と定数が図の並びの通りになるので、わかりやすくなります。

if((10 < A) && (A < 20))	// パターンA
if((A < 10) || (20 < A))	// パターンB

複数の論理式の組み合わせ

複雑な論理式の場合、1行で書くと理解が難しくなります。

if((A==0) && ((B<C) || (B<10)) && (C!=D))

このような場合は、ANDまたはORで括って改行すると、わかりやすくなります。

if((A==0)            &&
   ((B<C) || (B<10)) &&
   (C!=D))

上記例のようにANDで括って改行すると、1行ずつ条件式を分けて考えられるので、どのような複合条件になっているのかが、理解しやすくなりますね。これは条件式が複雑になるほど効果があります。

条件式の関数化

よく使う条件式だったり、あまりにも複雑な場合は条件式を関数化する手もあります。

if((A==0) && ((B<C) || (B<10)) && (C!=D))

上記の条件式を関数化した例:

_Bool Judge(int A, int B, int C, int D)
{
	if((A==0)            &&
	   ((B<C) || (B<10)) &&
	   (C!=D)){
	   return TRUE;
   }
   return FALSE;
}

if(Judge(A,B,C,D) == TRUE)

まとめ

条件式を書く時には以下のことに気をつけましょう。

  • 変数と定数の比較では、変数を左辺に、定数を右辺に!
  • 変数値の範囲の判定では、上記のルールに縛られず、値の小さい順番に!
  • 複雑な論理式では、ANDまたはORで括って改行!
  • 良く使用する条件式は関数化!

上記を意識するだけで、可読性がグッとUPしますので、実践してみてください。

他にも、可読性をUPさせるためのテクニックは多々あります。
書籍「リーダブルコード」がおススメです。是非読んでみてください。

コメント