五月二六日、火曜日の話
北朝鮮の核実験

 今朝の話題はこれで持ちきり。

[◆]北朝鮮の核実験

 いまさら、北朝鮮が核実験したところで驚きやしないのだが、どうしたもんだろうかねぇ。僕個人がいろいろ考えたところで何も出来ないけれど。

 核ミサイルは敵を殺すためにある。んでもって、北朝鮮の場合は報復目的として所持しているわけではない、と言うのが北朝鮮の危なっかしいところだろう。基本的に北朝鮮と敵対している国がない。アメリカとロシアのようにお互いにバランスを取ってくれる相手がいない。撃つぞ撃つぞと威嚇して救援物質をせびるために持っているようなもので、実のところ本当に撃ってしまうと後がないのは北朝鮮も同じな気がする。表面的な感想だけど。裏じゃどんなことを考えてるのかね。

 撃たない間が華である。撃ったが最後、報復攻撃にさらされれば北朝鮮は海の藻屑になる。ま、報復があるかどうかはどこに撃つかに寄るだろうけどね。日本なら報復はないかもしれないが、ま、流されやすい日本人なので一発打ち込まれたら戦争一直線かもしれない。

[◆]プログラミング

 今、少しプログラムの書き方で悩んでいる。

A?, B?, C? は真偽値を返す式である。! は真偽を逆転させる符号である。
== は左辺と右辺が同一であれば真を返す記号である。
パターン1
ef = 0; //Error Flag
if (!(A?)) {
  ef = 1; error;
} else {
  if (!(B?)) {
    ef = 1; error;
  } else {
    if (!(C?)) {
      ef = 1; error;
    } else {
      success;
    }
  }
}

if (ef == 1) {
  error_print;
} else {
  success_print;
}
パターン2
ef = 0; //Error Flag
if (!(A?)) { ef = 1; error; }
if (ef == 0) {
  if (!(B?)) { ef = 1; error; }
}
if (ef == 0) {
  if (!(C?)) { ef = 1; error; }
}
if (ef == 0) {
  success;
}

if (ef == 1) {
  error_print;
} else {
  success_print;
}

 パターン1とパターン2は結果として同じ動きをする。しかし、その過程は異なる。

 パターン1は各条件式を判定していき、一箇所でエラー判定が出ると残りの判定処理をすっ飛ばして最後の処理へと進む。処理としては素直な形になるだろう。対してパターン2は判定処理が区切られており、前の判定でエラーを起こしたかどうかを逐一チェックする形となっている。いちいちエラーを起こしたかどうかを尋ねるので、処理としては素直とは言えない。

 さて、素直さで言えばパターン1が有利であり、冷やかしは現在この形で作られている。構造としても実に分かりやすい、が、最近になって問題が出てきた。入れ子が多くなってくるとプログラムの柔軟性が急速に失われていくのである。上の例では判定式は三つしかないが、これが七個ぐらいになってくると一つの判定式の終わりがどこか、と言うのがぱっと見て分からなくなったりする。また、場合によっては一部の判定をしないで素通りしたい処理があったりして、素直なはずのコードが一瞬にして解体の難しい悩ましいものになってしまう。場合によっては、後続の判定式に影響を出したりしてちょっとつらい。

 この点、パターン2は柔軟性に富む。必要ない判定は簡単に素通りさせることが可能だし、判定の途中追加、削除も容易。判定式の終わりも非常にわかりやすい。ただし、逐一前の判定でエラーを起こしているかを尋ねる必要がある。この処理の負荷は気にするほど大きいものではないはずだが、どうなんだろうねぇ。

 なお、プログラムの世界には特定の場所から特定の場所へ処理をジャンプさせる、という機能があったりするのだが、それは使わないことにしている。便利は便利だけど、作った後、しばらくして修正が必要になった際、そうしたジャンプがあることを忘れていると悲惨な目に遭う事があるらしい。つまり、処理の流れが分からなくなるのである。こうしたプログラムコードをスパゲッティと言うが、なるべく自ら絡まりまくりのコードを書きたくないものだ。

 さて、日記に書いて考えをまとめてみたが……小さいプログラムならいいが、判定が多いプログラムではパターン2にしたほうがよさそうだ。実際、パターン1は既に問題が出ているわけだし。全てのプログラム大改造! パチパチパチパチ!