プログラマ ずんべ の日記

zunbe

プログラマ ずんべ の日記
プログラマ ずんべ の日記

探し物は見つかりましたか? サイト内検索を試してください。

配列名と変数名 配列名と変数名 Oracle 9i Oracle 9i

2005/07/16

【プログラミング】gotoを使おう

ずんべは、プログラムを書くとき goto をよく使う。
goto は諸悪の根源の様に言われるが、ずんべは goto を積極的に使っている。

たとえば、こんなコードである。

-----
int function(char * fname1, char* fname2)
{
  FILE* fp1;
  FILE* fp2;
  int ret;

  // コンストラクト

  ret = FALSE;
  fp1 = NULL;
  fp2 = NULL;

  // 本処理

  fp1 = fopen(fname1, "r");
  if (fp1 == NULL)
    goto DO_ERROR;

  fp2 = fopen(fname2, "r");
  if (fp2 == NULL)
    goto DO_ERROR;

  // その他処理

  ret = TRUE;

DO_ERROR:

  // デストラクト

  if (fp2 != NULL)
    fclose(fp2);

  if (fp1 != NULL)
    fclose(fp1);

  return ret;
}
-----

goto は、諸悪の根源だとよく言われる。
java では廃止されてしまったし、perlでも、昔から新バージョンでは実装されない可能性が囁かれている。
しかし、正しく使えば、構造化プログラミングどころか、オブジェクト指向に近いプログラミングが可能となる。

上記のコードがそうである。
このコードは、関数レベルでオブジェクト指向に近いコードを実現している。

■「コンストラクト」のブロック
関数内にあるオブジェクトを初期化している。

■「本処理」のブロック
実際の動作を行い、何か問題が発生すれば、処理を中断して「デストラクト」に飛ぶ。

■「デストラクト」のブロック
必要な終了処理をすべて行い、関数を抜ける。

gotoを使う事によって、関数レベルで「コンストラクト」「本処理」「デストラクト」という、オブジェクト指向の基本的な考え方が実現できている。

また、原則として、処理の流れは一直線に下に延びるので、コードの可読性が非常に高い。

更に、このコードは、メンテナンス性も高い。
たとえば、第3のファイル「fname3」が必要になったと仮定しよう。
プログラムの修正はこんな手順になる。

・引数および変数「fp3」を追加。
・「コンストラクト」ブロックに変数「fp3」の初期化を記述。
・「本処理」ブロックに変数「fp3」の処理を追加。
・「デストラクト」ブロックに変数「fp3」の終了処理を追加。

ネストをいじる必要もなければ、終了処理をいろいろなところで追記する必要もない。

もちろん、上記のコードがあらゆるパターンの開発に当てはまるとは思わないが、gotoも使い方によっては非常に有用である事を、言語仕様を策定する識者の方に知っていただきたいと思う。



このエピソードはいかがでしたか?

投稿者 zunbe : 2005/07/16 04:59:26


コメント

コメントしてください






保存しますか?


スパム対策:
この入力フィールドに「11」と入力してください。


プログラマ ずんべ の日記:ずばヒット アマゾン