@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- PR -

なぜ「GOTO文」を使っては、いけないのですか?

投稿者投稿内容
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-04-26 18:16
皮肉なもんですが、setjump()/longjump() の場合、ダメだと言われてる「グローバル変数」
jmp_buf を使うしかない。。。ローカル変数にすれば、あり得ない番地に jump する事となり、
必ずメモリを破壊してしまう。理論がどんどん現実に崩されつつありますが、、

そして、仮に goto 文の後に jmp_buf ・・・具体的にはレジスタ、グローバル変数
にアクセスできれば、特定関数外に飛ぶ事も可能かと。

このレベルでは、もうソースが読みにくい=「必ず読みやすく書く」という個々人の主観が
ある方向に集束した「理想」云々以前に、ある概念を実現する仕組みとして必ず
「やらなければならない」レベルのもので、ここで他人の読みやすさまで考慮していると、
マルチタスクでコンピュータが動かなくなる、致命的な問題に飛び火する事になるでしょう。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-27 11:59
引用:

コブラさんの書き込み (2004-04-26 18:16) より:
このレベルでは、もうソースが読みにくい=「必ず読みやすく書く」という個々人の主観が
ある方向に集束した「理想」云々以前に、ある概念を実現する仕組みとして必ず
「やらなければならない」レベルのもので、ここで他人の読みやすさまで考慮していると、
マルチタスクでコンピュータが動かなくなる、致命的な問題に飛び火する事になるでしょう。



話がずれていますが、結構重要な話と思いますので、相乗りです。(って何時も脱線ですが)

コブラさんに似た発言は別スレッドでもあって、個人的に悩まされました...
「読み易い」が何を指名しているのかコブラさん、私に限らず全員にとって難しい所と思います。
実際には考える事自体、殆ど無いでしょうが、ただ「読み易い」を解かなければ、
「アーキテクチャー」への道のりは程遠いかな...と考えます。


例えば、要求で下記の内容を受けたとします。

 要求:(予算)を(従業員)で割って(個人別予算)を出す。

 プログラムで表現するには、「個人別予算←予算÷従業員」ですね。
 でも、ここには、「端数をどうするのか?」、「従業員が0の場合どうするのか?」と言う、
 暗黙的な考慮が必要です。

 さて、ここから問題です。この除算の暗黙的な考慮点を明示的にする場合、
 部品で如何様に表現し、今後この部品をどの様に管理しますか?

   1.バカでも開発出来る構成にする場合

     (1)システム内の端数処理は四捨五入に統一
     (2)システム内の除算で除数が0の場合、0を返す。

     Function 除算関数 (被除数,除数) AS Long


   2.端数処理、0除算を明示指定しないとエラーにする構成にする。

     Function 除算関数 (被除数,除数,端数処理区分,0除算エラー区分) AS Long


 そして、次にこれをどの様に開発者へ説明するかです。

   1.使い方と結果のみ
   2.1番+「端数をどうするのか?」、「従業員が0の場合どうするのか?」の問題を提示
   3.2番+内部構造説明

以上が私の考えれるパターンですが、例題が簡単過ぎて「アホか!」と思うかもしれませんね...
これがDB制御部品、エラー制御部品、画面制御部品となると話が深刻化します。

結局、現在の「簡単に表現する」とは、表現が悪いですが伝わり易い表現を用いると
「バカでも開発出来る」構成にする事では無いでしょうか?
つまり、関数の構成は1番、管理方法も1番です。

これは「理屈を知って利用する」という、
多くの技術者が考えていた技術の在り方が破綻してきているのでは無いでしょうか。
と言うより既に十分破綻しているので、肯定的に「理屈を知らなくてもよい」と考え、
その手段を確立させる必要があるのかもしれません。

って事は、このスレッドの根本的な趣旨である基本的な事を議論するのも失敗か?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-27 12:51
引用:

はにまるさんの書き込み (2004-04-26 17:47) より:

setjmp/longjmp って データベース で言うロールバッグ機能と同意義では無いでしょうか?


違います。

引用:

MSDNより:
一般に、これらの関数は、通常の呼び出し規約や復帰規約に従わずに、以前に呼び出したルーチンのエラー処理コードまたは回復コードに実行制御を渡すときに使用します。


ここで「回復コード」とは、「エラーからの回復」を意味しており、データの回復ではありません。
引用:

Solaris 2.5.1 setjmp(3C)より:
These functions are useful for dealing with errors and
interrupts encountered in a low-level subroutine of a pro-
gram.
コード:

#include <stdio.h>
#include <setjmp.h>
#include <signal.h>
#include <unistd.h>
jmp_buf env; static void signal_handler();

main() {
int returned_from_longjump, processing = 1;
unsigned int time_interval = 4;
if ((returned_from_longjump = setjmp(env)) != 0)
switch (returned_from_longjump) {
case SIGINT:
printf("longjumped from interrupt %d\n",SIGINT);
break;
case SIGALRM:
printf("longjumped from alarm %d\n",SIGALRM);
break;
}
(void) signal(SIGINT, signal_handler);
(void) signal(SIGALRM, signal_handler);
alarm(time_interval);
while (processing) {
printf(" waiting for you to INTERRUPT (cntrl-C) ...\n");
sleep(1);
} /* end while forever loop */
}

static void signal_handler(sig)
int sig; {
switch (sig) {
case SIGINT: ... /* process for interrupt */
longjmp(env,sig);
/* break never reached */
case SIGALRM: ... /* process for alarm */
longjmp(env,sig);
/* break never reached */
default: exit(sig);
})
}




このように、何らかの処理中に割り込みが発生した場合に、それからの回復手段を提供するのが目的で、ロールバックではありません。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-04-27 12:51 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-27 12:59
引用:

はにまるさんの書き込み (2004-04-23 11:22) より:

 あなたの答えは、今年技術者になった方の為の返答です。
 あなたの答えは、基礎技術を飛ばしてきた方の為の返答です。
 あなたの答えは、これから設計者を目指す方への基本的アドバイスです。
 あなたの答えは、小難しい技術論に追われ簡単な説明を忘れた方の為の返答です。

では、教えてください。
なぜ「GOTO文」を使っては、いけないのですか?


1.処理の実行手順が整理されている
2.プログラムの流れがドキュメントに整理されて記述されている
3.ドキュメントとソースが一致している
4.ソース上の箇所を容易にドキュメント上で探すことができる
  または、質問がある都度、すぐにドキュメントを示すことができる
5.この2つをいつまでも(システムが代替わりするまで)自分で保守できる

という条件を満たせるなら、いくらでもgoto文を使ってください。


もう1パターン追加:
・それが経験に基づく先人の知恵である。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-04-27 13:06 ]
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2004-04-27 13:14
引用:

はにまるさんの書き込み (2004-04-27 11:59) より:

結局、現在の「簡単に表現する」とは、表現が悪いですが伝わり易い表現を用いると
「バカでも開発出来る」構成にする事では無いでしょうか?
つまり、関数の構成は1番、管理方法も1番です。




構造の問題は別として、GOTOに限らず、普通は使わないものならVerUP等で仕様から
外れていくものですが、やはり現に存在する以上、需要としてはあるのでしょう。
それと、マシン語レベルではjp等ジャンプ系の命令が無いとどうしようもなくなるの
は皆さん同意見かと。
で高級言語でも実行時にはマシン語レベルで動きますね。(中間言語というのもあり
ますが)そこでは、ソース上記述はされていなくても、ジャンプ系の命令で表現される
個所がかなりあるはずです。

で本題ですが、このような低級命令(マシン語に近い)をアプリに入れると一般的
には読みにくくなります。(もちろん読む側のレベルにもよりますが...)
SQLを組み込む場合でも、SELECT、UPDATE、INSERT、DELETEのみであれば書き方のみ
の問題で、ソース自体もそれほど複雑にはなりませんが、Fetchやカーソル制御という
ような低級な命令を使うと(使う事多いですが)、単純SQLにくらべてソースも複雑に
なりますね。ある意味読みにくくなるでしょうね。
XWindowのToolKitとLibralyでは構造がかなり変わるのと同じです(古い)。ですから
皮肉的な意味では、マシン語→低級言語(アセンブラ、C等)→高級言語(Basic、C、
Fortran等)→超高級言語(簡易言語)・・・設計書というように判りやすいと思う
人の数が多くなるものですね。同一言語内でも低級命令を屈指しているソースよりも
高級命令を使っているほうが読みやすいのではないでしょうか。

読みやすさ、判りやすさを絶対視するならGOTO、jump等の、低級命令はできるだけ避ける
事です。(もちろん使わなければならない場合もありますが。)
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-04-27 13:27
るぱんです。

何を持って「読みやすいか」?
を明示的に定義しないと意味がないと思います。

プロシージャ(メソッド)レベルで中で記述されている内容が
わかりやすいかわかりにくいかは理解できますけど、

「そのプログラムがないをやっているか」?については
全くわからないですよね?

見方の定義が欲しいです。
どんな片言でも、定義が無ければ、「同意権ですよね?」とした所で
落し先なんてわかりにくいですよ?
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-04-27 13:35
引用:

はにまるさんの書き込み (2004-04-27 11:59) より:
   1.バカでも開発出来る構成にする場合

     (1)システム内の端数処理は四捨五入に統一
     (2)システム内の除算で除数が0の場合、0を返す。

     Function 除算関数 (被除数,除数) AS Long


   2.端数処理、0除算を明示指定しないとエラーにする構成にする。

     Function 除算関数 (被除数,除数,端数処理区分,0除算エラー区分) AS Long
               :
               :
               :
結局、現在の「簡単に表現する」とは、表現が悪いですが伝わり易い表現を用いると
「バカでも開発出来る」構成にする事では無いでしょうか?
つまり、関数の構成は1番、管理方法も1番です。


「2.の仕様を満たすプログラムを作れないようなプログラマには作らせない」という選択もありだと思います。

ってゆーか、このスレで問題となるべきは、あるプログラムを作るにあたって、他人に理解できるようなものを作るかそれとも火星人語みたいなプログラムを作るか、であって、仕様まで変えてしまうというのはまた別問題なのではないでしょうか。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-27 14:08
引用:

Jittaさんの書き込み (2004-04-27 12:51) より:


やっと...提供頂いたC言語の解析が終わりました...(x x)
慣れない言語に意見するのは辛い(ってか、するな!)ですが、面白いですね。

割込等のメインフロー以外のフローを解決する際にalarm関数と併用すると楽チンよ!
っと言う事がサンプル文で解りました。
ロールバック機能と思ったのは淡い期待でした。
淡い期待は泡になって泡のお風呂はバブルス○ー
↑(無承諾引用、一般用語で「パクリ」です。きちさんごめんなさい。気に入ってしまって

スキルアップ/キャリアアップ(JOB@IT)