数値リテラル、文字列リテラルは原則全て定数化するかenumにする。(定数にグループ性があるものはenumにする。)

どうも、スィンです。

では、例文から。
例文は今回の内容以外にもリファクタリングした方がいい箇所が多々ありますが、無視してください。
func1() がオリジナルで、func2() と func3() がリファクタリングしたものです。

package net.sinrpoject.lesson;

public class Example {

	public static final String TEXT_OK = "OK";

	public enum Status {
		Undefined
		, OK
		, NG
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		func1();
		func2();
		func3();
	}

	public static void func1() {
		String value = "OK";

		if (value.equals("OK")) {
			System.out.println("OK!");
		}
		else {
			System.out.println("NG!!");
		}
	}

	public static void func2() {
		String value = TEXT_OK;

		if (value.equals(TEXT_OK)) {
			System.out.println("OK!");
		}
		else {
			System.out.println("NG!!");
		}
	}

	public static void func3() {
		Status status = Status.OK;

		switch (status) {
			default: throw new IllegalStateException("Case not defined: " + status);

			case OK:
				System.out.println("OK!");
				break;

			case NG:
				System.out.println("NG!!");
				break;
		}
	}
}

func1() では value に直接文字列 “OK” を代入し、 equals() により “OK” という文字列と等しいかを判定しています。このようにコードに直接書かれた文字列を「文字列リテラル」といい、数値は「数値リテラル」といいます。リテラルがコード中に存在すると、入力ミスにより「等しいはずなのにfalseが帰ってくる」と、実装したプログラマはバグを産んだ自覚もなく「自分は間違ってない!」という妄想からデバッグにハマることが有ります。また、システムに変更が必要になった場合、同じことをが書いてある箇所をすべて修正しなくてはいけなくなり、修正の際にまたバグを産んでしまう可能性が高いです。よって、これらのリテラルを全て排除しましょう。

通常はリテラルを func2() のように定数化、つまり static final フィールドにします。でもこれって、多分フラグみたいに使ってて、”OK” でなければ “NG” か null か空文字みたいな利用のされ方をしていると思います。それでしたら値の種類が想定されているので func3() のように enum にして switch で処理を分岐したほうががよいでしょう。

今回はここまで!

ではでは!

Leave a comment

Your email address will not be published.

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)