[要約]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句を予想外のケースの検出と報告に使っているか
- フォークスルーを使っていないか
このエントリーをはてなブックマークに追加
Takatomo Honda avatar
About Takatomo Honda
システム開発 / プロトタイプ開発 / 開発組織の構築 / アプリケーションの内製化 /等、お気軽にご相談ください。