朝会発表テーマ

否定形について

■例

顧客マスタに案内メールを送信してよいかのフラグを追加する。送信して欲しくない顧客には送信しない。

  • mail_stop_flg : メール送信しないフラグ
    • 1 : 送信しない
    • 0 : 送信する

この場合、メールを送信してよい顧客を絞り込む場合、以下のようなパターンが考えられる

  1. mail_stop_flg = 0
  2. mail_stop_flg = FLG_SEND
  3. mail_stop_flg <> 1
  4. mail_stop_flg <> FLG_NOT_SEND
  • 2番目「メール送信しないフラグが、送信する、である」という訳になる
    送信しないのか送信するのか、混乱する
  • 4番目「メール送信しないフラグが、送信しない、ではない」という訳になる
    非常に分かりづらい

否定形の表現は分かりづらく、意味を取り違えてバグの原因となる。余り使わない方が良い

■例を修正

肯定形の言葉はわかりやすい。

  • mail_send_flg : メール送信するフラグ
    • 1 : 送信する
    • 0 : 送信しない

同様に、メールを送信してよい顧客を絞り込む場合のパターン

  1. mail_send_flg = 1
  2. mail_send_flg = FLG_SEND
  3. mail_send_flg <> 0
  4. 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(); // 検索

シンプルでわかりやすい。

■まとめ

客先から提示された仕様をそのまま設計したり、コードを書き直していたりすると陥りやすい。
設計・開発する際はわかりやすい表現に変えるのも大切。

※否定形が駄目だという訳ではない。適度に使う分には問題ない
※表現を変えることで元の意味と変わってしまう恐れもある。十分考えること
※判断に迷ったらレビューしてもらうこと

コメント