いもづる オブジェクト指向

enumでわかりやすく安全に

真偽の二者択一はboolを使いますが、その他の択一選択肢は列挙型であるenumを使いましょう。

次のようにデータの有無で分岐する処理があるとします。

(1)

 1|    private const int DATA_ARI   = 1;  // データ無しステータス値
 2|    private const int DATA_NASHI = 0;  // データ有りステータス値
 3|
 4|    private void NanikanoSyori(int dataUmu){
 5|    
 6|        if(dataUmu == DATA_ARI){
 7|            // データが有る時の処理
 8|        }else if(dataUmu == DATA_NASHI){
 9|            // データが無い時の処理
10|        }
11|
12|    }

一応処理はうまく流れるかもしれません。。
しかし既にお気づきの通り、メソッドのパラメータであるdataUmuは、定数定義している 0, 1 以外も当然受け付けます。 そのことが考慮されていません。

というと、次のように修正する人がいます。(実話です)

(2)

 1|    private void NanikanoSyori(int dataUmu){
 2|    
 3|        if(dataUmu == DATA_ARI){
 4|            // データが有る時の処理
 5|        }else{
 6|            // データが無い時の処理
 7|        }
 8|
 9|    }

処理分岐は全てのintに考慮されています。。って、そもそもデータ有りの 1 を勝手に基準にしているだけで、1以外はデータ無しの扱いなの?? 逆に別の人は、データ無しの 0 を勝手に基準にしてしまって、データ有りの時に 2 を入れちゃうかもしれないし・・いやいやいや・・・・。

なんて、言い争うのはもうやめて、enumを使いましょう。そもそも間口が必要以上に広いのが問題の元。

(3)

 1|    // データ有無ステータス
 2|    private enum DataUmu{
 3|        Ari,
 4|        Nashi
 5|    }
 6|
 7|    private void NanikanoSyori(DataUmu dataUmu){
 8|
 9|        if(dataUmu == DataUmu.Ari){
10|            // データが有る時の処理
11|        }else{
12|            // データが無い時の処理
13|        }
14|
15|    }

このようにenumを使えばパラメータにはDataUmuで定義された2値以外が設定されることはあり得ません。よって安全、安心です。

この例は 有り/無し の2値ですが、それでも真偽でない場合はboolよりも効果があります。 意味をそのまま名前付けすることができるからです。なので、2値以上の列挙ならenumはいつでも効果を発揮します。
しかも、IDEでは型の後に "." を打つことで入力補完してくれます。正に列挙!

入力補完イメージ

(1),(2)での争い、問題を吹き払い、わかりやすく使いやすいenum、使わない手はありません。

 

webmaster@e-ioo.net