IF文に書く条件文の記述順序・・気にしてますか?

このエントリーをはてなブックマークに追加

先日、あるソースコードをレビューする機会があり、その際に考えさせられたことを記載します。

プログラマなら、誰しもが多用するIF文のことになります。

このIF文に記述する条件文ですが、下の例ように個々のプログラマの考え方もしくは趣味趣向により「条件文の記述順序」、「条件文を肯定式から組み立てる」、「条件文を否定式から組み立てる」ということが日常的に思考され世の中のプログラムコードが生まれているものと思います。

また、このIF文の「条件文の記述順序」、「条件文を肯定式から組み立てる」、「条件文を否定式から組み立てる」といった記述思考はプログラマの自由でもあると思います。

例)肯定 太郎くんの考え方
「俺は、イコール判定(何々である判定)が好きだから、イコールを最初に記載するようにしている」

例)否定 花子さんの考え方
「私は、ノットイコール判定(何々でない判定)が好きだから、先ずはノットイコール判定を書いてしまう」

しかし、今回遭遇したソースコードにおいては、エンドユーザーの思い(心理要望)を組み入れて条件の優先順位を記述すべきと判断しました。
今回の事例を少し味付けして架空のエンドユーザーに見立てて、下記の課題で説明したいと思います。

 

【顧客から要望された課題仕様】

(仕様1)
生産ラインで稼働する製品品質評価システム(以降、評価システム)がある。

(仕様2)
この評価システムで製造された製品が検査評価され、個々の製品に対して「品質区分」という
 変数に以下の品質結果(値)が返される。
 
  0:正常品(出荷可能)
  1:要検査(再検査が必要)
  2:部品確認(部品欠落の可能性あり)
  4:不良品(確実に部品欠落あり)

(仕様3)
「品質区分」の値別にそれぞれの処理(正常品処理、要検査処理、部品確認処理、不良品処理)を実施させたい。

(仕様4)
本処理の評価判定で「品質区分」が0(正常品)に該当した製品のみ出荷対象として、次のサブシステムへ連携したい。また、間違いなく正常品のみ出荷対象となるようにして欲しい。(誤って正常品以外の状態の物が次のサブシステムへ連携することは許さない)

 

★ プログラマAさんの記述した「IF文」

If ( 品質区分 = 0 )Then
  ”正常品”の対応処理を実行する。
 
ElseIf ( 品質区分 = 1 )Then
  ”要検査”の対応処理を実行する。

ElseIf ( 品質区分 = 2 )Then
  ”部品確認”の対応処理を実行する。

Else
  ”不良品”の処理を実行する。

End If

 

★ プログラマBさんの記述した「IF文」

If ( 品質区分 = 4 )Then  
  ”不良品”の対応処理を実行する。
 
ElseIf ( 品質区分 = 2 )Then
  ”部品確認”の対応処理を実行する。

ElseIf ( 品質区分 = 1 )Then
  ”要検査”の対応処理を実行する。

Else
  ”正常品”の処理を実行する。

End If

 

私見ですが、このエンドユーザー要望の場合「プログラマAさんのIF文」がユーザー要望(ユーザー心理)を配慮している記述になっていると判断します。

エンドユーザー側の立場で考えると、以下のような思考になるはずです。

「品質区分が0(正常品)の時の製品だけ、間違いなく消費者へ出荷したい。少しでも不良品側に属するような状態の物は、後のクレーム補償のリスクを考慮し、まずは一律で不良品として判別したい」

つまり、「品質区分=0」の時は、真っ先に「品質区分=0(正常品)」の判定条件を満たし「IF文条件群」を抜け出し、その後の判定ロジックを無視し、間違いなく”正常品”の処理を実行すべきと考えます。

「プログラマBさんのIF文」だと、品質区分が4、2、1の判定条件を正しく抜ければ間違いなく0(正常品)として処理されます。しかし、本番リリース後の長期に渡るシステムライフサイクルの過程で、前段の品質区分条件が誤った状態に修正をされると、本来真っ先に判定条件を抜け出して欲しいと考える「品質区分=0(正常品)」が正常に判定されなくなるかもしれないというハラハラ感があります。例えば、下のプログラマDさんのような改修が発生すると「品質区分=2(部品確認)かつ部品区分≠3」の状態が”正常品”として判定されてしまいます。もちろん、この改修を行ったプログラマDさんが確実に試験作業を行えば、この問題に気が付き適切な改修を行うものと期待はしますが・・・

★例えば、プログラマBさんの作ったロジックを、新人のプログラマDさんが誤って改修

If ( 品質区分 = 4 )Then
  “不良品”の対応処理を実行する。
 
ElseIf ( 品質区分 = 2 )And ( 部品区分 = 3 )Then
  “部品確認”の対応処理を実行する。

ElseIf ( 品質区分 = 1 )Then
  “要検査”の対応処理を実行する。

Else
  “正常品”の処理を実行する。

End If

 

【本記事の結論】
本システムの初期リリース時点においては、「プログラマAさんのIF文」と「プログラマBさんのIF文」は同じ機能を有し、同じ品質を有しているといえます。しかし、長年に及ぶシステムライフサイクルの過程で行われる保守メンテ改修を加えていくことで両者の「IF文」のコード形態が変わってくるはずです。前段でも述べましたが、IF文の「条件式の記述順序」、「条件文を肯定式から組み立てる」、「条件文を否定式から組み立てる」ということはプログラマの自由です。これは間違いありません。

私が本記事で述べたいことは、エンドユーザーの立場からみた要望仕様もしくは心理要望が見えた場合(読めた場合)は、これを考慮してプログラムコードを記述すべきではないかということです。

例えば、もし上述の課題でエンドユーザー側の心理要望が以下の場合、今度は逆に「プログラマBさんのIF文」が適切な記述方法といえるわけです。

「品質区分が4(不良品)、2(部品確認)、1(要検査)の時の製品を、それぞれの不良度合いに応じた改善対応部署へ間違いなく連絡し、相応の改善処置を要請したい。」

 

皆さまは、本記事を見られてどのように思われましたでしょうか?

 

 

【余談】
私なら、上述の課題を以下のように記述します。 最後のElseは将来の誰かが、誤って改修しても他部位に影響が出ないようにこのように考慮記載してしまいます。よく、同僚から「石橋を叩いて壊す」なんて言われる次第でして・・・(苦笑)

If ( 品質区分 = 0 )Then
   “正常品”の対応処理を実行する。
 
ElseIf ( 品質区分 = 1 )Then
  ”要検査”の対応処理を実行する。

ElseIf ( 品質区分 = 2 )Then
  ”部品確認”の対応処理を実行する。

ElseIf ( 品質区分 = 4 )Then
  ”不良品”の対応処理を実行する。

Else
  不明状態の処理を実行する。
        ※本ケースは理論上はありえないケースになります。

End If