; Programming tips - 対称的 - #A Short cuts: [Prev] [Up] [Next] [Return to Top]

組になる処理はどこに置く?(May.05)

 前処理と後処理というのが良くある。開いたら閉じる、確保したら解放する、作ったら消す。で、

	Sub A()			|	Sub B()
		Open ....	|		... Close
		Call B ...	|
		...		|	End Sub
	End Sub			|
 なんてのがたまにある。非常に気持ちの悪いものと思う。
	Sub A'()
		Open
		...
		Call B'
		...
		Close
	End Sub
 という形なら綺麗だと感じる。要するに対になっている処理は対のままにして欲しいというただそれだけなのだ。

 こうしたからにはああしないといけないが、どこでやっているのだろう?
 という疑問は他人のプログラムを読んでいると良く出てくるものである。

 後で実に巧妙な処理がしてあって感心する場合もあるが、別の関数とかでぽろっと処理がしてあったりすると、本当にちゃんと呼ばれるのだろうか?と、心配になるものである。

 特にちまちました、うっかりしそうな処理が別関数だったりすると危ない。後処理を忘れるのである。
 最初の例で言うと、Call Bの前にCall Cを追加して、そのCのエラー処理か何かでプログラムが色々な事をやってて結局Closeしない、とか。
 修正したプログラマはCの上位関数であるAを見るのだが、A自体は特に後処理らしいものはしていない。だからそれで良しとしてしまう。

 プログラム自体もちゃんと動くから検査中にも発覚しない。怖いミスと言える。使っているうちに段々と動作がおかしくなる。作成元で問題を再現しようとしてもできない。<>
「再現しません」というタチの悪い障害を引き起こす事になる。

 A'のようにコーディングしてあれば、うっかり忘れる事は少なくなるはずである(と、思うけど)。少なくとも見ている方はああ、ちゃんとやってるなと安心ができる。

 対称性のある処理は対称性を保ったままコーディングすべき。

 という結論である。

#例が悪いかも。Open/Closeは普通は大丈夫。Windowsでは確保したメモリとかリソースの解放に失敗する方が怖いそうである。ちなみにSDK Helpには希に嘘が書いてあるそうなのでご注意の程

Short cuts: [Prev] [Up] [Next] [Return to Top]