Short cut: [Prev] [Up] [Next] [Return to Top]
Not True <> False (1996.Nov.10)
さて。いきなりコード。
Function hex(s As String) As Integer
hex = Instr("0123456789ABCDEF", s) '"s" must be char
End Function
.... '何かプログラムがある
If hex(ch) Then
.... 'Then部
Else
MsgBox "Not a Hex!" 'Else部
End If
.... '何かプログラムがある
「Falseの値は0, 0以外はTrueとみなす」というVBの仕様を利用した小粋なプログラム……。
だがちょっと待て。このコーディングには問題がある。
変更する時にトラブルのだ。
1. Then部の処理が不要になった。
じゃぁってんで
If Not hex(ch) Then MsgBox "Not a Hex!"
これがまともに動かなかったりする。
2. 書き方を変更しようとした。
If hex(ch) = True Then
こいつも動かない。なお悪い事に
If hex(ch) = False Then
はちゃんと動く。
3. 条件が追加になった。
If hex(ch) And foo() Then
これが一番タチ悪い。何せ動いたり動かなかったりするのだ。
理由はもう分かっていると思うが、VBのAnd, Or, Notとかは論理演算じゃなく、ビットの演算であるため。
そりゃぁIf iFlag And 2 Then MsgBox "Bit1 = 1"という処理ができるためにはそうでないと困るんだが、上に書いたようなトラブルにはまると「見掛け上は
問題なし」なので恐らく非常にデバッグし辛いものとなる。
従って:
True, Falseを後で判断する必要がある場合、その変数または関数は
True, False以外の値に「絶対に」ならないようにコーディングする。
|
---|
古いコードでそうなってないものがあれば、しつこいぐらいにコメントを入れておくこと!使っている所全てにコメント入れてもまだ足りないぐらいかな。
#「この関数がTrueを返す時のTrueはどれだっけ?」という訳の分からない事で悩むのはいやだと思うけどな
PS. どうしてもやりたければ、こんな感じで逃げる
Const ISOK = 0
Const ISERR = 1
Const ISABC = 2
...
If foo(x) = ISOK Then ...
曖昧な(ことがある)True/Falseでなく、自前で作った定数と比較する訳です
追記:VB 4.0になって変数にBOOL型が追加されましたね...本文は3.0e以下用です
Short cut: [Prev] [Up] [Next] [Return to Top]