[要約]CodeComplete 15章 条件文の使用
if文
正常なケースの実行文を先に書いてから、例外的なケースを書く
可読性とパフォーマンスの面で重要
if(){
##正常ケース
}
else(){
##例外ケース
}
正常なケースの処理はif文に書き、elseにはエラーコードが書かれるべき
正常ケースの実行パスが辿りやすい
等号や不等号による分岐が正しいことを確認する
>
と>=
の書き違えに注意
if文には意味のあるステートメントを書く
if文の内容が空であるような書き方は避ける
else句について検討する
- if文だけで済ませることはできないか
- 本当に必要な場合は50〜80%
- else句がいらない場合も空のelseを書いて中身にコメントを入れるやり方もある
else句の内容もテストする
見逃しがちになってしまう
if then else文
複雑な評価をブール関数の呼び出しで単純化する
評価文をブール関数に置き換えられないか検討する
BEFORE
if(inputChapter < SPACE){
....
}
else if(
inputChapter == ' ' ||
inputChapter == ',' ||
inputChapter == '.' ||
inputChapter == '-' ||
inputChapter == ']' ||
inputChapter == ')'
){
...
}
AFTER
if(IsControl(inputChapter)){
...
}
else if(IsPunctuation(inputChapter)){
...
}
最も一般的なケースを最初に評価する
- 出現頻度の高い順に
- 通常ケースを見つけやすいので、コードを読む量が少なくなる
すべてのケースがカバーされていることを確認する
エラーメッセージやアサーションのためにelse句を使う
他の書き方が言語でサポートしているなら置き換える
case文など
case文
最も効果的なcase文の順番
- アルファベット順または数字順
- 正常なケースが先頭
- 出現頻度の高い順
各ケースの処理は簡単にする
- 複雑になりそうならルーチンにする
- 簡単にすると読みやすくなる
caseを使うために仮の変数を使うのなら使わない
本当の変数を使用しているか
以下だとユーザ入力の1文字目、という使っているので正確に評価できない場合が存在する
たとえばcement overshoes
clambake
もcopy文になる
action = userCommand[0];
switch(action){
case 'c':
Copy();
....
default句ではその他扱いにするものだけを検出する
caseにできるならちゃんと分ける
default句をエラー処理に使う
if文と同じ法則に従う
case文のフォークスルーを使わない
- breakをちゃんと使う
- 意図的に使う場合はコメントを入れる
チェックリスト
if文
- 正常なケースはif句で処理されているか
- 等号と不等号の分岐は合っているか
- 正常なケースの条件文は明確か(空ではないか)
- else句はは空ではないか
- else句はテストされているか
elseif文
- 複雑な評価はブール関数でカプセル化されているか
- 最も頻度の高い処理が先に書かれているか
- 全てのケースをカバーしているか
- case文よりもこちらの方が適しているかチェックしたか
case文
- 意味のある順番で並んでいるか
- 各ケースの処理が単純に書かれているか(複雑になるならルーチン化する)
- 本物の変数を使用しているか
- default句を予想外のケースの検出と報告に使っているか
- フォークスルーを使っていないか