■例
顧客マスタに案内メールを送信してよいかのフラグを追加する。送信して欲しくない顧客には送信しない。
- mail_stop_flg : メール送信しないフラグ
- 1 : 送信しない
- 0 : 送信する
この場合、メールを送信してよい顧客を絞り込む場合、以下のようなパターンが考えられる
- mail_stop_flg = 0
- mail_stop_flg = FLG_SEND
- mail_stop_flg <> 1
- mail_stop_flg <> FLG_NOT_SEND
- 2番目「メール送信しないフラグが、送信する、である」という訳になる
送信しないのか送信するのか、混乱する - 4番目「メール送信しないフラグが、送信しない、ではない」という訳になる
非常に分かりづらい
否定形の表現は分かりづらく、意味を取り違えてバグの原因となる。余り使わない方が良い
■例を修正
肯定形の言葉はわかりやすい。
- mail_send_flg : メール送信するフラグ
- 1 : 送信する
- 0 : 送信しない
同様に、メールを送信してよい顧客を絞り込む場合のパターン
- mail_send_flg = 1
- mail_send_flg = FLG_SEND
- mail_send_flg <> 0
- mail_send_flg <> FLG_NOT_SEND
最初の例と比べると、判定内容がわかりやすい
■プログラミングの例
name が空なら、初期化して検索
name が空でなければ、そのまま検索
if (name != null && name !="") {
search(); // 検索
} else {
setInit(); // 初期化
search(); // 検索
}
↓検索処理がどちらの場合も実行されるので外に出す
name が空なら、初期化して検索
name が空でなければ、そのまま検索
if (name != null && name !="") {
// 処理なし
} else {
setInit(); // 初期化
}
search(); // 検索
↓処理がないブロックができてしまうので、条件を逆にして1つにまとめる
name が空なら、初期化して検索
name が空でなければ、そのまま検索
if (!(name != null && name !="")) {
setInit(); // 初期化
}
search(); // 検索
name が空でない、ではない場合に初期化する・・・非常に分かりづらい(2回目)
同様に不具合を生む原因となる
↓ド・モルガンの法則を使用して肯定形にする
name が空なら、初期化して検索
name が空でなければ、そのまま検索
if (name == null || name =="") {
setInit(); // 初期化
}
search(); // 検索
シンプルでわかりやすい。
■まとめ
客先から提示された仕様をそのまま設計したり、コードを書き直していたりすると陥りやすい。
設計・開発する際はわかりやすい表現に変えるのも大切。
※否定形が駄目だという訳ではない。適度に使う分には問題ない
※表現を変えることで元の意味と変わってしまう恐れもある。十分考えること
※判断に迷ったらレビューしてもらうこと
コメント