月曜日, 7月 08, 2013

プチクイズ 3 - C++の列挙型

Q.

以下のC++コードのリファクタリングすべき点を述べよ.

enum { ELEM1, ELEM2 } ENUM_1;
enum { SUN, MON, TUE, WED, THU, FRI, SAT };

void ShowEnumVal(int e) {
    cout << e << endl;
}

A.

列挙体に関しての2つのDON'Tを直す必要がある.
1つはplain vanilla enumを使用している点,2つは関数がEnum型ではなくintを引数の型としている点である.
上記コードはコンパイルもランタイムも問題なく動くが,非常にリスクの大きいコードである.
なぜなら関数ShowEnumVal()は本来,オブジェクトとして全くことなる(として扱うべき)2つのEnumを受け入れてしまう点である.各enumはtypedefを用いてコンパイルに明示的に違う型のように扱ってもらうべきであり,関数ShowEnumVal()も,その関数が扱うべきenumオブジェクトだけを受け入れるべきである.
上記2点を修正したコードは以下の通り.

typedef enum { ELEM1, ELEM2 } ENUM_1;
typedef enum { SUN, MON, TUE, WED, THU, FRI, SAT } DAY_OF_WEEK;

void ShowEnum1Val( ENUM_1 e ) {

 cout << e << endl;

}

0 件のコメント: