- 1 名前:デフォルトの名無しさん [2005/08/11(木) 11:18:15 ]
- 前スレ pc8.2ch.net/test/read.cgi/tech/1021364372/
- 282 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:01:20 ]
- それを言うとA_finishも変なネーミングだ
- 283 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:59:43 ]
- ファンクショントレースもgotoの話題にでてたけど、みなどうしてる?
ftraceコマンドとかあるみたいだけど、どうも共有ライブラリとかの ファンクションコールをうまくトレースしてくんないのよね。
- 284 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:21:39 ]
- あぁちょっと調べてみたら、valgrindとか色々ありそうやね。
- 285 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:46:36 ]
-
bool Init() { if (!InitHogeGraphics()) {goto FAILED_INIT_HOGE_GRAPHICS;} if (!InitHogeAudio()) {goto FAILED_INIT_HOGE_AUDIO;} if (!InitHogeInput()) {goto FAILED_INIT_HOGE_INPUT;} return true; FAILED_INIT_HOGE_INPUT: UninitHogeAudio(); FAILED_INIT_HOGE_AUDIO: UninitHogeGraphics(); FAILED_INIT_HOGE_GRAPHICS: return false; } こういう使い方もダメなのか?俺的にはスマートな方法だと思ってる 初期化が重なる場合でgoto文を使わない方法って何があるのよ
- 286 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:57:07 ]
- >>285
やりすぎかもしれんが・・・w こういうのも出来なくはないかもしれない、 気もしないでもない。 InitUninitFunc funcs[] = { {InitHogeGraphics, UninititHogeGraphics}, {InitHogeAudio, UninititHogeAudio}, ... }; bool Init() { for (int i = 0; i < NELEMS(funcs); i++) { if (!funcs[i].init()) { for (int j = i; j > 0; j--) { funcs[j].uninit(); } return false; } } return true; }
- 287 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:22:22 ]
- >>285
gotoいらないじゃん
- 288 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:25:46 ]
- >>287
別にgotoなんて無くてもいいんだが、分かりやすいことが重要じゃない? 極論すればwhile()だけで全ての制御構造は書けるわけだし。非常に面倒くさくなるけど。 >>285で、InitHogeAudioの引数の一つがInitHogeGraphicsの結果だったりするみたいな感じで からみあってたりすると結構面倒くさいんじゃない?
- 289 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:31:26 ]
- ほら、ここでもinit関数と、finish関数のAPI仕様の統一の必要性がでてきた。
「gotoは設計に関係ない」っていったやつでてこい。プログラムのアマチュア が設計だけして、実装まるなげは本当に排除すべきだ。
- 290 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:41:18 ]
- >>287
いやまぁ、さきの例はそれぞれのinitとuninitが関数だからそうだけど、 たとえば単なる値の設定とそれをクリアするのに関数を用意するのはバカらしい。 それならgoto使うとかいう選択は十分にあると俺は思うな。
- 291 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 07:48:56 ]
- >>267で結論が出た話を蒸し返してる香具師がいるぞw
- 292 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 08:07:30 ]
- >290 のように後出しジャンケンばかりやっている奴のコードは仕事に使えん
- 293 名前:デフォルトの名無しさん [2008/02/11(月) 08:15:32 ]
- >>285=>>263
- 294 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 08:51:09 ]
- 半端なinit/finishを繰り返す時点でダメダメ
- 295 名前:デフォルトの名無しさん [2008/02/11(月) 10:50:15 ]
- >>288
確かにまとめてひとつの関数にすれば数は少なくてすむが、 ラベルの数が多すぎるだろ。 >分かりやすいことが重要じゃない? 分かりにくいんだよ。 制御が入ると、その制御全部チェックしないといけないだろ。 それ、順番間違ったらそれだけでバグになるだろ。
- 296 名前:デフォルトの名無しさん [2008/02/11(月) 11:05:02 ]
- gotoなしで実現しようとすれば、
ラベルの代わりにフラグ変数を使うことになるだけじゃないか? -- int ret_code = 0; ret_code = !(a_init() ? A_FAILED : 0) && ret_code = !(b_init() ? B_FAILED : 0) && ret_code = !(c_init() ? C_FAILED : 0); switch(ret_code) { case C_FAILED: c_rollback(); case B_FAILED: b_rollback(); case A_FAILED: a_rollback(); } return ret_code; -- かつ、何らかの事情でinit()やrollback()を同一関数内に まとめて書く必要がある場合(式でなく文になる場合) こういうコードは書けないのでgotoするしかない気がする。
- 297 名前:296 [2008/02/11(月) 11:10:43 ]
- 見直すと意味不明なコードだが気にするなw
- 298 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:01:53 ]
- >>296
> かつ、何らかの事情でinit()やrollback()を同一関数内に > まとめて書く必要がある場合(式でなく文になる場合) どんな状況を言いたいのかサパーリわかりません。 ちゃんとした日本語か、仮でいいからCか、どっちかで書いてくれ。
- 299 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:02:31 ]
- >>288
これで「わかりやすい」と思うのは書いた本人だけだと思うぞ。
- 300 名前:デフォルトの名無しさん [2008/02/11(月) 12:05:02 ]
- つーか、UnInitって未初期化のことじゃないか
オマエラ本当にマなのか?w
- 301 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:12:09 ]
- >296 たぶん君は10万行以上のコード書いたことないでしょ。
それにチームでコードを書いた経験もほとんど無いように見受けられる。 素人はgoto避けたほうが身のためだよ。
- 302 名前:296 [2008/02/11(月) 12:16:53 ]
- gotoの代替手段があってそれがgotoより優れているならそうするw
でも>>267や>>286みたいに、goto回避を目的としたトリッキーなコードを書くくらいなら イディオムとして理解できるgotoは素直に利用する方がよっぽどわかりやすい
- 303 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:19:41 ]
- >267をトリッキーと感じる感性でgotoを濫用されちゃ話になりませんな。
- 304 名前:296 [2008/02/11(月) 12:21:26 ]
- >>298
簡単な例で言えば>>267のコードで hoge_implおよび*_initをインライン化する必要が出たら フラグをreturnしてswitchで受けるっていうのは無理だわな、 そんときはどうする?ってこと
- 305 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:21:45 ]
- >>267はgoto回避のトリッキーなコードというよりも、
APIから抜ける前にチェックを「確実に」入れるための簡単なtipsなのだが。
- 306 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:23:14 ]
- >>300
Get:UnGetと書くマがこの世に実在してだな… >>302 IDEでデバッグできる環境なら多少強引でもgoto回避したほうが追いやすいよ。
- 307 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:23:27 ]
- >>304 具体的に。
- 308 名前:296 mailto:sage [2008/02/11(月) 12:23:33 ]
- >>303
LABELを定義してgoto label するのと フラグ定数をdefine してreturn -> switch するのと何が違うんだ?
- 309 名前:296 [2008/02/11(月) 12:29:49 ]
- こんな感じかな
for (int i = 0; i < 10; i++) { if (x[i] == 0) { goto A_FAILED; } else { a /= x[i]; } for (int i = 0; i < 10; i++) { if (y[i] == 0) { goto B_FAILED; } else { b /= y[i]; } return 0; B_FAILED: something A_FAILED: something return -1;
- 310 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:29:50 ]
- 意図的に話をループさせて逃げようとしてますな
>>298に>>304で答えたことになると思ってんの?
- 311 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:30:23 ]
- >>308 >>305
- 312 名前:296 [2008/02/11(月) 12:32:26 ]
- 309をgotoを使わずに上手く書くのってどうする?
- 313 名前:296 [2008/02/11(月) 12:34:10 ]
- 要望にこたえて>>309に具体的に書いたので、
そちらも具体的なコードでよろしく 関数分割は無しな。 「美しい設計」にしたがって自由にリファクタリングできる業務なら 議論の余地なくgotoなんていらないだろ。ってかそんな環境ならC使わないし。
- 314 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:35:43 ]
- >>309 いいかげん同じようなコード書くのに飽きてきたよ。
int foo_impl() { for (int i = 0; i < 10; i++) { if (x[i] == 0) { return A_FAILED; } else { a /= x[i]; } for (int i = 0; i < 10; i++) { if (y[i] == 0) { return B_FAILED; } else { b /= y[i]; } return SUCCESS; } int foo() { //公開されるAPI switch (foo_impl()) { case B_FAILED: something case A_FAILED: something return -1; default: return 0; } で何がこまる?
- 315 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:38:16 ]
- どこまで条件の後付けを続けるのかしら…(´・ω・`)
- 316 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:38:19 ]
- >>313
お前な、はっきり言わせてもらうと、馬鹿じゃねーのか? 「goto使わずに、関数分割してリソース管理と処理本体を分離する設計にしろ、 そのほうがgotoでスパゲッティにせずにリソースの解放を確実に実行できる。」 という主張に大して「関数分割はなしな」じゃ議論から逃げているとしか 受け取りようがない。
- 317 名前:296 [2008/02/11(月) 12:42:30 ]
- >>314
そのコードが実質的に>>309と何が違う?
- 318 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:46:08 ]
- >>317 過去ログ読んでろ。自分のレスだけでなく、相手のレスも真摯に読め。
話はそれからだ。
- 319 名前:296 [2008/02/11(月) 12:47:28 ]
- 過去ログ嫁は逃げるときに便利な言葉だな。
- 320 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:48:32 ]
- 正直、もう後出しジャンケンのワナビー初心者相手にするのは飽きた。
- 321 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:50:54 ]
- >319 条件の後付けで逃げてるのはキミのほうでしょ…(´・ω・`)
- 322 名前:320 [2008/02/11(月) 12:51:07 ]
- 飽きたといいつつ、お前は次の奴も相手するよw
- 323 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:52:17 ]
- >>317 過去ログと言わず、自分のレスの1つ前のレスを読んでみたらどうだ?
- 324 名前:315 mailto:sage [2008/02/11(月) 12:54:59 ]
- >>321もしかして僕のレス見て言ってる…?
>>296へのレスだかんね(´・ω・`)
- 325 名前:321 mailto:sage [2008/02/11(月) 12:59:38 ]
- >>324
もちろん>>319=>>296へのレスだかんね(´・ω・`)
- 326 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:08:40 ]
- 296はトンヅラを決め込んだようですwwwwwwwwwwwカコワリwwwwwwwwwwwww
- 327 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:11:22 ]
- 誰もレスしていないが286が良い設計
- 328 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:33:25 ]
- >>267が良いコードとされた時代が懐かしいな
- 329 名前:デフォルトの名無しさん [2008/02/11(月) 13:34:46 ]
- なんだ時代は後退してるのか
- 330 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:37:10 ]
- それを後退だと思うなら後退だ。
- 331 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:41:26 ]
- 時代の最先端のコードは>>285です。
- 332 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:41:31 ]
- A_init()
A_FAILED case A_FAILED A_finish() ソース上ばらばらなのに意味上は相変わらず密結合 メンテナンス性を悪化させる似非リファクタリングの典型
- 333 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:45:55 ]
- >>332 よく読むとわかるけど、ソース上の距離は>285も同じなんだよ。
文句があるのなら>285に言ってくれw
- 334 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:48:45 ]
- 「処理とリソース管理の分離」を掲げた設計に対して
「ソース上ばらばら」は誉め言葉だよwww
- 335 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:53:31 ]
- hoge_impl()に処理を分割した分だけ距離が離れている
A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている >>334意味不明
- 336 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:57:34 ]
- >>335
gotoであちこちのブロックから飛びまくるのに比べれば > hoge_impl()に処理を分割した分だけ距離が離れている > A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている なんて取るに足らない瑣末な問題だな
- 337 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:59:07 ]
- >>332の日本語訳
意味上の結合を維持したまま、処理本体とリソース管理を分離できている。 メンテナンス性を向上させるリファクタリングの典型
- 338 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:59:47 ]
- 勘違いしないでほしいがgoto版との比較で>>267が駄目だという事ではなく
goto版も>>267もどちらも駄目だということ 公開関数であるhoge()から内部一式全てを一人で管理するような小さなモジュールなら goto版でも>>267でもどちらでも問題にならないだろう。 そうでない規模ならgoto版も>>267もどちらも簡単に破綻する
- 339 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:01:14 ]
- 意味不明なのは>>267のコードの
どの部分が処理本体でどの部分がリソース管理なのかが意味不明ということ
- 340 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:03:33 ]
- >>339 それは296にしか答えられない質問では?
- 341 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:07:14 ]
- >>338
つまり、巻き戻し処理のためにgotoのほうが遥かに便利という、 大元の>>199の引用元の主張は×ね。
- 342 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:08:15 ]
- initしてrollbackするだけという、中身が何もない例題じゃあなあ
- 343 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:12:21 ]
- // static void hoge_impl(void *p) {
#define return goto if (A_init() != 0) return A_FAILED; if (B_init() != 0) return B_FAILED; if (C_init() != 0) return C_FAILED; if (D_init() != 0) return D_FAILED; #undef return return 0; // } // void hoge() { // switch (hoge_impl(p)) { #define case label case D_FAILED: D_finish(); case C_FAILED: C_finish(); case B_FAILED: B_finish(); case A_FAILED: A_finish(); return -1; #undef case // default: // return 0; // }
- 344 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:14:32 ]
- 嫌goto厨は早く>>213の実例を全否定してまわる作業に戻るんだ
- 345 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:17:04 ]
- >>336
あちこちのブロックから飛びまくるのはgotoを無秩序に使う結果 >>267で何かgotoの重要な欠点が解決されたと思う人は 343と267で何が違うのか考えてみればよい
- 346 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:21:27 ]
- >>345
そうなんだよ。>>343の//で印(w)をつけてくれた部分が重要なんだよ。 あと、#defineの行もミソだね。 こんなつまらんgotoを使わなくても関数で出口を纏めることができるという好例だ。
- 347 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:22:29 ]
- >>344
嫌goto厨?濫用を嫌う人は何人かいるみたいだけど、 gotoを全否定してる人はいないんじゃない?俺も含めて。
- 348 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:31:06 ]
- そんなつまらん実装上の理由で関数分割をしなくとも
gotoさえ使えば綺麗にまとまる好例とも言えるな
- 349 名前:デフォルトの名無しさん [2008/02/11(月) 14:39:18 ]
- 最近関数内関数なるものの存在を知ったんだけど、
それがあれば「関数を勝手に作れないからgoto使う」って人も、gotoなしでいけるんじゃないかな。
- 350 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:44:26 ]
- >>347
定石的な使い方すら絶対に許さないと必死になっているように見受けられるがw
- 351 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:52:36 ]
- 個人的にはgotoが全面禁止でない限り>>267のようなコードは絶対書かないけどな
- 352 名前:デフォルトの名無しさん [2008/02/11(月) 15:09:11 ]
- 適当に書いた。
関数化したくなければブロックで書けば。 処理続行可能フラグとか変かもしれないけど、 戻り値に成功と失敗を返すなら、それをそのままこのブロックの制御に使える。 >>351で参照 // 前処理 flg = true while(flg){ if error{ flg = false; break; } break; } // 主処理 while(flg){ if error{ flg = false; break; } break; } // 後処理 return flg;
- 353 名前:デフォルトの名無しさん [2008/02/11(月) 15:10:22 ]
- みす
>>352で参照。 まあ、専用ブラウザならレス番選択して右クリしたら見れる。
- 354 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:02:48 ]
- なんか必死なgoto厨房ががんばってるな。
実装上の都合と設計上の都合の区別もつかないとは。 まあ俺も>>267みたいなコードはまず書かないけどなw
- 355 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:11:33 ]
- >>352
breakの数が多いのはなんでなんだぜ
- 356 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:13:43 ]
- 必死な嫌goto厨オツw
- 357 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:29:18 ]
- 設計云々なら、俺ならgotoを使わないなら最低限こう書く。
hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。 int hoge_init(); // 略 void hoge_process(); // 略 void hoge_rollback(int r) { switch(r) { // 略 } } void hoge() { int ret = hoge_init(); if (!ret) { hoge_process(); } else { hoge_rollback(ret); } } でも実際goto使うよ。イディオムだろこんなの。
- 358 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:02:46 ]
- >>357
>hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。 まぁハゲドウw
- 359 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:05:54 ]
- >>357
俺も > hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。 に禿同。 こんなつまらんことにgotoを使ったりはせんが。 2重breakには使うけどな。
- 360 名前:デフォルトの名無しさん [2008/02/11(月) 17:31:18 ]
- >>355
whileを、breakで好きな段階で抜けられるブロックとして使うため、2度目の実行をしないためにループの最後にbreakを入れる。 これはgotoの代替として普通使ってると思うけど。 まあ、ループしないのにwhile使うのはおかしいって言う人もいるけど。 んで、while 1として無限ループにしたほうが、breakで抜けますよってのを明示できるけど、 flgを入れてみたのは、全体の流れを制御するflgだと明示しつつ、 最後にbreak入れ忘れた場合でも途中でリソース不足とか2度実行のエラーになれば抜けれて安全かなと。
- 361 名前:デフォルトの名無しさん [2008/02/11(月) 17:38:15 ]
- エラー終了と正常終了を分ける場合は、主処理のブロックの最後で、breakじゃなくreturnするかな。
配列から探して何番目かを返すようなのは、エラーとNULLが逆になる。 基本だよね。 参照は >>361 // 主処理 while(flg){ if error{ flg = false; break; } return flg; // 常にtrueが返される。 } // エラー処理 return flg; // エラーなのでfalseが返される。
- 362 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:46:24 ]
- 粘着同士のレベルの低い言い争い、おわった?
- 363 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:57:38 ]
- >>360
なんで do { ... } while (false) にしないんだぜ?
- 364 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:00:24 ]
- >>237
> CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。 > javac ⇒ バイトコード ⇒ インタプリタが実行 バイトコードを実行するのはインタプリタではなくてVM(仮想計算機)だ。 つまり、インタプリタじゃなくてエミュレータな。
- 365 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:01:48 ]
- バカ亀乙
- 366 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:07:01 ]
- 大域脱出に限りgotoを使うという人はgotoの宛先は常にループ直後?
- 367 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:19:53 ]
- while (condition)
while (condition) if (something_wrong) goto A_FAILURE; else something; while (condition) while (condition) if (something_wrong) goto B_FAILURE; else something; return 0; B_FAILURE: something; A_FAILURE: something; return -1;
- 368 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:23:45 ]
- 大域脱出のときだけgoto使うよ派が書くとこうなる?
result = 0; while (condition) while (condition) if (something_wrong) result = A_FAILURE; goto END_OF_A; else something; END_OF_A: if (result == 0) while (condition) while (condition) if (something_wrong) result = B_FAILURE; goto END_OF_B; else something; END_OF_B: switch (result) case B_FAILURE: something; case A_FAILURE: something; return -1; default: return 0;
- 369 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:32:13 ]
- またコイツか・・・いいかげんウザ
- 370 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:43:16 ]
- コミュニケーション能力より技術力の方が大切だと思うので
こういう議論で野次馬からウザいと思われるかどうかは気にしませんw
- 371 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:56:38 ]
- >>363
ああそんなのもあったっけ。 doではじめるとwhileに書き換えられたことがあった。 それはともかく、 前処理に失敗したら主処理を飛び越して後処理ってするとき、 処理する前に判断しないとだめだろ。 それに、break忘れのリスクもあるが、戻り値の初期化忘れっていうミスを防ぐ効果もある。 どちらかというと正常か異常かを錯誤するほうが重大なミスだから whileよりdoがよいということはないと思う。 あと、エラーなら抜けるっていうまったく同じ目的のためのブロックだから、 前処理も主処理も同じ構文使ったほうがわかりやすいしミスしにくい。 とにかく頭使わずにミスなく書くのが目的だから。
- 372 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:00:40 ]
- >>371
>とにかく頭使わずにミスなく書くのが目的だから。 そか。俺は頭使わずにミスなく読めるコードを書くのが目的だから gotoで書く方が読み易い場面ではgotoを使うんだぜ
- 373 名前:デフォルトの名無しさん [2008/02/11(月) 19:11:03 ]
- 大域脱出の場合、pythonなら、breakでの脱出とfor文の判断での終了かが
はっきり分けられてるから簡単だよ。 UWSCってマクロならbreak 2っていう、2重ループ脱出命令がある。 結局自分で工夫しないといけない言語と、想定された言語があるんだよね。 そもそも、breakは内部はjmpつまりgotoなんだから受け側をswitchみたいに 自動で分けてくれてれば余計なif文でスペック落としたり、 スペックあげるためにアセンブラ使ったりしなくてすむのにな。 結局、どの言語でも共通の設計でいけるように最小限の文法にしてしまったから使いにくいんだよな。 >>372 それはいいけど>>285みたいなことされても困るんだよ。 あれは関数内でどうせリソースが有効かどうか判断する必要あるだろ。 if hoge { free(hoge); hoge = NULL } とかな だったらとび先は FAILED_INIT_HOGE_INPUT: FAILED_INIT_HOGE_AUDIO: FAILED_INIT_HOGE_GRAPHICS: とか全部いらなくて FAILED: 一つで足りるんだよ。 飛び先が一つなのは分かりやすいだろ。 そもそも、gotoが分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。
- 374 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:17:57 ]
- >>364
少なくともGNUはインタプリタと呼んでいるようだ。 gcc.gnu.org/onlinedocs/gcj/Invoking-gij.html >gij is a Java bytecode interpreter included with libgcj.
- 375 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:18:04 ]
- >そもそも、gotoが分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。
これは凄い
- 376 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:20:54 ]
- >>361
こんなコード書くやつがいたら、殴ってしまうかもしれない。ペシペシ
- 377 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:22:58 ]
- このスレってFizzBuzzすらパスしない奴がごろごろいそう・・・
- 378 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:25:23 ]
- 中身のないコードで空虚な議論
お前らヒマだな
- 379 名前:デフォルトの名無しさん [2008/02/11(月) 19:27:03 ]
- >>263をちょっと書き換え
if (A_init() != 0) goto A_FAILED; if (B_init() != 0) 80+0; B_FAILED: if (C_init() != 0) goto C_FAILED; if (D_init() != 0) goto B_FAILED; こっそりこういういたずらをしていく人がいるんだ。世の中には。 そういうやつと一緒に仕事しなかった人は幸せもん。 携帯開発の軍曹の話は有名らしいが、 あの戦場を生み出すのがこういうことをする人間なんだ。 本当に単なるミスであの地獄が生まれるとか思ってないよな? ああいうのをやるやつっていうのは、 周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。
- 380 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:30:26 ]
- goto肯定論者の俺でもこのスレのgoto厨には賛成できない
- 381 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:31:09 ]
- 流れを読まずに横レス。
GOTO 使わず関数使えというのは、太古の昔、非構造化プログラミングから 構造化プログラミングへのパラダイムシフトが現在進行形だった時代の いわば「スローガン」だと思います。 時代は移り、今は構造化プログラミングが当たり前の時代です。 そのような現在のプログラマが、私たちの先祖が使っていた GOTO 730 と 関数内部での goto FAILED; を同列に論じてしまうことに 私はいささかの疑問を感じるのです。
- 382 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:33:42 ]
- > 周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。
なんだそのビ妙〜な私怨はw
|

|