@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- @IT情報マネジメント 会議室 Indexリンク
- IT戦略
- 仕事の改善
- アーキテクチャ
- プロジェクト管理
- ITインフラ
- Webマーケティング
- BPMプロフェッショナル
- 業務アプリ
- - PR -
なぜ「GOTO文」を使っては、いけないのですか?
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-04-27 18:54
あれ、そうなんですか では、「てめ!スレッドの主だろ、人の意見を聞てんのか!」と非難を受けつつジャンプ投稿します。 GOTO わかりやすいソースコードってどんなもの? ###################################### # 編集-追記だよ〜ん(GOTO中止です! ###################################### あっちのスレッドに投稿しようと思いましたが、話の流れが異なるので 止めました。
当スレッドの議題で言えば、 GOTO文の性質、利便性、弊害性、問題視される背景を議論する際は、 「何を持って読みやすいか?」は不要で、 GOTO文を利用する際の対処を議論する場合に 「何を持って読みやすいか?」は必要ですね。 各自に御預けでも良いですが、ただ、何を持って「読みやすいか」?は、 それ程パターンが多く無いと思います。 一番多いのが「特定スコープで解り易い」と思います、後は 1.視覚的に見易い 2.全体が解り易い 3.詳細が解り易い 4.初心者にとって勉強し易い 5.記述し易い 等があると思います。 こう記述すると、何を持って「読みやすいか」?を議論する事は大切ですが、 しかし、これって翌々考えると完全にアーキテクチャーの世界ですね。 例えば「特定スコープで解り易い」とは、業務アプリケーションの流れを 理解する上で、誰が理解すべき流れかを分割し、「解り易い」を階層化する。 第1階層 業務フロー(ユーザが解り易い) 第2階層 機能フロー(SEが解り易い) 第3階層 システムソフトウェア制御フロー(PGが解り易い) 第4階層 システムハード制御フロー(言語で処理される) って感じですかね。また、これはこれで議論をしたものです。
その質問は、入力画面や複雑な画面制御を想像していませんか? テキスト入出力、単純な照会画面、バッチ処理では解り易い構成に出来ると思います。 入力画面や複雑な画面制御は、ユーザ操作が多数存在する関数の起動トリガーになり、 またOS制御も絡む為、分かり難くなる傾向はあると思います。 ん...何か言い方法があれば、また投稿します。
案外、それは強欲な発言かもしれません。 [ メッセージ編集済み 編集者: はにまる 編集日時 2004-04-27 19:01 ] [ メッセージ編集済み 編集者: はにまる 編集日時 2004-04-27 19:03 ] | ||||||||||||||||
|
投稿日時: 2004-04-28 00:23
提示された仕様を満たすプログラムを作れない人は少ないのでは無いでしょうか? もし「仕様」の意味合いに、関数毎の再利用性、信頼性、品質性を含めるのであれば、 私にそこまでの仕様を提示するレベルが無いので、逆にこっちが辛いです。
その縛りは個人的に無いです。 2004-04-27 11:59の話の元となった私の思考を砕いて説明すると、 複雑な制御を必要とする処理にて解り易さだけを追求する事が正しいのか?と言う事です。 ん〜別スレの方が良いのかな? でも、どれだけの人が「実際にアーキテクチャ興味があるのかな?」と疑問があり 一歩足を踏み出すのに躊躇します。 >仕様まで変えてしまうというのはまた別問題なのではないでしょうか。 ちょっと例が良くなかったですね、端数処理に関しては、確かに開発サイドで 一律で決める事は無いですが。考えさせない例として捕らえて下さい。 | ||||||||||||||||
|
投稿日時: 2004-04-28 09:15
こんにちわ。
GOTO文については経験上、いろいろ言いたいですが、(BASICで使ってましたから。。) とりあえず。 さっき見た記事で、 http://www.atmarkit.co.jp/fdotnet/vbcheer/vbcheer03/vbcheer03.html goto文の使いどころが見つかった・・・。 まあこういう場面は少ないとは思いますが。 | ||||||||||||||||
|
投稿日時: 2004-04-28 09:34
おはようさんです。はにまるです。
「なんで?」で終われば良いのですが、「なんで?」の議論で上がった 内容をまとめると、それが次の議題の土台になると思うのです。 「グローバル変数」「GOTO文」で議論をしていて ソースの記述云々て、ちょっとした注意点さえ付ければ後は別に良いのでは? その注意点とは構造、つまり関数/メソッド/クラスの切り方に影響するもので 関数/メソッド/クラスの切り方が確りしていれば、 多少の低い技術で記述されたソースも見易くなる傾向があるから、 関数/メソッド/クラスの切り方を議論した方が有益では無いかな????? と投稿せずに、傍観している人はいる筈です。 「そう、お前だ!」って、画像付きで表現出来たら面白かったな!
そうですね、キーワード化は必要ですね。 るぱんさんは、「きれいなソースを描くには」スレッドから議論していたので 「グローバル変数」を議論する事自体が当初、難しいかった事を知っていると思います。 今では当り前ですが、最初、私が議論したいが思いが伝わら無い状態ってありましたよね? ITアーキテクチャーで新たにスレッドを起すとき、この「今更グローバル変数の何を 議論するのだ?」という普通の技術者が持つであろう心の障壁をすり抜ける為に、 考えたキーワードが「なぜグローバル変数を使ってはいけないのですか?」です。 そして、スレッド達挙げ直後に、@ITでネームバリューを持つ方々が投稿という形で 賛同して頂いた結果、「ああ、そういう事を議論したいのね」と気付いて頂けた事で 「なぜグローバル変数を使ってはいけないのですか?」のスレッドが (私の思惑として)成功した理由と思います。 興味を持たせる、思いを伝える際は、キーワード化の技術は必要と思います。 って、キーワード化の技術レベル1の私が語っても、このレベルですが
そうですね、でもその「経験」を他人に譲りたくない強欲があるのです。 | ||||||||||||||||
|
投稿日時: 2004-04-28 11:29
まず、引用元は「setjmp(3C)」です。3はカテゴリで、Cライブラリを表し、Cはサブカテゴリで、Callなんだけど、なんのコールだったかな?Windowsでいうと、User32ではなく、kernel32の方、カーネル、コアに近い方を表しています。 このコードはsetjmp/longjmpの使い方の説明である、というのが第1原則です。ですから、「何かをする為のコード」ではありませんし、「何かができるコード」でもありません。あくまで「こうやって戻る箇所を定義し、そこでこうやって戻ってきたのかどうかを判別する。そして戻るときにはこうやる。そうすると、ここで指定した値がsetjmpの戻り値として受け取れる」ということを説明しています。 > 正直SIGINTとSIGUSR1(ユーザ定義のシグナル?)が > 何で発生するか解りませんでした。 失礼。「SIGUSR1」は、発生させれば発生するし、ハンドラを定義すれば受けられます。ハンドラ未定義の場合、このシグナルのデフォルト動作は「無視(ignore)」だったと思います。特にALRMとINTに限ったわけではない、使い方の説明と為のコードであるという為に出しました。 > Ctrlキー+Cで SIGINT が発生する????? SIGINTはインターラプトシグナルなので、Ctrl+Cで中断する為、SIGINTが発生します(イニシャライズシグナルではない)。 | ||||||||||||||||
|
投稿日時: 2004-04-28 11:49
ご返答(回答)ありがとうございます。 何とか理解出来たかなと思いつつ、C言語講座(?)を経由して思いました 業務系のみ経験された方、制御系(C言語)も経験のある方では 頭にあるフローパターンの数が異なる。 私は、業務系しか経験していませんので限られたフローパターンで話をしていました。 GOTO文の内容を纏める際、業務系の基本パターンで一旦纏め、 C言語講座で出てきた、割込等は別扱いにしようと考えています。 # 纏める程、議論はされていないと思いますが...どうしよ... 割込処理の概念は、私には関係無いかなと思っていましたが、 「印刷中断」「一覧中断」機能の実装の際は、割込処理の概念が大切ですし、 又、イベントドリブンは割込処理(って言って良いのかな?)が元になっていると 考えました。 GOTO文のスレッドとして一旦、話を区切った方が良いか、 様子見&纏めをして考えます。 # 提示して頂いたサンプルを読みをすと、setjmp/longjmp関数より、 # signal関数の概念に興味を持った次第です。 | ||||||||||||||||
|
投稿日時: 2004-04-28 12:53
# かなりUnixに特化した話になってしまっていますが...
signal(2) を「関数」と呼ぶのは間違いではありませんが、 ふつうは「システムコール」と呼びます。 # ()の中の数字はマニュアルのどの章に載っているかを示す。 # OSによって違いはあるが、第2章がシステムコールなのはたぶんUnixなら # みんな同じ。第3章には関数が入る。Solarisだとさらに章を細かく # 分けているが、分けていないOSのほうが多い。 # なんで章を示すのかというと、別の章に同じ名前で違うものが # 載っている可能性があるため。 signalとゆーのは... つまりは、コールバック関数です。 | ||||||||||||||||
|
投稿日時: 2004-04-28 14:36
そうですね。 VB 的に言えば、コマンドボタンが押されたときの処理が走っていても、テキストボックスをマウスでカチッとすれば 「txtHoge.GotFocus()」 が呼び出されますし。 (.NET では Enter イベントになっているのかな?) 「割込」 というか、「非同期」 と考えるといいのかもしれません。 (コレでヒドイ目を見たこともあります。苦笑) ちなみに、上記の例だと、signal で 「WM_SETFOCUS (先の例で言う SIGUSR1)」 という ”メッセージ” が、Windows から VB に送られてきて(いて、そこから自分のソースの GotFocus イベントが呼び出されて)います。 (って説明だといいのかなぁ…久しぶりなので怪しいです。間違ってたら訂正を。汗 <どなたか)
私も読みました。 「飼いならされた goto 文」 という表現に座布団一枚っ。 |