BLOG

【Java研修】まるの記録2

こんにちは。まるです。
この所急に寒くなったなと思っていたら今日はそこそこ暖かいですね。
気温が不安定な時期ですので、皆様も体調を崩さないようお気を付けください。

さて、今回は「マジックナンバー」というものについてです。
今回の研修で初めてこの言葉を知ったので、取り上げてみたいと思います。

マジックナンバーとは

名前の響きは随分可愛らしい感じがします。
検索検索・・・。

マジックナンバーとは…
コンピュータプログラムのソースコードなどに直に記述された数値で、その意味や意図が記述した本人以外には自明ではないもの。
引用元:IT用語辞典 e-Words

ふむふむ。
今回もコードで見てみましょう。

public class Main {
	public static void main(String[] args) {
		//名前入力
		System.out.println("名前を入力してください");
		String name = new java.util.Scanner(System.in).nextLine();

		//入力された名前の文字数チェック
		if(name.length() > 10) { //←マジックナンバー
			System.out.println("名前は10文字以下で設定してください。");
		} else {
			System.out.println("名前の設定が完了しました。");
		}
	}
}

上記のコードでは、名前のキーボード入力を受け付け、受け取った値についてif文でチェックを掛けています。
マジックナンバーに該当するのは、8行目に書かれた”10″という数字です。

いやいや “10” って急に出てきたけど何の数字…?
ってなりますね。

今回のコードはとてもシンプルなので、コメントや下の”名前は10文字以下で設定してください。”という文言を見れば、
何となく「名前の文字数制限で使ってるんだなあ」と察して頂けるかとは思いますが、
それにしても少し分かりにくい…。

書いた本人はすぐ分かったとしても、他のプロジェクトメンバーにとって分かりにくいコードは避けたいところですよね。
ちなみに私は記憶力にあまり自信がないので、自分が書いたコードであっても時間が経って見直したら「何コレ???」となる可能性が大いにあります。

このように、コードの可読性を下げてしまうのがマジックナンバーというもの
全然可愛くなかったですね。

解決方法

それでは、先ほどのコードを修正してみます。

public class Main {
	public static void main(String[] args) {
		//名前入力
		System.out.println("名前を入力してください");
		String name = new java.util.Scanner(System.in).nextLine();

		final int MAX_NAME_LEN = 10;	//名前の最大文字数

		//入力された名前の文字数チェック
		if(name.length() > MAX_NAME_LEN) {
			System.out.println("名前は" + MAX_NAME_LEN + "文字以下で設定してください。");
		} else {
			System.out.println("名前の設定が完了しました。");
		}
	}
}

if文の前に名前の最大文字数を宣言しています。
“MAX_NAME_LEN”という名前を見るだけでも意味が通じるので、先ほどよりも記述量は増えたものの分かりやすくなりました。
最大文字数を超えてしまった場合のエラーメッセージも “MAX_NAME_LEN” を使うようにしたため、
仮に「名前の最大文字数を20文字に変更しよう!」となっても7行目の数字を”20″に変更するだけで済みます。

また、名前の最大文字数には定数を使ってみました。
定数は、最初に設定した初期値を書き換えることが出来ない変数です。
今回のような制御に使う設定値など、後々処理の中で変更を加えるとは考えにくい値を定数とすることで、誤った値変更を防ぐことが出来ます。
定数は、変数の宣言文の先頭に”final”を付けて宣言します。
定数名はすべて大文字を使って命名するのが一般的です。

所感

実際にコードを書く際には、正しい構文で書けて正しい動きとなるかということにばかりに目を向けてしまいがちなので、
今後は他の人が読んでも理解しやすいという点にも意識を向けたいと思います。

今回はここまでです。
有難うございました!

BLOGトップへ戻る