Orotund 物言わぬは腹ふくるるわざ




981101 

一目瞭然一知半解


 今回も他人のソースを修正したときの話です。

 2値のデータがありました。
 コードでは、True/False の Boolean 変数で保持しています。
 それをデータベースに格納する処理がこうなっていました。

Dim fValue as Boolean
...
rstSomeRecset!fldSomeFld = fValue * -1

 まぁ、たっぷり5分は考え込んでしまいました。急に -1 が出てくる理由がわかりま せん。
 しょうがないんで、そこは放置して他の処理を追っていくことにしましたが、しばらくたってやっとわかりました。
 VB の Boolean を数値として見ると、False が 0、True が -1 です。
 このプログラムでは、データベースの2値のフィールドには、True のときに1、False のときに0が入っています。
 つまり上の計算は、-1 を +1 に、0 を 0 に変換する処理だったのです。

 わかってしまえばなんてことのない処理であるとは言えますが、俺は、これは「トリッキーな処理」であると断言します。
 なぜかと言うと、True が -1 であるということを知っていないと、この処理は理解で きないからです。
 「"True = -1" は基本だ」というのは簡単ですが、それを知らない奴はコーディング してはいけない、というのは乱暴に過ぎます。
 Boolean の基本概念は真と偽をあらわすことです。True と False のどちらかしか とりえないのです。0 でも 1 でも -1 でもありません。
 ですから、

If fValue = True Then
rstSomeRecset!fldSomeFld = 1
else
rstSomeRecset!fldSomeFld = 0
endif

 とするのがあるべき姿です(*1)

 話の焦点がはっきりしませんね。
 プログラムは一目見て直ちに理解できるようでなくてはならない、と思うのです。

 俺はこんなのも嫌いです。

a = a Xor b
b = a Xor b
a = a Xor b
 これは、第三の変数を介さずに二つの値を入れ替える処理ですが、こんなものをなんの情報もなしに見せられて直ちに理解できる人は多くないでしょう。
 確かに処理スピードは速いでしょうが、人を選びますから、メンテナンスの障害になります。かと言って、
Dim buf
buf = a
a = b
b = buf
 という愚直なコードも考え物です。ここは是非、
Sub Swap( ByRef a, ByRef b )  (*2)

 という関数を用意していただきたい。その中で、上の様な Xor を使った処理をするのなら、それは構わないと思います。"Swap" という関数名が内容を表しているからです。

 VB には型宣言文字というのがあります。例えば、

Dim strBuf$

 の "$" です。変数宣言の際に、変数名の末尾に一定の記号をつけることによって、その変数の型を規定するものです。上の宣言は、

Dim strBuf As String

 と同じです。
 この辺から、個人の好みになってきますが、俺はこれが嫌いです。5つも6つもある上、記号との関連に必然性がないため覚えられないからです(*3)
 自分のモノグサを正当化しようって気はないのですが、これを覚えた後でないと読め ないソースってのがありうる訳です。これは初心者を直ちに排除します。
 こういう、人を選ぶコーディングは避けるべきだと思います。

 多少ソースファイルが大きくなろうが、スピードが低下しようが構わないじゃありませんか。このご時勢、最大の金食い虫は人件費なんですから。チャチャっと仕事が片付く方法を選びましょう。
 趣味のプログラミングも同じです。

a = a Xor b
b = a Xor b
a = a Xor b

 が、値交換の処理だってことを1ヶ月後まで覚えているって保証は何処にも無いんですから。
 翌日以降の自分は他人だと肝に銘じましょう。





*1: 更に言えば、

rstSomeRecset!fldSomeFld = fValue

 とできるように設計するべきです。
*2: 概念を示すため変数型の宣言を省いています。
*3: DefStr とかいうステートメントもあります。





“Orotund”のページに戻る
ホームページに戻る

omot.otomo@nifty.ne.jp(O友)