if文とelse文の距離、Javaソースコードにおける条件分岐の距離
Javaソースコードのif文全体を見た際、
if文とelse文全体の行数が多くて、どんな条件で何の処理を実行しているのか、よくわかりません。
Javaソースコードにおけるif文とelse文の距離は、近い方が分岐処理を一覧できます。
if文とelse文の距離を、なるべく短くしてください。
そうする方が、「条件分岐のプログラム処理の流れ」がわかりやすいです。
近い方が良い、Javaソースコードにおけるif文とelse文の距離
Javaソースコードにおける条件分岐の距離の例として、if文とelse文の距離について、お話したいと思います。
if文とelse文の距離が近いほど、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文を書くことは、プログラムの品質向上につながります。