elseの無いif
次のように関数の中身全てがelseの無いifで囲われている場合がある.
void hoge(parameters)
{
if(condition){
// やたらと長くてswitchやらifやら混在した処理
}
}
これは,将来的にelseが追加される可能性があるけれども,現状はこうした方がすっきりする.void hoge(parameters)
{
if(!condition){
return ;
}
// やたらと長くてswitchやらifやら混在した処理
}
もちろん,やたらと長い部分も関数に切り分けるなり何なりするべきだけど,とりあえず,条件が満たされなければそれ以降の処理が実行されないのだから,その時点で関数を切り上げれば良い.だいたいこういう書き方をする場合って,ポインタがnullptrの場合に落ちないようにするための安全策だったり,と念のための対処だったりするので,elseが後から追加される可能性も低い気がする.
ifとelseで重複するswitch
void hoge(parameters)
{
if(condition){
switch(parameter1){
case A:
break;
case B:
// 以下延々と続く
}
}else{
switch(parameter1){
case A:
break;
case B:
break;
// 以下延々と続く
}
}
}
この場合、処理の内容にもよるけれど、少なくとも次のようにifとswitchの関係を入れ替えた方が楽な気がする.
void hoge(parameters)
{
switch(parameter1){
case A:
if(condition){
}else{
}
break;
case B:
if(condition){
}else{
}
break;
// 以下延々と続く
}
}
これだと、switch文へのcaseの追加は1度で済む.最初の形だと、両方に追加する必要があるから、caseが増えるにつれ、追加忘れが発生する可能性が高くなる.そもそも、そんな長い関数を作るな、と言われそうだけど.あとは、各caseの内容を関数に切り分けるのも良い.
処理の内容次第では、テーブルにデータを入れておいて、caseで必要なテーブルにアクセスする、という形にすれば更にすっきりする.
void hoge(parameters)
{
// データを引っ張ってくるためのテーブル
unsigned table[CASE_NUM] = { ... };
// 実引数が想定外の場合の対応
if(parameter1 >= CASE_NUM)
return ;
unsigned value = table[parameter1];
}
他にも何かあった気がするので、思い出したらメモしていこう.そのうち後輩とかに教えるのに役立つかも.