if文とelse文の距離、Javaソースコードにおける条件分岐の距離

Javaソースコードのif文全体を見た際、
if文とelse文全体の行数が多くて、どんな条件で何の処理を実行しているのか、よくわかりません。

Javaソースコードにおけるif文とelse文の距離は、近い方が分岐処理を一覧できます。

if文とelse文の距離を、なるべく短くしてください。
そうする方が、「条件分岐のプログラム処理の流れ」がわかりやすいです。

近い方が良い、Javaソースコードにおけるif文とelse文の距離

Javaソースコードにおける条件分岐の距離の例として、if文とelse文の距離について、お話したいと思います。

if文とelse文の距離が近いほど、if文の分岐処理を一覧できます
よって、「プログラム処理の流れ」がわかりやすいです。

Javaプログラミングのif文
Javaプログラミングのif文・イメージ画像

if文とelse文の距離が近い例

以下に「if文とelse文の距離が近い場合」について、例を示します。
プログラムの詳細を理解する必要は、ありません。

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){

    TimesheetForm timesheetForm = (TimesheetForm)form;
    String action = timesheetForm.getAction();

    if (action.equals("init")){
        //TimesheetFormに初期値を設定するため、
        //timesheetAction.do?action=init が必要
        //timesheetFrame.htmlから、ここを呼び出す
        return this.init(mapping, timesheetForm, request, response);
    }
    else if (action.equals("update")){
        return this.update(mapping, timesheetForm, request, response);
    }
    else if (action.equals("show")){
        return this.show(mapping, timesheetForm, request, response);
    }
    else{
        throw new IllegalArgumentException("invalid action=" + action);
    }
}

最初のif文から最後のelse文の終わりまで、15行あります。

15行くらいなら、距離は近いです。なので、次のようにif文の分岐処理を理解できます。

  • 変数actionが、"init"の場合
    初期化処理をする。
  • 変数actionが、"update"の場合
    更新処理をする。
  • 変数actionが、"show"の場合
    表示処理をする。
  • 変数actionが、その他の場合
    変数actionは無効な値である、という例外を通知する。

この例では、if文からelse文までの距離を短くするため、それぞれの場合で行なう処理を、一つのメソッドにまとめています。

if文の分岐処理をわかりやすくするために、このようにメソッドを呼び出した場合、
メソッド内の処理は隠蔽されています。

例えば、変数actionが"show"の場合に呼び出すshow()メソッドについては、表示処理の詳細(ソースコード)はわかりません。

しかしこの場合では、show()メソッド内の処理を見せることよりも、if文の「分岐処理のわかりやすさ」を優先しています。

※この記事は、2003年6月当時の記事になります。

if文とelse文全体の行数を少なくすることは、ソースコードの可読性を良くする方法です

if文とelse文は、条件分岐を表現するためによく使われる構文です。

ただし、その行数が多くなると、プログラム処理の流れを追いにくくなります。
また、if文のネストが深くなると、インデントも増えて、ソースコードの見た目も悪くなります。

よって、if文とelse文全体の行数を少なくすることは、ソースコードの可読性を向上させる一つの方法です。

if文とelse文全体の行数を少なくしたい場合、以下のような工夫ができます。
必要に応じて、やってみましょう。

条件式をシンプルにする

複雑な条件式は、論理演算子や関数を使って分割すると、わかりやすくできる場合があります。

Java言語において、以下のようなプログラムコードで、
if文の複雑な条件式を、論理演算子を使って分割できます。

int age;
boolean hasID;

中略

boolean isAdult = age >= 20;
boolean hasValidID = hasID && age >= 18;

if (isAdult || hasValidID) { // 論理演算子を使って、条件式を分割する
  //大人である
}

上記の例では、変数ageが20以上の場合、
または、変数hasIDがtrue、かつ変数ageが18以上の場合に、大人であると判断しています。

このように論理演算子を使って条件式を分割することで、if文の条件式を簡潔にできます。

また、以下のように関数を使って条件式を分割することもできます。

public static void method(int age, boolean hasID) {
  boolean isAdult = isAdult(age);
  boolean hasValidID = hasValidID(age, hasID);

  if (isAdult || hasValidID) {  // 関数を使って、条件式を分割する
    //大人である
  }

以下省略

}

public static boolean isAdult(int age) {
  return age >= 20;
}

public static boolean hasValidID(int age, boolean hasID) {
  return hasID && age >= 18;
}

上記の例では、isAdult()関数とhasValidID()関数を使って、それぞれの条件式を分割しています。

このように関数を使って条件式を分割することで、if文の条件式を簡潔にできます。

複数の条件分岐がある場合、else if文を使う

複数の条件分岐がある場合は、連続したif文を書くよりも、else if文を使います。

ソースコードの見通しが、良くなります。

if文のブロック内で、早期リターンを使う

条件分岐の中で関数やメソッドを終了する場合は、return文を使って早期リターンします。
こうすると、ネストを減らすことができます。

Java言語において、if文のブロック内で早期リターンを使うプログラムコードの例は、以下のようになります。

public static int getPositiveNumber(int num) {
  if (num <= 0) {
    return 0; // 早期リターン
  }
  return num;
}

上記の例では、引数numが0以下の場合、
0を返すようにしています。

このように、if文のブロック内で条件に合致する場合に、早期にreturnします。

そうすることで、if文のネストを減らして、ソースコードの可読性をなるべく良くします。

三項演算子を使う

単純な条件分岐で、値を代入するだけの場合は、
三項演算子を使って一行で書くことができます。

Java言語における、三項演算子のプログラムコードの例を示します。

int x = 12;
String result = x >= 10 ? "OK" : "NG";
System.out.println(result); // OK

三項演算子は、条件式と、真の場合の値と偽の場合の値を指定して、条件に応じて値を返す演算子です。

例えば、上記のコードでは、
変数xが10以上ならば、"OK"という文字列を、result変数に代入します。
そうでなければ、"NG"という文字列を、result変数に代入します。

プログラムの品質を良くするために、可読性が高いif文を書きましょう

if文とelse文全体の行数がなるべく少なくなるように、工夫してソースコードを書いてみましょう。

ソースコードの可読性は、プログラムの品質やメンテナンス性に大きく影響します。

可読性が高いif文を書くことは、プログラムの品質向上につながります。

【まとめ記事】へのリンク

【まとめ記事】Javaアプリの品質を保つため、Javaソースコードを書くための工夫

Javaソースコードを正しく書くための、ちょっとした工夫について、ご紹介しています。 変数の寿命を限定する書き方。 肯定的な条件を優先して条件分岐する書き方。 クラス…