【JAVA】硬いコーディング

みなさんは、いつもif文やcase文など何気なく書いていませんか?

変数 code が 1001 のときはメソッド methodA を呼び出す。
変数 code が 1002 のときはメソッド methodB を呼び出す。

上記のような条件があった場合、多くの人は

if (code == 1001) {
	methodA();
} else if (code == 1002) {
	methodB();
}


とするのではないでしょうか?


■else を認めない



今回は、『絶対に else を認めるな』というお話です。

これはある現場であったコーディング規約なのですが
必ず下記のように記述をする必要がありました

if (code == 1001) {
	methodA();
} else if (code == 1002) {
	methodB();
} else {
	throw new SystemException("不正なコード値が渡されました。" + code);
}


つまり、if、else if の部分で想定している条件すべてを明確に記載し、
else 文では必ずシステム例外を投げるというものです。


多くの現場を見てきましたが、このように else で
システム例外を報告しているところはありませんでした。


■メリット


この、一番のメリットは、
 不具合があった場合、絶対に見逃すことが無い
ということだと思います。


上のコードを少し改造してみます。


public int test(String strCode){
	int code = 0;
	int ret = 0;

	try {
		code = Integer.parceInt(strCode);
	} catch (NumberFormatException e) {
		new SystemException();
	}
	
	if (code == 1001) {
		ret = methodA();
	} else if (code == 1002) {
		ret = methodB();
	}
	retrun ret;
}


ハイライトの部分が不具合です。

この場合、変数 code には想定外の0が渡ってきます。
ですが、しっかりと else を記載していないので処理が継続してしまい
戻り値に 0 を返してしまいます。

上の例では、例外があがらないため
このような処理が連鎖してしまうと不具合が見つかったとき
どこが不具合の原因なのか非常に見つけにくくなります。

もしかしたら、何年のもの間不正な処理が繰り返されているかもしれません。



■その他のメリット

それ以外にも
 ・else を認めないためテストデータも必然的に正しくなる。
 ・運用時に例外発生した場合でも原因究明が早急に行える。
 ・後から参画したメンバーにも分岐条件が誤解なくはっきりとわかる。
などなど、沢山のメリットがあります。

始めは面倒くさいと思うかもしれませんが、
この甘みを知ってしまうと癖になるコードです。

ぜひ、みなさんも試してみてください。

タグ:java


参考になりましたらクリックしていただけると励みになります。



posted by てる。 at 23:47 | Comment(0) | TrackBack(0) | 【JAVA】覚えて得する TIPS | このブログの読者になる | 更新情報をチェックする

【JAVA】nullでもインスタンスでも無い状態!?

今回の記事は少し難しいかもしれません。
その上、結構マニアックな話です。覚悟してください(笑)

会社の上司や先輩などにデザインパターンを習えといわれたことはありませんか?

デザインパターンの中にシングルトンパターンというものがあります。

今日はシングルトンパターンというもののTIPS的なお話をしたいと思います。
もし、シングルトンパターンというのを知らない方は上のリンクを参照してみてください。
簡単に言うと1つしかないという意味です

参考書などを見るとシングルトンパターンの例が下のように記載されていることがあります。
でも、実はこれ厳密にいうと間違いなのです。

さて、どこが間違えているかわかりますか??


private static Singleton instance;

public static Singleton getInstance() {
  if (instance == null) {
    synchronized(Singleton.class) {
      if (instance == null) {
        instance = new Singleton();
      }
    }
  }
  return instance;
}

まずは、上のソースの解説をしたいと思います。

4行目でSingletonのインスタンスが生成されているかを確認します。

5行目では、インスタンスが未作成の場合、他のスレッドからSingletonの
インスタンスを生成されないようロックをかけています。

6行目では、もう一度インスタンスが作られていないかを確認しています。
これは、4行目の条件判断の最中に別のスレッドでインスタンスを作成されていないということを確認するためです。

7行目の処理は、ロックもしているし、他のスレッドからインスタンスが作成されていないので
安心して自分が代表者になって唯一のインスタンスを生成!

という考えの基に書かれたコーディングです。


理論上正しいように思えるのですが、実際は違います。


なんと、nullでもなくインスタンスでも無い状態がJAVAにはあるのです。

すごく簡単に説明すると

1.instanceはnullである。
2.instanceをnullからインスタンスへ書き換えるため「null」という状態をはずす。
3.instanceはインスタンスですよとあらためて登録する。

ということをしているのです。

つまり、別のスレッドが2の状態で6行目のif文を通過し、
インスタンスを生成してしまうことがありえるのです。


では、シングルトンパターンは実際には実装できないのでしょうか?

気になるかたは、下記のリンクを参照してみてください。
もっと詳しく書かれています。
http://www.ibm.com/developerworks/jp/java/library/j-dcl/



参考になりましたらクリックしていただけると励みになります。



【JAVA】参照渡しと値渡し Part2

前回の記事からだいぶ時間がたってしまいました。。。
すいません。


さて、続きのお話です。


前回の宿題の答えですが、
『テスト』と出力されるのが正解です。


むむむ??

Stringはオブジェクトなので参照渡し。
つまり、机の上のリンゴをミカンに取り替えたということになり
『ほげほげ』が出力されるのでは??
と考えてしまいがちです。




では、なぜなのかそうなるのか?


一見机の上のリンゴをミカンに取り替えたように思ってしまうのですが、
実は机ごと変わってしまっているのです。

つまり、

山田君の机の上にリンゴがあります。
佐藤さんの机の上にはミカンがあります。

席替えがあり山田君の机の位置に佐藤さんの机が移動になりました。

では、山田君の机の上には何がありますか?

そう。『リンゴ』です。


つまり、前回の例では上のような操作が行われているのです。


厳密に言うと参照渡しはこういう意味です。

山田君の机の上にリンゴがあります。
山田君の机の上のリンゴをミカンに取り替えます。

では、山田君の机の上には何がありますか?


JAVAの用語を使うとどういう意味となるかというと
『オブジェクト(山田君の机)の状態(机の上にあるもの)が変わるとき』




コードで書くとこんな感じです。



public class Sample {

    public static void main(String[] args){
        Bean bean = new Bean();
        bean.setValue("テスト");
        test1(bean);
        System.out.println(bean.getValue());
    }

    public static void test1(Bean bean) {
        bean.setValue("ほげほげ");
    }
}

class Bean {

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}




結論を言うと、参照渡し、値渡しという意味は上のようになりますが
不具合を埋め込まずコーディングするという目的を果たすためには
厳密に意味を理解するよりはオブジェクトの状態(持っているもの)を変えてしまうと
影響があるんだ程度に覚えておけばよろしいかと。




参考になりましたらクリックしていただけると励みになります。



×

この広告は180日以上新しい記事の投稿がないブログに表示されております。