gotoを恐れず使う兵共がfinallyや多重breakを語るスレat TECH
gotoを恐れず使う兵共がfinallyや多重breakを語るスレ - 暇つぶし2ch300:デフォルトの名無しさん
08/02/11 12:05:02
つーか、UnInitって未初期化のことじゃないか
オマエラ本当にマなのか?w

301:デフォルトの名無しさん
08/02/11 12:12:09
>296 たぶん君は10万行以上のコード書いたことないでしょ。
それにチームでコードを書いた経験もほとんど無いように見受けられる。
素人はgoto避けたほうが身のためだよ。

302:296
08/02/11 12:16:53
gotoの代替手段があってそれがgotoより優れているならそうするw

でも>>267>>286みたいに、goto回避を目的としたトリッキーなコードを書くくらいなら
イディオムとして理解できるgotoは素直に利用する方がよっぽどわかりやすい

303:デフォルトの名無しさん
08/02/11 12:19:41
>267をトリッキーと感じる感性でgotoを濫用されちゃ話になりませんな。

304:296
08/02/11 12:21:26
>>298

簡単な例で言えば>>267のコードで
hoge_implおよび*_initをインライン化する必要が出たら
フラグをreturnしてswitchで受けるっていうのは無理だわな、
そんときはどうする?ってこと


305:デフォルトの名無しさん
08/02/11 12:21:45
>>267はgoto回避のトリッキーなコードというよりも、
APIから抜ける前にチェックを「確実に」入れるための簡単なtipsなのだが。

306:デフォルトの名無しさん
08/02/11 12:23:14
>>300
Get:UnGetと書くマがこの世に実在してだな…

>>302
IDEでデバッグできる環境なら多少強引でもgoto回避したほうが追いやすいよ。

307:デフォルトの名無しさん
08/02/11 12:23:27
>>304 具体的に。

308:296
08/02/11 12:23:33
>>303
LABELを定義してgoto label するのと
フラグ定数をdefine してreturn -> switch するのと何が違うんだ?



309:296
08/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:デフォルトの名無しさん
08/02/11 12:29:50
意図的に話をループさせて逃げようとしてますな
>>298>>304で答えたことになると思ってんの?

311:デフォルトの名無しさん
08/02/11 12:30:23
>>308 >>305

312:296
08/02/11 12:32:26
309をgotoを使わずに上手く書くのってどうする?


313:296
08/02/11 12:34:10
要望にこたえて>>309に具体的に書いたので、
そちらも具体的なコードでよろしく

関数分割は無しな。
「美しい設計」にしたがって自由にリファクタリングできる業務なら
議論の余地なくgotoなんていらないだろ。ってかそんな環境ならC使わないし。


314:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 12:38:16
どこまで条件の後付けを続けるのかしら…(´・ω・`)

316:デフォルトの名無しさん
08/02/11 12:38:19
>>313
お前な、はっきり言わせてもらうと、馬鹿じゃねーのか?

「goto使わずに、関数分割してリソース管理と処理本体を分離する設計にしろ、
そのほうがgotoでスパゲッティにせずにリソースの解放を確実に実行できる。」
という主張に大して「関数分割はなしな」じゃ議論から逃げているとしか
受け取りようがない。

317:296
08/02/11 12:42:30
>>314
そのコードが実質的に>>309と何が違う?

318:デフォルトの名無しさん
08/02/11 12:46:08
>>317 過去ログ読んでろ。自分のレスだけでなく、相手のレスも真摯に読め。
話はそれからだ。

319:296
08/02/11 12:47:28
過去ログ嫁は逃げるときに便利な言葉だな。


320:デフォルトの名無しさん
08/02/11 12:48:32
正直、もう後出しジャンケンのワナビー初心者相手にするのは飽きた。

321:デフォルトの名無しさん
08/02/11 12:50:54
>319 条件の後付けで逃げてるのはキミのほうでしょ…(´・ω・`)

322:320
08/02/11 12:51:07
飽きたといいつつ、お前は次の奴も相手するよw

323:デフォルトの名無しさん
08/02/11 12:52:17
>>317 過去ログと言わず、自分のレスの1つ前のレスを読んでみたらどうだ?

324:315
08/02/11 12:54:59
>>321もしかして僕のレス見て言ってる…?
>>296へのレスだかんね(´・ω・`)

325:321
08/02/11 12:59:38
>>324
もちろん>>319=>>296へのレスだかんね(´・ω・`)


326:デフォルトの名無しさん
08/02/11 13:08:40
296はトンヅラを決め込んだようですwwwwwwwwwwwカコワリwwwwwwwwwwwww

327:デフォルトの名無しさん
08/02/11 13:11:22
誰もレスしていないが286が良い設計

328:デフォルトの名無しさん
08/02/11 13:33:25
>>267が良いコードとされた時代が懐かしいな

329:デフォルトの名無しさん
08/02/11 13:34:46
なんだ時代は後退してるのか

330:デフォルトの名無しさん
08/02/11 13:37:10
それを後退だと思うなら後退だ。

331:デフォルトの名無しさん
08/02/11 13:41:26
時代の最先端のコードは>>285です。

332:デフォルトの名無しさん
08/02/11 13:41:31
A_init()
A_FAILED
case A_FAILED
A_finish()

ソース上ばらばらなのに意味上は相変わらず密結合
メンテナンス性を悪化させる似非リファクタリングの典型

333:デフォルトの名無しさん
08/02/11 13:45:55
>>332 よく読むとわかるけど、ソース上の距離は>285も同じなんだよ。
文句があるのなら>285に言ってくれw

334:デフォルトの名無しさん
08/02/11 13:48:45
「処理とリソース管理の分離」を掲げた設計に対して
「ソース上ばらばら」は誉め言葉だよwww

335:デフォルトの名無しさん
08/02/11 13:53:31
hoge_impl()に処理を分割した分だけ距離が離れている
A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている

>>334意味不明

336:デフォルトの名無しさん
08/02/11 13:57:34
>>335
gotoであちこちのブロックから飛びまくるのに比べれば
> hoge_impl()に処理を分割した分だけ距離が離れている
> A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている
なんて取るに足らない瑣末な問題だな

337:デフォルトの名無しさん
08/02/11 13:59:07
>>332の日本語訳

意味上の結合を維持したまま、処理本体とリソース管理を分離できている。
メンテナンス性を向上させるリファクタリングの典型

338:デフォルトの名無しさん
08/02/11 13:59:47
勘違いしないでほしいがgoto版との比較で>>267が駄目だという事ではなく
goto版も>>267もどちらも駄目だということ

公開関数であるhoge()から内部一式全てを一人で管理するような小さなモジュールなら
goto版でも>>267でもどちらでも問題にならないだろう。
そうでない規模ならgoto版も>>267もどちらも簡単に破綻する

339:デフォルトの名無しさん
08/02/11 14:01:14
意味不明なのは>>267のコードの
どの部分が処理本体でどの部分がリソース管理なのかが意味不明ということ

340:デフォルトの名無しさん
08/02/11 14:03:33
>>339 それは296にしか答えられない質問では?

341:デフォルトの名無しさん
08/02/11 14:07:14
>>338
つまり、巻き戻し処理のためにgotoのほうが遥かに便利という、
大元の>>199の引用元の主張は×ね。

342:デフォルトの名無しさん
08/02/11 14:08:15
initしてrollbackするだけという、中身が何もない例題じゃあなあ

343:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 14:14:32
嫌goto厨は早く>>213の実例を全否定してまわる作業に戻るんだ

345:デフォルトの名無しさん
08/02/11 14:17:04
>>336
あちこちのブロックから飛びまくるのはgotoを無秩序に使う結果

>>267で何かgotoの重要な欠点が解決されたと思う人は
343と267で何が違うのか考えてみればよい

346:デフォルトの名無しさん
08/02/11 14:21:27
>>345
そうなんだよ。>>343の//で印(w)をつけてくれた部分が重要なんだよ。
あと、#defineの行もミソだね。

こんなつまらんgotoを使わなくても関数で出口を纏めることができるという好例だ。

347:デフォルトの名無しさん
08/02/11 14:22:29
>>344
嫌goto厨?濫用を嫌う人は何人かいるみたいだけど、
gotoを全否定してる人はいないんじゃない?俺も含めて。

348:デフォルトの名無しさん
08/02/11 14:31:06
そんなつまらん実装上の理由で関数分割をしなくとも
gotoさえ使えば綺麗にまとまる好例とも言えるな


349:デフォルトの名無しさん
08/02/11 14:39:18
最近関数内関数なるものの存在を知ったんだけど、
それがあれば「関数を勝手に作れないからgoto使う」って人も、gotoなしでいけるんじゃないかな。


350:デフォルトの名無しさん
08/02/11 14:44:26
>>347
定石的な使い方すら絶対に許さないと必死になっているように見受けられるがw

351:デフォルトの名無しさん
08/02/11 14:52:36
個人的にはgotoが全面禁止でない限り>>267のようなコードは絶対書かないけどな


352:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 15:10:22
みす
>>352で参照。

まあ、専用ブラウザならレス番選択して右クリしたら見れる。


354:デフォルトの名無しさん
08/02/11 16:02:48
なんか必死なgoto厨房ががんばってるな。
実装上の都合と設計上の都合の区別もつかないとは。

まあ俺も>>267みたいなコードはまず書かないけどなw

355:デフォルトの名無しさん
08/02/11 16:11:33
>>352
breakの数が多いのはなんでなんだぜ

356:デフォルトの名無しさん
08/02/11 16:13:43
必死な嫌goto厨オツw

357:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 17:02:46
>>357
>hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。

まぁハゲドウw

359:デフォルトの名無しさん
08/02/11 17:05:54
>>357
俺も
> hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。
に禿同。

こんなつまらんことにgotoを使ったりはせんが。
2重breakには使うけどな。

360:デフォルトの名無しさん
08/02/11 17:31:18
>>355
whileを、breakで好きな段階で抜けられるブロックとして使うため、2度目の実行をしないためにループの最後にbreakを入れる。
これはgotoの代替として普通使ってると思うけど。
まあ、ループしないのにwhile使うのはおかしいって言う人もいるけど。

んで、while 1として無限ループにしたほうが、breakで抜けますよってのを明示できるけど、
flgを入れてみたのは、全体の流れを制御するflgだと明示しつつ、
最後にbreak入れ忘れた場合でも途中でリソース不足とか2度実行のエラーになれば抜けれて安全かなと。


361:デフォルトの名無しさん
08/02/11 17:38:15
エラー終了と正常終了を分ける場合は、主処理のブロックの最後で、breakじゃなくreturnするかな。
配列から探して何番目かを返すようなのは、エラーとNULLが逆になる。
基本だよね。

参照は
>>361

// 主処理
while(flg){
if error{
flg = false;
break;
}
return flg; // 常にtrueが返される。
}

// エラー処理
return flg; // エラーなのでfalseが返される。


362:デフォルトの名無しさん
08/02/11 17:46:24
粘着同士のレベルの低い言い争い、おわった?

363:デフォルトの名無しさん
08/02/11 17:57:38
>>360
なんで do { ... } while (false) にしないんだぜ?


364:デフォルトの名無しさん
08/02/11 18:00:24
>>237
> CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。
> javac ⇒ バイトコード ⇒ インタプリタが実行

バイトコードを実行するのはインタプリタではなくてVM(仮想計算機)だ。
つまり、インタプリタじゃなくてエミュレータな。

365:デフォルトの名無しさん
08/02/11 18:01:48
バカ亀乙

366:デフォルトの名無しさん
08/02/11 18:07:01
大域脱出に限りgotoを使うという人はgotoの宛先は常にループ直後?

367:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 18:32:13
またコイツか・・・いいかげんウザ

370:デフォルトの名無しさん
08/02/11 18:43:16
コミュニケーション能力より技術力の方が大切だと思うので
こういう議論で野次馬からウザいと思われるかどうかは気にしませんw

371:デフォルトの名無しさん
08/02/11 18:56:38
>>363
ああそんなのもあったっけ。
doではじめるとwhileに書き換えられたことがあった。

それはともかく、
前処理に失敗したら主処理を飛び越して後処理ってするとき、
処理する前に判断しないとだめだろ。

それに、break忘れのリスクもあるが、戻り値の初期化忘れっていうミスを防ぐ効果もある。
どちらかというと正常か異常かを錯誤するほうが重大なミスだから
whileよりdoがよいということはないと思う。

あと、エラーなら抜けるっていうまったく同じ目的のためのブロックだから、
前処理も主処理も同じ構文使ったほうがわかりやすいしミスしにくい。

とにかく頭使わずにミスなく書くのが目的だから。


372:デフォルトの名無しさん
08/02/11 19:00:40
>>371
>とにかく頭使わずにミスなく書くのが目的だから。

そか。俺は頭使わずにミスなく読めるコードを書くのが目的だから
gotoで書く方が読み易い場面ではgotoを使うんだぜ

373:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 19:17:57
>>364
少なくともGNUはインタプリタと呼んでいるようだ。

URLリンク(gcc.gnu.org)
>gij is a Java bytecode interpreter included with libgcj.

375:デフォルトの名無しさん
08/02/11 19:18:04
>そもそも、gotoが分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。

これは凄い

376:デフォルトの名無しさん
08/02/11 19:20:54
>>361
こんなコード書くやつがいたら、殴ってしまうかもしれない。ペシペシ

377:デフォルトの名無しさん
08/02/11 19:22:58
このスレってFizzBuzzすらパスしない奴がごろごろいそう・・・

378:デフォルトの名無しさん
08/02/11 19:25:23
中身のないコードで空虚な議論
お前らヒマだな

379:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 19:30:26
goto肯定論者の俺でもこのスレのgoto厨には賛成できない

381:デフォルトの名無しさん
08/02/11 19:31:09
流れを読まずに横レス。

GOTO 使わず関数使えというのは、太古の昔、非構造化プログラミングから
構造化プログラミングへのパラダイムシフトが現在進行形だった時代の
いわば「スローガン」だと思います。

時代は移り、今は構造化プログラミングが当たり前の時代です。
そのような現在のプログラマが、私たちの先祖が使っていた GOTO 730 と
関数内部での goto FAILED; を同列に論じてしまうことに
私はいささかの疑問を感じるのです。


382:デフォルトの名無しさん
08/02/11 19:33:42
> 周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。

なんだそのビ妙~な私怨はw

383:デフォルトの名無しさん
08/02/11 19:35:12
こっそりって。コミットログすら書かないのか携帯の開発は。

384:デフォルトの名無しさん
08/02/11 19:38:12
>>381
小さい関数ならいいが、ブクブク太った巨大関数の中でホイホイと飛ばれると
読むほうは疲れるんだよ。多重breakとか限定された状況ならまだ許せるけどな。
特に考えもせずにgoto多様する馬鹿にかぎって巨大な神関数をつくりたがる。

385:デフォルトの名無しさん
08/02/11 19:38:40
>>379
そういうやつと仕事したことないけど、そのコードだとコンパイラ警告
でるんじゃないか?B_FAILEDの行が意味を成していないとか何とか。
擬似コードにつっこむのもあれだが。

386:デフォルトの名無しさん
08/02/11 19:39:47
>>381
飛び先が一箇所ならいいと思うよ。
>>379みたいないたずらされても、ループするか飛ばすかのどっちかしかないから。
goto FAILED;とかは関数につき1回だし普通は最後に飛ぶだけだし問題になることはないからね。

>>383
証拠が残せるようなシステム使ってないから。

>>382
福岡はそういう地域なんだよ。
完成品チェックって横槍いれて完成してたら強奪。奪ったらパソコン初期化して証拠隠滅。
毎度毎度そればっかり。

完成してたら強奪→正社員
奪われるばっかりの人→派遣社員

いや、別に比喩してるわけじゃなくてね。
社員同士でもそうなんだよ。


387:デフォルトの名無しさん
08/02/11 19:41:27
それはgoto以前の問題だし因果関係が明らかに逆。

適切に関数分割できない馬鹿だから
巨大関数の中をgotoで飛び回るコードになる。

そういう馬鹿に言うべきは「処理のまとまりごとに関数に分けろ」であって
そいつに「gotoを使うな」と言ったところで
今度は巨大なネストをフラグで引き回すコードを書くだけ。

388:デフォルトの名無しさん
08/02/11 19:42:12
>>385
B_FAILED の後ろがセミコロンからコロンになっているのに注意。
君はだまされる方だな。

389:デフォルトの名無しさん
08/02/11 19:45:08
馬鹿?

390:デフォルトの名無しさん
08/02/11 19:52:16
>>388
きづかなかった・・・w

もしかしてあなたは、そういういたずらをチョコチョコやっているのではな
いかと、疑いたくなってきたなw

391:デフォルトの名無しさん
08/02/11 19:52:52
朱に交われば、なんとやら・・w

392:デフォルトの名無しさん
08/02/11 19:55:23
>>387
でもこのスレで出てきてるコード読むと、
神関数つくりそうな勢いのコードが目につくんだけど。

393:デフォルトの名無しさん
08/02/11 19:56:28
昔一緒に仕事したひとで、
「1関数にreturnは1つしか書かない」
という信念を曲げない人がいた。
その人の書いた関数は、最後にラベルがたくさんあってgotoの山盛りだった・・・

ってあれ?デスマーチスレじゃないのか、ここ。

394:デフォルトの名無しさん
08/02/11 20:02:25
>>393
そいつってオレジャネ?

395:デフォルトの名無しさん
08/02/11 20:12:00
まさかの運命の再会

396:デフォルトの名無しさん
08/02/11 20:29:31
でもさ、数行の排他を必要とする関数で

  lock();
  if (arg == NULL) {
    unlock();
    return E_PARAM;
  }
...
  unlock();

よりも下のほうが好みだなぁ。lock()とunlock()内を関数に分離するのも馬鹿馬鹿しい
ほどの小ささだと

  lock();
  if (arg == NULL) {
    result = E_PARAM;
    goto END_FUNC;;
  }
...
END_FUNC:
  unlock();
  return result;


397:デフォルトの名無しさん
08/02/11 20:38:38
一方、俺はfinallyを使った。

398:デフォルトの名無しさん
08/02/11 20:45:37
>>397
Cなんだよ、バーヤバーヤ

399:デフォルトの名無しさん
08/02/11 21:48:02
某スレより

569 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 16:46:29
>>566
try finallyは例外を捕まえるための機構であって、ファンクション
トレースのための機構ではない。

デストラクタでロギングするほうがよっぽどスマート。try finally
に依存したロギングよりも。そしてアスペクト指向のほうが
デストラクタロギングよりももっとスマートだといっているのだよ。


400:デフォルトの名無しさん
08/02/11 21:53:30
finallyって例外つかまえるための機構?
例外以外にもreturnとかでも呼ばれるんじゃないの?

401:デフォルトの名無しさん
08/02/11 21:57:43
C++厨かよ

402:デフォルトの名無しさん
08/02/11 21:59:16
gotoはダメだって言っているやつって、
ループ内break、continue、関数の途中のreturnとかもダメだと思ってるの?

403:デフォルトの名無しさん
08/02/11 22:01:34
>>402
少なくともこのスレではそんな主張をしているレスは見あたらないね。
で、それがどうしたの?

404:デフォルトの名無しさん
08/02/11 22:02:58
そもそもgotoはダメだという主張自体が見当たらないのだが。
できるだけ避けろ、とか、濫用するな、ってのはあるようだがな。

405:デフォルトの名無しさん
08/02/11 22:10:13
>402は脳内敵をプロファイリング中でーす

406:デフォルトの名無しさん
08/02/11 22:14:51
gotoを書く奴はスパゲティコードを書くという前時代の妄想で脳内敵を作り上げているのはどっちだか

407:デフォルトの名無しさん
08/02/11 22:15:56
重要なのはgotoを使うか使わないかじゃなくて
ちゃんとコードレビューしろよってことだ

408:デフォルトの名無しさん
08/02/11 22:21:14
>>400
> 例外以外にもreturnとかでも呼ばれるんじゃないの?

正確には、フレームが巻き戻されるのをトラップする機能。
それを利用して、例外のハンドリング(catch)や、後始末の処理(finally)の機構が
実装されている、という表現が正確。

409:デフォルトの名無しさん
08/02/11 22:24:36
その「できるだけ」とはどこまでなのかという議論をしていたんじゃ?



410:デフォルトの名無しさん
08/02/11 22:24:46
>>407
修正箇所だけのコードレビューとかなら確かにうまくいくけどさ、
何万行のソースコードをレビューで全部網羅するって、
全然うまくいったことがないな。みんなどうしてるのだろ。
ペアプロとかのがよさそうだけど、やったことないや。

411:デフォルトの名無しさん
08/02/11 22:28:34
ルール:gotoを使っている関数はコードレビューの対象とする


412:デフォルトの名無しさん
08/02/11 22:31:56
>>411
ごめん、俺「関数のreturnは必ず一箇所でやる」ポリシーもってるから、
全部レビュー対象となる^^

413:デフォルトの名無しさん
08/02/11 22:33:39
>>412
^^と書いているが俺が去年やってたプロジェクトだと笑い事じゃなくて実際そうなる。

414:デフォルトの名無しさん
08/02/11 22:36:42
具体的に言うと、gotoを使っている関数は
フローチャートおよび詳細な動作説明をドキュメントとして準備してコードレビュー。
もちろんそういうドキュメントを用意してレビュー会で説明するのは実装者。
承認となった場合もドキュメントは保管。

なので濫用する奴なんか自然といなくなる。
誰も濫用しないから何万行のレビューなんてのも実際は発生しない。
無問題。

415:デフォルトの名無しさん
08/02/11 22:41:30
goto使ってる関数だけって、、、
あほらし。

416:デフォルトの名無しさん
08/02/11 22:45:08
if と if and only if の区別も付かない奴か。

417:デフォルトの名無しさん
08/02/11 22:49:57
>>414
それだけだとgoto濫用防止だけだけど、ホカにはどんなルールをきめてるん?

418:デフォルトの名無しさん
08/02/11 22:52:23
>>414
それとさ、組み込み系だとファンクショントレース機能があるICEとか
結構効果なのだけどさ、それも全開発者に配布?

419:デフォルトの名無しさん
08/02/11 22:52:57
結構効果なのだけどさ→結構高価なのだけどさ

420:デフォルトの名無しさん
08/02/11 22:55:55
>>417
あれこれ言ったら個人特定されるでしょ

単純なのは、一関数が一定の行数を超えたらとか
for文で()の中に書く内容が「普通じゃない」とか

ちなみに>>412の理由だけでgotoを使った場合はレビューで却下だよ。


421:デフォルトの名無しさん
08/02/11 22:58:23
>>420
世の中にドレダケぷろじぇくとまねーじゃが存在しているのか考えれば、
あなたがやっていることと同じようなことをやっている人は無数にいるから、
特定なんてされないと思うぞw

422:デフォルトの名無しさん
08/02/11 22:59:17
>>421
じゃあ先に君の関わったプロジェクトで採用されていたルールを教えてくれ

423:デフォルトの名無しさん
08/02/11 22:59:32
>>420
「普通じゃない」とかの基準で、資料作成させられて説明させられる
プログラマかわいそすwww

もうちょいまともな基準作ったほうがイインジャナイ?

424:デフォルトの名無しさん
08/02/11 23:00:47
んーとね。いちいち説明しないとわからんかな。

何が「普通」かは実際には定義されているの。ここでは書かないけど。
簡単に言えばループ変数の初期化、終了条件、増分を普通に書くのが普通

425:デフォルトの名無しさん
08/02/11 23:01:39
>>423
説明するのが手間になるようなコードを書くほうが悪いと思うが。

426:デフォルトの名無しさん
08/02/11 23:01:56
>>424
「なにが普通か」の基準をきめるための努力は世の中に一杯あって、
基準めいたものもあるんじゃない?

427:デフォルトの名無しさん
08/02/11 23:02:46
>>425
え~だって、俺様基準で「普通じゃないから」っていわれて、「フローチャート」
まで用意させられるのだぜw

428:デフォルトの名無しさん
08/02/11 23:06:57
>>427
フローチャートはgotoの場合じゃないの?
forの場合には何かトリッキーな式を書いた場合に
そのトリッキーな式がなぜ必要なのかを説明する
ドキュメント+プレゼンとかそんな感じだと思うが。

429:デフォルトの名無しさん
08/02/11 23:07:59
>>427
俺様標準じゃなくて、一応条件が示されてるらしいぞ。
まあ俺には関係ない話だからどうでもいいと言えばどうでもいいが。

430:デフォルトの名無しさん
08/02/11 23:08:47
gotoに拘る人間に100k行以上の開発蓄積のある人間はいない。

431:デフォルトの名無しさん
08/02/11 23:10:11
1m行ならわからんでもないがさすがに100k行くらいは新人以外誰でも書いてるだろ

432:デフォルトの名無しさん
08/02/11 23:10:18
好意のは時代を超えて無内容さが変わらないものだな

433:デフォルトの名無しさん
08/02/11 23:10:29
>>430
goto厨のコードを読めば、それは明らかだな。

434:デフォルトの名無しさん
08/02/11 23:12:43
>>431
1本の開発で一人100k行、の間違いじゃねーの?

435:デフォルトの名無しさん
08/02/11 23:13:56
そかも

436:デフォルトの名無しさん
08/02/11 23:16:18
goto使ったら詳細資料を用意しなければならないって、
使いたいとこでも使えないじゃねぇか。開発効率悪そう。

437:デフォルトの名無しさん
08/02/11 23:18:36
>>436
goto使うだけの理由があればそれを書けばいいんじゃないの?
処理の流れをちゃんと把握できていればフローチャートだって
簡単に書けるし。

それとも実装ドキュメントの類いを一切書かない人?

438:デフォルトの名無しさん
08/02/11 23:19:10
>>429
いやさ、その根拠が多くの開発者が納得いくものであればいいが、
「goto使ったら、フローチャート描かせて、説明させる。」っていってる
ようなやつが、まともな基準を示せるとは到底思えないのよね。

439:デフォルトの名無しさん
08/02/11 23:20:17
フローチャート書ける程度のショボイ処理ならgotoいらないだろ

440:デフォルトの名無しさん
08/02/11 23:22:47
>>436
わかって使っている人にとってはその通り。
ただし、こういうレビューの目的の半分は、
将来そのコードの面倒を見る他社のために実装資料を残すこと。
それが、大人のマナー

441:デフォルトの名無しさん
08/02/11 23:24:07
>>437
だからさ、goto使うだけでフローチャート書けっていってるのは、
基準が曖昧すぎるといってるのよ。別にgotoが適切な場合もあるし、
そうでない場合もある。whileが適切でない場合もあるし、そうで
ない場合もある。

そんなこといってたら、すべてのプログラムにたいして全部
フローチャート書けという事になるわけで。

442:デフォルトの名無しさん
08/02/11 23:24:44
フローチャート(笑)

443:デフォルトの名無しさん
08/02/11 23:26:59
他社とは限らないな。自社の別チームでも何でも。
要するに、今の実装チームが未来永劫メンテするわけじゃないということ

444:デフォルトの名無しさん
08/02/11 23:29:30
>>443
せめてさ、世の中に「メンテナンス性が高いプログラム」を判別しようとする
努力があって、そのための基準が研究されている事実くらい勉強した上で
そういうこといったほうがいいんじゃない?

goto使ったらコードレビューだ!とかじゃなくてさ。

445:デフォルトの名無しさん
08/02/11 23:30:09
可読性の定量化なぞ不可能さ。
管理面でどうしても何かしたいならば。
goto使用許可を出せる権限を
誰かに付与すればイイんじゃね?

446:デフォルトの名無しさん
08/02/11 23:34:14
>>441
gotoは他の構文要素と比較して、適切に使われない場合が多いという
共通認識があるからこそ、このスレも成立していると思うんだが。

適切なgotoもそうでないgotoもあり、適切なwhileもそうでないwhileもある。
だから全部やるか何もやらないかどちらかにしろ・・・では物は作れない。
現実的な判断として、かけるコストを回収できる効果があるかどうか。

というのが常識として書いていたが、考えてみればここはマ板でなく
ム板だから学生や研究者も当然いるのか。


447:デフォルトの名無しさん
08/02/11 23:38:10
>>446
いや、あなたがいままで言ったような判断基準より、ましな判定基準を
提供するツールはあるし(商用、フリーかかわらず)、そのことすら
知らないまま、ぷろじぇくとまねぇじゃぁをやるのは周囲を不幸にするよ、
といってるだけだけど。

448:デフォルトの名無しさん
08/02/11 23:38:10
>>444
浅学にして知らなかった。ポインタを示してもらえるかな。
研究者ではないので、俺はそういう勉強は足りないと自分でも思う。


449:デフォルトの名無しさん
08/02/11 23:40:22
ところで、俺はそういうプロジェクトに開発者として関わっていたのだが
どこからプロジェクトマネージャという誤解が発生しているのかな

450:デフォルトの名無しさん
08/02/11 23:40:51
コードレビューするのは結構なことだが、
くだらない決まり作って、くだらない作業させるようなプロジェクトは、
メンバのモチベーションも低いだろ。

451:デフォルトの名無しさん
08/02/11 23:50:07
>>448
とりあえず「複雑度」でぐぐってこいw

452:デフォルトの名無しさん
08/02/11 23:51:32
人の意見に文句だけいって自分は何も提供しない人って周囲のモチベーションさげるよねw
他の人、自分のかかわってたプロジェクトではどうだったのさ。
最低限そのくらい言ったら?

453:デフォルトの名無しさん
08/02/11 23:55:58
>>452
お前は、ナニサマナンダ

454:デフォルトの名無しさん
08/02/12 00:01:22
>>451
情報感謝。そういえば、そういうのも何か使ったことはあった。
ただ、そのプロジェクトだと単にビルド時に出していただけで、
それがどう使われていたのか知らない。値が高くても低くても特に何もなかった。

その値に適当な閾値を決めてレビューとかやればいいのか?
実際にプロジェクトでどういう運用がされていて、効果がどうだったのかとか、
そういう感想もあれば是非

455:デフォルトの名無しさん
08/02/12 00:05:25
これ以上ないくらいスレ違いだな

456:デフォルトの名無しさん
08/02/12 00:07:52
>>454
閾値はあるていどキビシ目にきめたほうがいいが、実際にレビューするか
どうかは、閾値が異常な値を示しているコードがバグを良く出すとか、
新規作成のものであるかとかいう事情を加味して考慮したほうがいい。

安定して動作しているモジュールを閾値より外れているから、といって
リファクタリングしたところで新たな不具合を生み出すだけ。
目的を見失わないようにしながら、やればいい。

しかし複雑度の計測もマダマダであって、あくまで一つの参考にしか
ならないが。

457:デフォルトの名無しさん
08/02/12 00:45:08
こないだ、goto文が使われているコードを
昔作ったものから持ってった。 キー入力の評価だから
これ以上重たくしたくもない・・・というところ。

select 文二重+if文の底から出るのに breakを掛けるのは・・・

458:デフォルトの名無しさん
08/02/12 00:48:03
世の中のプロジェクトは、まだまだ、リーダーとかマネージャとか上司とかの
「コーディング規約」(訳:俺の理解できない しんきのう は使うな)
が支配的なのな。

459:デフォルトの名無しさん
08/02/12 00:53:03
分野によるが、多人数が関る(新人やアホが混じりやすい)プロジェクトでは必須
MISRA-Cとか

460:デフォルトの名無しさん
08/02/12 00:59:27
MISRA-Cってどの程度使われてるのかね

それはさておき、MISRA-Cを適用するような分野に
新人やアホが混じってるというのはガクブルだな

461:デフォルトの名無しさん
08/02/12 01:18:15
MISRA-Cは、新人やアホがまじらないための基準という意味では
まぁ有効だが、そういうやつがいない現場にとっては、無駄な
足かせにしかなっていないという矛盾がある。そして、そういうやつ
が混じらないようにする努力というのは経営陣の仕事であって、現場の
規約を固めるのはあまり意味がない。

ミスを防ぐための基準が、よけいに複雑なコードを生み出して、
逆にミスを生み出してしまうような矛盾が今のMISRA-Cにはある。

462:デフォルトの名無しさん
08/02/12 01:56:39
そういうやつがいない現場の数のほうが少ない

463:デフォルトの名無しさん
08/02/12 07:33:58
結局、まじめに処理構造を見直すのがマンドクセからgoto使うんでしょ。
gotoマンセ君は多人数での開発経験がないんじゃねーの?

464:デフォルトの名無しさん
08/02/12 08:11:19
C覚えて2-3年程度のアマチュアが「goto、ヤベーw」とはしゃいでるだけ。

465:デフォルトの名無しさん
08/02/12 11:30:23
>>463
gotoを使ったほうが可読性が高い場合に遭遇したことが無いね?

466:デフォルトの名無しさん
08/02/12 12:30:26
基本文献はクヌースのStructured Programming with go to Statementsですかね。
あと、このへんで、
URLリンク(www.cmagazine.jp)
gotoと同じくらいダメとされている手を、gotoを避けるためだけに
使ってないか? というのは良い指標かと思う。

467:463じゃないが
08/02/12 17:17:23
>>465
もちろんあるけど、しっかり考えれば考えるほど少なくなっていくよ。

468:デフォルトの名無しさん
08/02/12 17:37:19
>>466
break, continueがだめって書いてあるやつ、
使わなかったとしたらどう書く?
ちょっと想像つかない。


469:デフォルトの名無しさん
08/02/12 17:41:08
ちなみにこういうやつ書いたんです。
エラーはエラーなんだけどエラーの種類によって動作を変えるってやつ。
コードの参照は>>469


for i = 0 to 2
IE.navigate(str)
REPEAT; sleep(0.1); UNTIL !IE.busy AND IE.readystate = 4

// エラーページチェック
errortitles[4] = Status(ID, ST_TITLE)
for e = 0 to 4
ifb 1 <= Pos(errortitles[e], errortitles[4]) Then
select e
case 4 // エラーがなければ続行する。
break 2
case 0 // 接続エラーなら規定回数試行する。
sleep(2)
continue 2
default // その他エラーならエラー終了する。
SendSTR( メモ帳, errortitles[e] + "<#CR>", 1, false, false )
IE.navigate("about:blank")
result = false
exit
selend
endif
next
// ここには来ないはず
msgbox("エラー判定ミス")
exitexit
next

470:デフォルトの名無しさん
08/02/12 17:43:44
ちなみに>>469のエラーチェックを関数化したやつもあるけど、
エラーの種類ごとに動作を変えるとしたら、
結局呼び出し元でswitchでそれぞれの動作をしないといけない。


471:デフォルトの名無しさん
08/02/12 17:50:14
>>468
breakやcontinueの乱用がだめという話で、
きちんと制御構造がわけるような書き方なら問題ないのでは。
実際List37の例はひどいものだし。

472:デフォルトの名無しさん
08/02/12 19:13:37
>>461
ベテランプログラマだけのユートピアを作るのが経営陣の仕事だぁ?

アホか。

473:デフォルトの名無しさん
08/02/12 21:57:54
アセンブラ上がりのPGだが、JMP系述語+スタック使わないで
処理できて速い方法とか、日々そんなことばかり考えてる。
メンテナンス性以前に、論理的整合性が失われて美しくないから
なんて話は、俺の頭には何のことかさっぱりわからない。

474:デフォルトの名無しさん
08/02/12 22:26:11
ルール:ソースは美しくなければならない

475:デフォルトの名無しさん
08/02/12 22:35:59
美しくなくとも。簡潔で軽妙ならば

476:デフォルトの名無しさん
08/02/12 23:14:11
>>472
新人は情報学科出身で、かつ優秀じゃなきゃイラネ

477:デフォルトの名無しさん
08/02/12 23:38:18
>>469
何段抜けるかを数字で書く多段breakって糞じゃね?

478:デフォルトの名無しさん
08/02/12 23:46:47
>>469
こんなソースを新人が書いたら、確実に書き直させるな。

479:デフォルトの名無しさん
08/02/12 23:55:08
まずもって文法が意味不明なのでとりあえず C 風に書き下してみた。

for (int i = 0; i < 2) {
 IE.navigate(str);
 do {
  sleep(0.1);
 } while (IE.busy || IE.readystate != 4);
 errortitles[4] = Status(ID, ST_TITLE);
 for (int e = 0; e < 4; e++) {
  if (1 <= Pos(errortitles[e], errortitles[4])) {
   switch (e) {
   case 4:
    goto BREAK;
   case 0:
    sleep(2);
    goto CONTINUE;
   default:
    SendSTR(メモ帳, errortitles[4] + "<#CR>", 1, false, false);
    IE.navigate("about:blank");
    result = false;
    exit;
   }
  }
 }
 msgbox("エラー判定ミス");
 exitexit;
CONTINUE:
}
BREAK:


480:デフォルトの名無しさん
08/02/13 00:01:50
>>479
途中で、読む気がうせた

481:デフォルトの名無しさん
08/02/13 00:03:19
VBでもないし何かと思ったらUWSCって何だ
厨房スクリプト言語?

482:デフォルトの名無しさん
08/02/13 00:19:17
ひとまずコード*だけ*読んで、前提条件あんま読んでないけど

>for (int i = 0; i < 2) {
「2回」ループする意図が良くワカラン。下のコード読めばわかるかと思って、
読もうとしたが、途中で挫折。

> IE.navigate(str);
> do {
>  sleep(0.1);
> } while (IE.busy || IE.readystate != 4);
IE.readystate==4だけじゃだめなのかな。IE.busyじゃないときだけ、readystate
が有効になるのか。ならIE.readystateが-1ならbusyとかしたほうが、
"while(IE.readystate!=4)"だけですむしわかりやすい。

> errortitles[4] = Status(ID, ST_TITLE);
errortitles配列の、5番目にいきなり代入してるのが、なんじゃらほい。0~4番目は、
どうなったのだろう?

> for (int e = 0; e < 4; e++) {
>  if (1 <= Pos(errortitles[e], errortitles[4])) {
このへんと、下をちょっと見た段階でギブアップ

483:デフォルトの名無しさん
08/02/13 00:22:21
余計なものを全部省いて構造だけ残すと、たぶんこう。

void f() {
 while (some_condition()) {
  something();
  for (int e = 0; e <= 4; e++) {
   if (some_condition(e)) {
    switch (e) {
    case 4:
     goto BREAK;
    case 0:
     goto CONTINUE;
    default:
     return;
    }
   }
  }
  exit(-1);
CONTINUE:
 }
BREAK:
 something();
}

484:デフォルトの名無しさん
08/02/13 00:30:02
>>483
やっぱりだめだ・・・こういう感覚を説明して理解してもらえるかわからないが、
そのコードは「普通」じゃない。読むのがすごいシンドイ。

485:483
08/02/13 00:32:42
で、俺ならこう書く。
頭の中でしか動かしていないので合ってるかどうかは自信ないが。

void f() {
 int state = 0;
 while (state == 0 && some_condition()) {
  something();
  state = check_state();
 }
 if (state == 4) {
  something();
 }
}

int check_state() {
 for (int e = 0; e <= 4; e++) {
  if (some_condition(e)) {
   return e;
  }
 }
 exit(-1); // not reached
}

486:デフォルトの名無しさん
08/02/13 00:35:50
まだ、java はインタプリタじゃ無い、って言ってるヤツがいるみたいだけど。
中には、インタプリタじゃ無い、ヴァーチャルマシンだ、とか
もっとひどいのになると、エミュレータだ、とか、もうメチャクチャ言いたい放題・・・
ちょっと呆れたな。
これって、「モモヒキじゃ無い、スパッツだよ!」って言ってるオバサンと同じじゃん。

487:デフォルトの名無しさん
08/02/13 00:38:14
>>485
あぁなんとか理解できる。サンクスw

488:483
08/02/13 00:52:25
せっかくだから俺からも一つネタ投下。
>>485 のf()と下のコードはどっちが良いと思う?

void f() {
 while (some_condition()) {
  something();
  switch (check_state()) {
  case 0:
   break;
  case 4:
   goto END_WHILE;
  default:
   return;
  }
 }
END_WHILE:
 something();
}

489:デフォルトの名無しさん
08/02/13 00:57:07
>>488
俺は>>488のほうがわかりやすいw

490:デフォルトの名無しさん
08/02/13 01:40:46
>>488
case 4:でsomething呼び出して
returnしてしまえばもっと見やすいと思うが。

491:デフォルトの名無しさん
08/02/13 01:44:51
(ノ∀`) アチャー

977 デフォルトの名無しさん[sage] 2008/02/13(水) 00:31:00
forループのネスト構造(2重)から一気に脱出したい時に、breakだと1重しか脱出できないので困ってます。
PHPではbreak 2;みたいに書くと2重のループから脱出できるみたいなんですが、C++で同じことができる方法はありますか?
goto文はなるべく使いたくないので……。

980 デフォルトの名無しさん[sage] 2008/02/13(水) 00:50:26
>>978
ググった時に「大域脱出するとき例外処理で~」とか書いてあるのを見たのですが、それでしょうか。

>>979
表を描くために座標をネスト構造で回しているのですが、
描画する要素がなくなったら外に出すっていうようにしたいんです。
大人しくflagにしたほうが良いですね……。ありがとうございました。

492:デフォルトの名無しさん
08/02/13 01:50:32
>>491
コピペもウザイが、意図もよくわからんぞw

493:デフォルトの名無しさん
08/02/13 02:05:31
(ノ∀`) アチャー

984 名前:デフォルトの名無しさん[sage] 投稿日:2008/02/13(水) 01:55:45
>>981
後で困りそうですがもっと単純に解決させました。
ループ部分だけクラス内で別のメンバ関数にして飛ばして、抜けたい所でreturnさせました……。

494:デフォルトの名無しさん
08/02/13 02:36:14
>>479
× for (int e = 0; e < 4; e++) {
○ for (int e = 0; e < 5; e++) {

>>482
> 「2回」ループする意図
ADSLで瞬間的に切断される場合、数秒後に再度アクセスしたら接続される場合があるので。

>IE.readystate==4だけじゃだめなのかな。
やり方をググってまねしただけなんで。

>5番目にいきなり代入してるのが、なんじゃらほい。
終了フラグです。
まあいいやり方じゃないけどエラーを拾う判定がちゃんと働くかテストにもなるしと入れてみた。
代入してるのはウィンドウタイトル。
あと、ループはループだけ、判断は一箇所にすると、制御が単純でわかりやすいなと思ったんだけど、
forを抜けて「ここには来ないはず」と書いた場所でbreakすればいいだけだった。

もともとが長いスクリプトだったからdefaultをexitで抜けてなかったんで
そんときのループ構造が頭にあって。
やっとすっきりしたと思ったんだけど見直せばもっとシンプルになるもんだね。


495:デフォルトの名無しさん
08/02/13 06:20:53
>>486
釣りいいかげんうざい。
あのね、じゃあ具体的にあんたが主張するBASICのようなコードを
JavaVMのバイトコードで示してみやがれっての。できなきゃ去れ。
二度と来るな。

496:デフォルトの名無しさん
08/02/13 07:13:52
>>486
せめてJavaVM実装の書籍を1冊でいいから読破してから言え、マヌケ。

497:デフォルトの名無しさん
08/02/13 07:30:44
まあ多重break/continueは可読性を落とすね。gotoのほうがナンボかマシ。
多重break/continueもgotoも無いのがベストつーか常識だけどw

498:デフォルトの名無しさん
08/02/13 07:53:56
>>494
> やり方をググってまねしただけなんで。

やっぱりね…
そういう姿勢だからbreakでもgotoでも汚ないコードになるんだよ。

499:デフォルトの名無しさん
08/02/13 07:55:56
JavaVMのハードウェア実装を知らないんだろうな、>486は。

500:デフォルトの名無しさん
08/02/13 08:11:16
JVMについて盛り上がっている人がいるようだが、
どのJVMのことだ?sunか?

501:デフォルトの名無しさん
08/02/13 08:12:39
>>500
特定の実装の話じゃないと思うが。つーか、吊りか?

502:デフォルトの名無しさん
08/02/13 08:30:34
ハードウェア実装?

503:デフォルトの名無しさん
08/02/13 08:43:59
荒らしはスルーで > 兵共

504:デフォルトの名無しさん
08/02/13 08:53:16
picoJava のことじゃまいか<ハードウェア実装

505:デフォルトの名無しさん
08/02/13 08:58:45
Jazelleとか。
一部ソフトウエアで実行するけど。

506:デフォルトの名無しさん
08/02/13 09:05:28
いずれにせよBASICインタプリタとは大分違う罠

507:デフォルトの名無しさん
08/02/13 09:16:38
>>498
勝手な思い込みで変更する馬鹿よりましだよ。

ぐぐったら出てくるけど、作業をしているか通信をしているかをチェックするんだって。
通信が完了してから作業をするだろうけど、作業が新しい通信を要求するかもしれないだろ。
どんな流れになるかはWebサイトの作り次第だし、テストするには通信帯域を制限したり・・・

コードの流用するならそれが確かに動くかテストするべきだが、
自分でテストできないなら基本的には信用することが必要だ。


508:デフォルトの名無しさん
08/02/13 09:25:01
busyだけだとフレームのページで途中で抜けちゃうって話がどっかにあった。
まあレイアウトが自由にできる今はフレームなんか使ってないだろうけど。
ReadyStateだけの場合は↓。
つまり両方のチェックが必要。

URLリンク(hpcgi1.nifty.com)
IEオブジェクトで読み込み完了まで待たせるのに以下のコードで待たせてますが、
ちゃんと読み込み完了まで待ってくれません。

どのようにすれば確実に待たすことができますか?

Do While IE.ReadyState <> READYSTATE_COMPLETE
DoEvents
Sleep 1
Loop

これならうまくいきました。
Do While IE.Busy = True Or IE.ReadyState <> READYSTATE_COMPLETE
DoEvents
Sleep 1
Loop


509:デフォルトの名無しさん
08/02/13 10:21:31
>>507
> コードの流用するならそれが確かに動くかテストするべきだが、
> 自分でテストできないなら基本的には信用することが必要だ。

唖然・・・
おまえみたいのはgotoを絶対に使うべきじゃないし、
そもそもプログラミングをするべきじゃない。

510:デフォルトの名無しさん
08/02/13 10:24:35
同意

511:デフォルトの名無しさん
08/02/13 10:25:49
>>509
なに俺様は完璧とか言ってんの?

512:デフォルトの名無しさん
08/02/13 10:58:49
そもそもコードは、誰が書いたものでも信用できない。

513:デフォルトの名無しさん
08/02/13 11:10:41
自分自身が書いたコードすら信用できないorz


514:デフォルトの名無しさん
08/02/13 14:29:42
「try ~ catch」 を使おうが、「for/while ~ break ラベル」 を使おうが、
汚いスパゲッティ・コードはいくらでも書ける。
たとえば、フラグ変数作って、break break break break 連発するヤツがいい例。
goto 使うやつに比べれば、「do ~ while (false)」 や 「switch ~ break」 を使うなど、
トリッキーなコード書いて得意満面になってるキチガイよりよっぽどマシだ。

要するに、「コードの美しさ・汚さ」と、「goto 使うな」 論は無関係。プログラミングの芸術的センスの問題だよ。
java、php、ruby そのた、言語によって大域脱出の仕方が違うのは
どの方法が正しい・優れているという基準が無いからで、どの言語作者も頭を悩ませている問題なんだろう。

goto の何が問題なのかと言えば、インタプリタやコンパイラの内部処理の都合上、
パフォーマンスを低下させる要因になっているから。
特に while(・・・) {・・・} みたいに { } ブロックを多用する言語は、goto で ”あらぬ方向” へ脱出される事を極端に嫌う。
これは { } によって確保したスタックの管理がくずれるから。
ここらへんは実際に目には見えない部分なので、なかなか理解が難しいと思う。
自分でインタプリタやコンパイラを作ってみれば経験できる事なのだが、いまどき、そこまでするヤツはおっとまた
字数制限がうざいなもっと長文書ければいくらでも語れるんだが続きはまた暇なときにでも。うんこちんちん!

515:デフォルトの名無しさん
08/02/13 14:33:20
長文とかどうでもいいからベンチの結果ひとつでも(張|貼)ってくれ

516:デフォルトの名無しさん
08/02/13 14:39:27
無茶言うなよ。java と basic と php とベンチで比べて何の意味がある?

517:デフォルトの名無しさん
08/02/13 14:43:13
>>514
> これは { } によって確保したスタックの管理がくずれるから。

今時、そんなソースコードにべたべたのインタプリタなんて珍しいわ。

コンパイラや、ソースコードを一回全部なめて、内部構造に
するようなインタプリタなら、ローカル変数のアクセスのために、
処理系はスタックの現在のオフセットを常にわかっている必要がある。

だから、ジャンプ元とジャンプ先でスタックのオフセットがずれるなら、
そのぶんをジャンプの直前か直後に調整して終わり。難しい話じゃない。

Javaのバイトコードを示していただきたいなぁあなたにも。

(あ、Rubyのブロックはクロージャだから別物ね)

518:デフォルトの名無しさん
08/02/13 14:47:17
gotoでforループの中に飛び込もうとするコードを
はじめて見たときはびっくりしたわ

519:デフォルトの名無しさん
08/02/13 14:51:06
というかスタックの奴等こっちでやれ。goto関係ないし。
スレリンク(tech板)l50

520:デフォルトの名無しさん
08/02/13 15:05:50
>>514はN88BASICでブイブイ言わせているビルゲイツ

521:デフォルトの名無しさん
08/02/13 15:10:52
MS-DOS版N88日本語BASIC(86)コンパイラー

ナゲー

522:デフォルトの名無しさん
08/02/13 17:02:48
このすれは「どうして1たす1は2なの?どうして?どうして?」って言いそうな連中ばかりだな。

523:デフォルトの名無しさん
08/02/13 17:07:13
コンピュータの気持ちになってみると 1 + 1 は 10 です

524:デフォルトの名無しさん
08/02/13 17:15:51
>>523

ここでコンピューターの気持ちで会話してきてください。
できれば↓のスレの書き込みの翻訳してくれるとありがたい。

1101011 1100001 1101001 1110111 1100001
スレリンク(prog板)


525:デフォルトの名無しさん
08/02/13 17:56:17
goto師はどこいった

526:デフォルトの名無しさん
08/02/13 18:30:05
回線の問題というか、pingでtimeoutでまくり

527:デフォルトの名無しさん
08/02/13 19:08:23
>>518
コーヒーふいたじゃねーかw

どんなコードかちょっと気になるw

528:デフォルトの名無しさん
08/02/13 19:25:24
直接gotoを使ってはいないが、
ループの中にswitch-caseで飛び込むコードって奴があるな。
Duff's device でググると出てくる。
(CGの人ならPorter-Duff operatorのDuff氏とか言うと、へーとか思うはず)

529:デフォルトの名無しさん
08/02/13 19:40:41
do {             /* count > 0 と仮定 */
 *to = *from++;       /* to がインクリメントされていないことに注意 */
} while (--count > 0);

これを、下のようにして最適化か。こう書いてコンパイル通る
ことすら知らなかったわw

しかし昔memcpy実装させられたとき、条件判定へらす努力したり
ワード単位でコピーしたりしたんだが、標準で用意されて
いたARMのlibcに速度が遠くおよばなくて愕然とした記憶があるなw

switch (count % 8)  /* count > 0 とする */
{
 case 0:     do { *to = *from++;
 case 7:        *to = *from++;
 case 6:        *to = *from++;
 case 5:        *to = *from++;
 case 4:        *to = *from++;
 case 3:        *to = *from++;
 case 2:        *to = *from++;
 case 1:        *to = *from++;
         } while ((count -= 8) > 0);
}

530:デフォルトの名無しさん
08/02/13 20:15:51
どのみち、天才の考えることは凡人には理解できないのでメンテ不可ですわ。

531:デフォルトの名無しさん
08/02/13 20:21:51
>>514
いいからJavaVMの実装本を読めって。
自分がどんなに時代遅れな発言をしているか
よーくわかるから。

532:デフォルトの名無しさん
08/02/13 20:34:59
>>514
> goto 使うやつに比べれば、「do ~ while (false)」 や 「switch ~ break」 を使うなど、
> トリッキーなコード書いて得意満面になってるキチガイよりよっぽどマシだ。

日本語に訳すと、
1+1を3と言うやつに比べれば、2+3を6と言う奴や3+1を2と言って得意満面に
なっているキチガイよりよっぽどマシだ。

といったところか。そんな>>514に良い言葉を教えてあげよう。
目糞鼻糞、どっちも糞。

533:デフォルトの名無しさん
08/02/13 20:50:16
今老舗特集やってるけど、昔からの技術をそのまま受け継いで応用することで普通の工業機械では作れないものを作れてるってさ。
確かに技術は進歩してるし、クソなコードは多いが、よい結果を出しているものはよい方法かもしれない。

紙すきのでやってたけど、手作業を機械でやることで品質の安定したものを大量に低コストにやってるが、
技術の開発は道具こそ工夫するものの人間が手でやっている。

プログラミングで自動化機械といえば、ソースコードのコンパイルとかスクリプトでの作業。
機械設備はコーディングをサポートしてくれる開発環境とかライブラリ。
そういうのを駆使して効率よく新しいものを作るのがプログラマの仕事。

決まりきったやり方が正しいのか最適なのかたまには見直してみるのもいいが、
基本はそれをまねしてやることだ。

何もかも完璧に分かってないといけないとか言ってたら時代の波に飲まれておしまいだ。


534:デフォルトの名無しさん
08/02/13 20:59:14
>>533
先人のコードをまねることは大切だ。
だが、自分のプログラムに応用する時には
そのコードをしっかり読んで動作を理解してから。
これができない奴はプログラムを書くべきではない。

535:デフォルトの名無しさん
08/02/13 21:00:03
つーか、>>494、かなり必死だなw

536:デフォルトの名無しさん
08/02/13 21:04:10
>>534
習うより慣れろだ。
正しいか間違ってるかは、うまくいくかいかないかで判断しろ。


537:デフォルトの名無しさん
08/02/13 21:08:24
ひょっとして、>>469がうまくいってる例だと思ってる? まさかな。

まあ、少なくとも元のコードの動作を理解できるまでは、
それを使ったコードを人様に見せるのは止めたほうがいい。

538:デフォルトの名無しさん
08/02/13 21:09:18
>>536
> 習うより慣れろだ。
> 正しいか間違ってるかは、うまくいくかいかないかで判断しろ。

仕様に照らして、な。
「実は実装依存」なコードを量産されるよ?

539:デフォルトの名無しさん
08/02/13 21:09:43
>>529
そりゃmemcpyがコンパイラに組み込まれてたんじゃね?
そういう場合、libcのmemcpyは関数ポインタ取るためだけに用意されている。

540:デフォルトの名無しさん
08/02/13 21:18:43
>>537
しっかり動いてますが何か。
テスト済みですが何か。

541:デフォルトの名無しさん
08/02/13 21:29:23
論破されて窮地に追い込まれると、
「関係ない話は別のスレでやれ」 とか
「~の本を読め」 とか言って相手を囲いの外に追いやろうとする
典型的な厨房の集うスレはここですか?

542:デフォルトの名無しさん
08/02/13 21:46:36
>>539
コピーするサイズに応じて、最適なコードをそれ専用に生成するってこと?

543:デフォルトの名無しさん
08/02/13 21:56:02
>>540
動けばいいと公言する奴のコードに限って実は動かないんだよ。
どうせ自分で何回か使ってみただけなんでしょ?
これだから、ゆとり世代は・・・

544:デフォルトの名無しさん
08/02/13 21:58:53
>>540
まさかとは思ったが、本気で>>469がうまくいってる例だと思ってるのか。
このスレのgotoを恐れずに使う兵共にとっても>>469は糞コードだぞ。

545:デフォルトの名無しさん
08/02/13 22:00:21
>>543
「動く」と胸を張っていえるからリリースするもんだろ。
それが動かなくなるのがバグだろ。
バグに遭遇したことないやつが存在するんなら確かにそういえるかも知れんな。

546:デフォルトの名無しさん
08/02/13 22:05:31
gotoの弊害はむしろ保守性の低さだろ

自分だけが使う書き捨てのプログラムなら別に>>469の糞コードでも良し

547:デフォルトの名無しさん
08/02/13 22:07:59
>>545
それがさあ、「動けばいい」って奴はロクなテストやってないのが相場なの。
大抵、自分の手元の環境で数回から数十回動かしてエラーが出なきゃOKって程度のテスト。

特に最近のゆとり君は適当にググってきたコードをコピペするからひどい。
何故動くのか理解しないまま数回動かしただけで「動きました」とか言い出す。
もうアフォかと。

548:デフォルトの名無しさん
08/02/13 22:30:31
>>547
テストしてないのを問題視するのはいいとして、テストもせずに駄目出しするのもどうかと思うが。

549:デフォルトの名無しさん
08/02/13 22:32:06
>>547
テストしてないのを問題視するのはいいとして、テストもせずに駄目出しするのもどうかと思うが。

550:デフォルトの名無しさん
08/02/13 22:35:55
>>548 テストしていないものは駄目出しされて当然だろう

551:デフォルトの名無しさん
08/02/13 22:38:01
>>550
テスト済みと書いてる字が読めないならプログラム組むな

552:デフォルトの名無しさん
08/02/13 22:42:02
>>551
へー、どんなテストしたの?
ちゃんと異常系までテストした?

553:デフォルトの名無しさん
08/02/13 22:44:15
>>552
どんな異常だよ

554:デフォルトの名無しさん
08/02/13 22:47:37
例えば
>>494
> > 「2回」ループする意図
> ADSLで瞬間的に切断される場合、数秒後に再度アクセスしたら接続される場合があるので。

のあたり、実際に切断された場合の回復処理で正常にアクセスできたことを
切断時間などを変えながら複数の状況でテストしたのかい?
切断された後、一旦回復してすぐまた切断される状況は?

555:デフォルトの名無しさん
08/02/13 22:51:54
>>469って、「多重continue、ヤベッーw」なワナビー風味だね

556:デフォルトの名無しさん
08/02/13 22:58:51
>>554
再表示で接続できることは経験的に知っているし、
規定回数全部で接続できなかった場合でもエラーで中断するし、
中断した場合も呼び出し元からやり直すだけだし。

回復して切断したらって話だが、
REPEAT; sleep(0.1); UNTIL !IE.busy AND IE.readystate = 4
これを実行した後には、接続できたかできなかったかのどちらかしかない。
もちろん不完全な取得を完了とした場合、その先で実行できないってだけだが、
実行できなかった場合も呼び出し元で再チャレンジするし。


557:デフォルトの名無しさん
08/02/13 23:00:25
>>556
つまりテストしてないわけね。よくわかった。

558:デフォルトの名無しさん
08/02/13 23:07:59
>>557
自分で切断はしてないけど切断があったことはログでチェックしてるよ。
 

559:デフォルトの名無しさん
08/02/13 23:09:48
>>558 切断時間はちゃんとカバーされてるのか?

560:デフォルトの名無しさん
08/02/13 23:12:55
おまえら、テストしたかどうか以前に>>469は一見して糞。以上おわり。

561:デフォルトの名無しさん
08/02/13 23:14:31
>>559
2回続けて失敗する現象はなかった。
昨日だったか2ch鯖にアクセスできなくなってたが、その場合そもそもここまで処理が回ってこないし。

>>560が手本を見せてくれるそうです。


562:デフォルトの名無しさん
08/02/13 23:18:13
>>556
結局わけわからん部分は「呼び出し元で再チャレンジするから」なわけね。
だったら2回ループ回さなきゃいいのに。中途半端なことするから可読性が落ちる。

563:デフォルトの名無しさん
08/02/13 23:24:55
>>562
前の処理がせっかくうまくいってるのにそれを無駄にすることはないだろ。
接続エラーになったからって前の処理をやり直したら、そっちまで接続エラーになるかもしれないだろ。
これは普通にブラウザ使ってたら分かる話だ。
試行回数とインターバルは経験的に、感覚的にだ。


564:デフォルトの名無しさん
08/02/13 23:27:09
>>563
つまり自分が使っていた環境のことしか考えていないし、
テストも自分の普段の環境から出ていないってことね。
なるほどね。

565:デフォルトの名無しさん
08/02/13 23:30:13
>>542
・インライン化の恩恵を受けられる。
・人手で最適化されたコードを吐いてくれる可能性がある。
・ポインタの型によって(intptr_t)pの値が最初から
ワードの倍数になっていることを保証できる場合がある。

566:デフォルトの名無しさん
08/02/13 23:44:24
>>564
待ち時間は秒数で指定してあるし。
IE使ってる時点で使用環境は固定されてるし。


567:デフォルトの名無しさん
08/02/13 23:45:36
しかしつまらんスレだな

568:デフォルトの名無しさん
08/02/13 23:46:10
もういいから
gotoの話じゃないならよそでやれ

569:デフォルトの名無しさん
08/02/14 00:10:38
direct threaded code


570:デフォルトの名無しさん
08/02/14 01:24:26
gotoを一行足りと書かなくても、
容易にクラッシュしてデバッグすらできない環境があって・・・。
助けてくれ orz.

571:デフォルトの名無しさん
08/02/14 01:25:27
>>570
それははたして環境のせいなのか?

572:デフォルトの名無しさん
08/02/14 02:50:12
異常系のテストは、まずは、そういう状況をわざわざ作り出して確認するもんだ。


573:デフォルトの名無しさん
08/02/14 06:49:41
>>566
> IE使ってる時点で使用環境は固定されてるし。

回線まで固定されるわけじゃなかろう

574:デフォルトの名無しさん
08/02/14 07:27:53
>>568
このスレはgotoを語るスレではなくて
finallyや多重breakを語るスレなのでは。

575:デフォルトの名無しさん
08/02/14 07:31:57
>>563
> 試行回数とインターバルは経験的に、感覚的にだ。

ひでえ根拠だなwww
うちに配属になった新人がこんなコード書いたら
即刻今のコードを完デリさせて最初から書きなおしだ。

576:デフォルトの名無しさん
08/02/14 08:23:43
インマルサット・インテルサットに積む電話交換機屋からブラウザアプリ屋まで
入り乱れての乱戦になっておりますw

577:デフォルトの名無しさん
08/02/14 09:01:44
キャプテンも忘れないであげてください

578:デフォルトの名無しさん
08/02/14 16:13:06
「テスト済み」なんて堂々と言うからだ。
テストっていうのがどんな物かわかってたら簡単に言えないもんだ。
そういう意味では「ポインタは理解してる」に似てるな。

と、釣りっぽくまとめてみる也。

579:デフォルトの名無しさん
08/02/14 18:26:21
ポインタのややこしいのは、ポインタじゃなくて宣言の方だからな。

580:デフォルトの名無しさん
08/02/14 18:41:46
一応鯖に負荷のかかる土日流しっぱなしにして想定した全部のパターンでうまくいくのは確認してるし
自動でかかる連続投稿規制とアクセス規制と、さらに管理者からのアクセス規制を受けるまでやって、
そーゆー規制食らった場合にも適切に処理できるのは確認済み。

んでえらそうに語ってくれる人がどういう方法でどこまでのテストを要求してるのか知らんが、
サーバーまで自分で作ってるわけじゃないって事を分かっているのかいないのか・・・。
自分でできる範囲ってのは回線を切断したり接続したりだ。

ちなみに、ほとんどの場合は回線の異常じゃなくて、2ch鯖がただシカトしてただけだった。
自分のプロバイダまでのpingは30msで失敗しないけど2ch鯖は120msくらいかかってそのうち1回くらい失敗しまくり。

あと、エラー判定が実は正常なのを異常と判断する場合があるのは最初から分かってる。
完璧に自動で判断することができないんだからしょーがない。


581:デフォルトの名無しさん
08/02/14 18:57:51
>>565
あぁ・・・そりゃ勝てなくて当たり前かw
トンクスw

582:デフォルトの名無しさん
08/02/14 19:58:15
後出しの多いやつだな・・・

583:デフォルトの名無しさん
08/02/14 20:02:05
単体テストと運用時のつなぐ相手のテストとの違いを
子供に理解させるのは無理だろう。

584:デフォルトの名無しさん
08/02/14 20:27:38
ほうほう。
単体テストってのは1行1行テストすることを言うんですかそうですか。

585:デフォルトの名無しさん
08/02/14 20:28:28
な。
無理だろw

586:デフォルトの名無しさん
08/02/14 20:30:44
あんな短いコードをあれ以上どう分割しろと

587:デフォルトの名無しさん
08/02/14 20:37:15
「単体テスト」でググレカス

588:デフォルトの名無しさん
08/02/14 20:40:00
>>580
結局は自分の環境でしかテストしてないと。
しかも普通に使っていただけで積極的に
様々な状況を設定したわけでもなし。

そういうのはテストとは言わないんだよ。

589:デフォルトの名無しさん
08/02/14 20:52:16
自分で設定しなくても実際にすべての場合で実行して結果を出してるんだからテストされてるだろ。

単体テストしろとかすべての環境でテストしろとかお前ら馬鹿かと。
たかだか数行のコードテストするために何十個もパソコン用意しろって?


590:デフォルトの名無しさん
08/02/14 20:53:36
>>584
ワロタ

591:デフォルトの名無しさん
08/02/14 21:04:11
だから一度「単体テスト」でググってから物言えカス

592:デフォルトの名無しさん
08/02/14 21:19:19
単体テストもせずに「テスト済み」かよ…こりゃダメだ。

593:デフォルトの名無しさん
08/02/14 21:21:29
新たな爆弾発言が出ました。
>>589
> 実際にすべての場合で実行して結果を出してるんだから

すべての場合だってさ・・・意味わかって言ってんのかね。んなわきゃないか。

594:デフォルトの名無しさん
08/02/14 21:22:28
レオン最高
マチルダかわいい

595:デフォルトの名無しさん
08/02/14 21:23:49
>>586>>587が自分に言ってる事もわかってないに100ガパス。

596:デフォルトの名無しさん
08/02/14 21:37:26
IEを単体でテストできると思ってる馬鹿が多いな

597:デフォルトの名無しさん
08/02/14 21:40:16
ちなみに
+offsetが抜けてデータ構造が変わっていたやつは単体テストで出てきそうなもんだが、
実際には総合テストしないと出てこなかったな。
スレリンク(prog板)

598:デフォルトの名無しさん
08/02/14 21:44:38
>>596
単体テスト用のサーバ立ち上げて、
サーバ側でわざと切断したりレスポンスを変えたり、
外部仕様のカバレッジや実行パスのカバレッジが得られるような
パターンでレスポンスさせるもんじゃないの?

599:デフォルトの名無しさん
08/02/14 21:44:40
単体テストにIEは関係ないだろ・・・

600:デフォルトの名無しさん
08/02/14 21:48:41
>>596
テストする対象はIEじゃなくて糞スクリプトなんですが。

601:デフォルトの名無しさん
08/02/14 21:50:36
つまりIEと同じメソッドを持つダミーのオブジェクトでテストしろってことね。


602:デフォルトの名無しさん
08/02/14 21:51:05
>>598
そのテスト環境は既に結合テストの範疇だな。
サーバーつないだら単体テストにならないだろ?

結論:「テスト済み」なんて簡単に言うなってこった。

603:デフォルトの名無しさん
08/02/14 21:53:00
>>602
いや、結合テストは実稼働のサーバとの接続でやるものでしょ。
実サービスではなく糞スクリプトのテストのためのレスポンスをする
サーバにつなげるのなら単体テストの範疇と思われ。
まあ、スタブを使うようなもんだ。

604:デフォルトの名無しさん
08/02/14 21:53:51
>>602
> 結論:「テスト済み」なんて簡単に言うなってこった。

同意。

605:デフォルトの名無しさん
08/02/14 21:54:48
それにしてもマチルダかわいい。

昔、うちに監禁してた少女は死んじゃったから代わりが欲しいな・・・(冗談)

それはそうと、ぼろいビルの屋上でスナイプの練習してるけど、
周りはもっと高層なビルがたくさん・・・
ライフルが丸見えです。
僕も屋上セックスしてたら隣のビルの専門学校から丸見えでばればれだった。


606:デフォルトの名無しさん
08/02/14 21:56:55
>>603
ああ、そういう意味なら納得。
つまりそのサーバーはテスト用に設定した動作をするってことね。

607:デフォルトの名無しさん
08/02/14 22:23:14
49日連続稼動しないとバグが発覚しない某アレの例もあるからねぇ・・・

608:デフォルトの名無しさん
08/02/14 22:32:18
>>400付近の遠いレスだけど、おまえらそもそもデストラクタロギングが
どんなのかしってるのか。

class TRACE {
  TRACE(char *funcnamne, ...) { cout << log... <<endl; }
  ~TRACE() { cout << log.. <<endl; }
}

とかよういしといて、関数に下のように書くだけだぞ。tryもfinallyも
いらない。スコープぬけるときにデストラクタが呼ばれて、
かってにロギングしてくれるから。

void func {
  TRACE trace("func", ...);
  ...実体...
}

609:デフォルトの名無しさん
08/02/14 22:36:14
>>608
クロージャがエスケープした時にはどうすんの?
finallyならクロージャがエスケープしようが例外が発生しようが
ちゃんとロギングできるわけだが。

610:デフォルトの名無しさん
08/02/14 22:39:45
>>608
それは言語依存でしょ。
フルGCな言語や処理系だとスコープ抜けた直後にデストラクタが叩かれる保証はない。

611:デフォルトの名無しさん
08/02/14 22:43:45
>>609
てか、そもそもC++にクロージャなんてものあったけか

612:デフォルトの名無しさん
08/02/14 22:45:06
>>611
ないけど、このスレはC++限定じゃないでしょ?

613:デフォルトの名無しさん
08/02/14 22:47:06
じゃぁtryもfinallyも前提に出来ないだろ、すべてコード上にログを
書くしかない。ならgotoまんせーだな、ファンクショントレースには。

614:デフォルトの名無しさん
08/02/14 22:49:20
>>613
C++限定じゃないがC限定でもない。
JavaでもPythonでもJavaScriptでもModule-3でもアリじゃないの?

615:デフォルトの名無しさん
08/02/14 22:50:15
CとC++のみが漢の言語

616:デフォルトの名無しさん
08/02/14 22:55:27
>>614
わかった。じゃぁまずは、「デストラクタロギングさん、馬鹿にしてすいません。
tryとfinallyを使ったロギングなんてクソです」といえwww

617:デフォルトの名無しさん
08/02/14 22:56:32
そういえばC言語のswitchはbreakで抜けるブロックだったな。
他の言語ではifの拡張だから普通にbreakでループが抜けれるから
>>469みたいなselect breakはおかしく見えちゃうんだな。


618:デフォルトの名無しさん
08/02/14 22:56:33
デストラクタでロギングできる言語よりも
finallyでロギングできる言語のほうが多いだろうな

そもそもfinallyに比べてデストラクタでロギングする
メリットが見えないのだが

619:デフォルトの名無しさん
08/02/14 23:00:09
>>616 ワケワカランwww

620:デフォルトの名無しさん
08/02/14 23:34:48
C++厨がファビョりました

621:デフォルトの名無しさん
08/02/15 00:55:51
>>618
>そもそもfinallyに比べてデストラクタでロギングする
>メリットが見えないのだが

おまえバカだろ?

622:デフォルトの名無しさん
08/02/15 01:16:59
C++にfinallyが無い理由を考えろ

623:デフォルトの名無しさん
08/02/15 01:18:43
finallyロギングは使うたびにfinallyブロックごとコピペする必要がある。
デストラクタロギングなら変数宣言だけコピペすればよいので、
finallyロギングよりコピペ量が少なくて済む。
その点ではC#/VB.NETのusingも次点でまあ使えると俺は思う。

ロギング以外にも言えることだけど。



624:デフォルトの名無しさん
08/02/15 01:40:34
aspect 最強説

625:デフォルトの名無しさん
08/02/15 01:41:27
粘着アスペルガー最狂

626:デフォルトの名無しさん
08/02/15 04:38:51
うちのご近所さんたちが次から次にご近所さんを殺しまくったのは、
多分年金を全部懐に入れてて、いざ受け取ろうとしたら一円も受け取れなかったから、
「ばれたら仕方がない」って殺しまくったんだろうな。


627:デフォルトの名無しさん
08/02/15 06:41:34
>>623
その程度の利点かよ・・・
finallyだってマクロ一発じゃん・・・アフォらし・・・

628:デフォルトの名無しさん
08/02/15 07:23:28
>>613
なんだそりゃギャハwwwwwwww
オマエ、もうちょっと色々な言語、できれば現代的な言語を勉強しろよwww

629:デフォルトの名無しさん
08/02/15 08:31:18
Aspect指向なんてどうでもいい。
CLOSのbefore-afterさえあれば十分。

630:デフォルトの名無しさん
08/02/15 08:50:21
おまえら朝っぱらから元気だな。
で、俺も>>623以外のデストラクタロギングのメリットを知りたい。

デストラクタロギングはどうも間接的すぎて気持ち悪い。
つーか、そのうちオブジェクト解放のタイミングが変わったら
とたんに使えなくなるような。
トリッキーではないが正道でもない方法に見える。

631:デフォルトの名無しさん
08/02/15 13:28:19
スクリプト厨の次はデストラクタ厨かよ
勘弁してくれ

632:デフォルトの名無しさん
08/02/15 15:51:00
急激に誰もいなくなった。
決算期前の需要で皆忙しいのかな。

633:デフォルトの名無しさん
08/02/15 16:56:03
>>627
マクロが使えるなんていい環境ですね。

634:デフォルトの名無しさん
08/02/15 17:36:29
とりあえず、仕様の表明の不十分なコード片を書くのはやめてもらいたい。
読まされるほうはたまったものではない。

635:デフォルトの名無しさん
08/02/15 17:49:12
>>634
読まなければ、いいじゃねーかw

636:デフォルトの名無しさん
08/02/15 17:59:15
たしかにw

637:デフォルトの名無しさん
08/02/15 18:02:53
>>529
このコーディングがC言語が生まれて10年後くらいに発見されたとかwikiに書いてあるけど、
C言語作るときにこの書き方を想定して作ったからC言語ではswitchをbreakで抜ける仕様になってるって分かる人いるかな。


638:デフォルトの名無しさん
08/02/15 18:05:50
>>637
全く意味がわからないな。
switch を break で抜けられる全部の言語で >>529 が書けるなら信じてあげるよ。

639:デフォルトの名無しさん
08/02/15 18:16:29
>>638

>>637の言う
> switchをbreakで抜ける仕様
って、fall throughのことで、
URLリンク(www.catb.org)

breakが無いと、次のcaseが現れても抜けない仕様、という
ほうが正確かな。

複数のcaseをうまく利用することができる、という特性を生かす趣旨が
ある仕様ということはわかるけど、ループと組み合わせるという技は
発見された、としてもいいんじゃないかと思うけど。

640:デフォルトの名無しさん
08/02/15 19:00:57
>>633
君のところじゃboostも使えないのかい?そりゃ可哀想に。

641:デフォルトの名無しさん
08/02/15 19:46:19
むしろ開発者の一存で、boostが使えることが少ない

642:デフォルトの名無しさん
08/02/15 19:49:36
デストラクタでログ取ると、ローカル変数のトレースを取れないんだよね。

643:デフォルトの名無しさん
08/02/15 20:23:45
>>642
トレースしたいローカル変数より後にロギング用の変数を宣言するのはダメ?
リリース版でログを取るのでなければ、boost::formatとか使わなくても
printfベースの実装で十分だと思うし。

644:デフォルトの名無しさん
08/02/15 20:41:48
>>643
トレースの対象がオブジェクト(またはその属性)の場合は?

645:デフォルトの名無しさん
08/02/15 20:45:03
昔、
goto aho:
...
{
int baka;
...
aho:
...(bakaを使う)
}

ってやったら、bakaを確保せずにいきなりahoに飛ぶコードを吐かれた(MS-Cかな?)。
それ以来gotoは完全封印


646:638
08/02/15 21:24:01
>>639
fall through だけじゃダメだと思う。
「case は switch 直下に無くても文法的に正しい」 って仕様が含まれている必要がある。

C は case ~ をそれ以外の単なるラベルと同列に扱うという仕様になっているから、
>>529 のように switch 直下ではなく while の中に case を書いても正しく動く」
ということが後になって発見(正確には”確認”)されたんじゃないかと。


ところで、ふと java の仕様見たら
URLリンク(www.y-adagio.com)
思いっきり >>529 が書いてあるし。

647:デフォルトの名無しさん
08/02/15 21:35:04
>>640
え、C++だったの?
627でfinallyって言っているからC++はないと思っていたんだけど。

648:デフォルトの名無しさん
08/02/15 21:52:40
>>644
テンプレートで超がんがる。
DebugLogger d("%d %d\n", &var, std::make_pair(obj, &A::func));

649:デフォルトの名無しさん
08/02/16 10:08:37
>>645
そんな入れ子の外から飛び込むのは、どんな言語の場合でも
自殺行為に近いだろ。 入れ子の外で定義が終わってれば
別だがね。

650:デフォルトの名無しさん
08/02/16 12:03:37
Doで始まるループなんだけど最初の1回だけ途中までは飛ばしたいときってあるよね。
多分そういうときに使ってるんだと思うけど、
普通はなんとかする。


651:デフォルトの名無しさん
08/02/16 12:29:19
goto使いたがる厨房は局所的な制御ばかり見て全体的な構造の見直しをしない、と、燃料注入w

652:デフォルトの名無しさん
08/02/16 12:31:14
C言語の仕様としては>>645みたいなのはどうなってるのか、詳しい人教えてよ

653:デフォルトの名無しさん
08/02/16 12:35:43
少なくとも変数の場所は確保されてるべき。
(最適化でレジスタに割り当てられると見た目じゃわかんないけど)

goto foo;
{
 int bar = 44;
foo:
 printf("%d\n", bar);
}

で 44 が表示されるべきだったかどうだったか調べてみる...

654:デフォルトの名無しさん
08/02/16 12:49:41
647はfinallyの処理系依存実装を見たことないのかと

655:デフォルトの名無しさん
08/02/16 13:40:44
>>652
同じ関数内のループに飛び込んでるだけだろ

656:デフォルトの名無しさん
08/02/16 15:39:42
>>652
普通の実装ならブロックローカルな変数も関数呼び出した時点で
スタックに領域確保するんじゃねーの?

657:デフォルトの名無しさん
08/02/16 15:51:47
>>651
gotoは「局所的な制御」にしか使わないから。
そして「構造」は「常に全体が対象」だ。

燃料としては不足だ。

658:デフォルトの名無しさん
08/02/16 16:03:24
>>657
> gotoは「局所的な制御」にしか使わないから。
> そして「構造」は「常に全体が対象」だ。

もちろん>>651はそれが前提で書いていると思うが?
全体を見ずに局所だけを見ているからgotoを使いたがる
というのが>>651の趣旨だと思うが。

659:657
08/02/16 17:02:23
>>658 んじゃ。
全体を見て局所も見ていればgotoを使いたがらない。
という命題は正しいのかい?

660:デフォルトの名無しさん
08/02/16 17:15:16
>>659
それは言語の設計思想によるんじゃないかな。
goto前提な言語なら自然とgoto使うことになるし、
goto原則使わないのが前提な言語を使っていて、
かつ、全体の構造を考える習慣がついていれば、
gotoが必要っぽい状況になったら自然と全体の
構造を疑う方向に目が向くと思うよ。


661:デフォルトの名無しさん
08/02/16 17:57:34
gotoを使いたくないだけの理由で構造を変えるのは、本末転倒にならないように気をつけないとな。

662:デフォルトの名無しさん
08/02/16 18:21:23
gotoが必要になるのは全体の構造がおかしい兆候なのではと疑うのと、
gotoを使わないだけの理由で全体の構造を変えることとでは
天と地ほどの差があるけどな。

663:デフォルトの名無しさん
08/02/16 19:07:13
紙一重だろw
構造を見直したい程gotoが気になるなら、まず
設計に対する姿勢から疑わないと。


664:デフォルトの名無しさん
08/02/16 19:09:49
かわいそうな>>663には見直すことと疑うことの違いがわからないらしい。

665:デフォルトの名無しさん
08/02/16 19:13:47
初心者向けの指標としては有りだろう。

666:デフォルトの名無しさん
08/02/16 19:14:42
>>664 無駄だって、相手はgotoを使いたいという結論が先にある人なんだから。

667:デフォルトの名無しさん
08/02/16 19:16:31
>>664は見直したら必ず変更しなくちゃ行けないと思ってるらしい。

668:デフォルトの名無しさん
08/02/16 19:17:27
わかりやすい自作自演をみた。

669:デフォルトの名無しさん
08/02/16 19:32:20
>>665
> 初心者向けの指標としては有りだろう。

gotoを使いたがるのは初心者が多いという意味で賛成だ。

670:デフォルトの名無しさん
08/02/16 19:34:40
>>667
そんな君の発言「紙一重」wwwwwwwwwwwww

671:デフォルトの名無しさん
08/02/16 19:39:57
疑うことと構造を変えることを紙一重と言っちゃってるからねえ
かなり苦しいんじゃないの?

672:デフォルトの名無しさん
08/02/16 19:46:22
燃料に引火しちゃったようで、ナイーブなgoto厨さんwwwwwwwwwwwwwww

673:665
08/02/16 19:56:31
>>669
そういう意味での賛成は遠慮させていただく。

「どうしてもgotoが必要な場面になったら、構造を見直してみよう」
のようなアドバイスは、初心者向けにはいいかもしれない。
終端条件やデータ構造を見直したら、もっといい方法がみつかるかもしれない。
けれど、そのgotoが適切だと思うなら、見直す必要もない。
gotoはあくまでもきっかけとして、である。

クロージャとかlambdaが欲しいな、と思いながらgotoを書く事もある。
goto(と飛び先のラベル)の場所が適切なら、問題ない。


674:665
08/02/16 19:57:15
自演醜ス・・・

675:デフォルトの名無しさん
08/02/16 19:58:19
なんでgotoについて語るのに構造のことまで持ち出すんだかが
全然わかんない。論争根源の論文の
URLリンク(www.cs.utexas.edu)
と同様なネガティヴキャンペーンにしか見えないぞ。

676:デフォルトの名無しさん
08/02/16 20:00:06
問題ないと言ってgoto乱発する馬鹿は
他人のgotoまみれコードを保守した経験がない
ビギナーさん

677:デフォルトの名無しさん
08/02/16 20:06:45
>>676 ぐちならマ板行でな。

678:デフォルトの名無しさん
08/02/16 20:12:36
自演認定したがる奴が自演常習者

679:デフォルトの名無しさん
08/02/16 20:15:42
↓次はsageで同意、と。

680:デフォルトの名無しさん
08/02/16 20:15:59
まさか「gotoを使う人間は使いたいから使う」などと思っている人はいないよね?
gotoつかう人は「goto使ったほうが良い」と判断しているから使うんだけど。
gotoを使わずに簡潔に書けるならば、好き好んで使ったりはしないよ。

681:デフォルトの名無しさん
08/02/16 20:16:45
ちぃ、はずしたか。

682:デフォルトの名無しさん
08/02/16 20:20:09
>>680
> gotoつかう人は「goto使ったほうが良い」と判断しているから使うんだけど。

その判断が狭すぎるという話じゃなかったのか?

683:デフォルトの名無しさん
08/02/16 20:35:45
goto厨は視野狭窄ということがプログラミングだけでなく議論においてもそうだということが証明されましたな

684:デフォルトの名無しさん
08/02/16 20:43:02
存在しない相手に対して勝利宣言か・・・

685:680
08/02/16 20:48:32
>>680
ああそうさ。必要も無いのにgoto使うというのはたしかに判断が狭いということだ。
これは開発担当のスキルの不足を反映しているのに過ぎない。
この問題の根源は開発担当に対するスキル管理の不足/欠如だよ。
悪いのはgotoやgotoを使ったプログラムやgoto使った人間では無いことを確認したいわけよ。

だけどgotoの使用判断は開発担当の職掌さ。
どのようなロジックにおいてもgotoを使わないほうが優れているという証明が出来ない限り、
goto禁止ルール自体は不当なルールだと言いたいね。

686:680
08/02/16 20:49:45
>>682
だた。失礼

687:デフォルトの名無しさん
08/02/16 20:51:54
プログラミング言語を作るときには、
徹底的にgotoを使わなくて済むようにしてほしいね。
多重breakをできるようにしたり、try-catch-finallyにデストラクタを用意したり。

688:デフォルトの名無しさん
08/02/16 20:53:44
それはJavaだ

689:デフォルトの名無しさん
08/02/16 20:54:14
美しいgoto文だって書けるのに。
汚いgoto文を見ただけで、「goto禁止」は、まりにも短絡的すぎ。
for~continue~break文にせよ、do~while文にせよ、if文にせよ、try~catchにせよ、
ネストしまくりでワケワカラン汚いコードを書くヤツは、そこらへんにウヨウヨいる。
いったいどうやったら、構造化言語をここまで汚く書けるのか、もう信じられんほど。
なのになぜ、goto「だけ」がこれほどまでに差別されなければならないのか。
・・・ま、そこらへを書くと、またキチガイが湧くんでホドホドにしとくが。
美しく書けばgotoは害では無い。これは確か。

690:デフォルトの名無しさん
08/02/16 20:56:25
>>685
とりあえず、モチツケ。
無条件goto禁止、については合理的な理由の説明は無かったはずだ。

691:デフォルトの名無しさん
08/02/16 20:56:46
それはわかるけど、現実は汚いgotoを書く奴が9割9分。
goto禁止したところで、そのうち9割くらいはフラグ付きwhileとか結局スパゲティを書く気がするけど。

692:デフォルトの名無しさん
08/02/16 21:02:41
>>689
gotoには「最後の手段」の側面もあるからね。
gotoとラベルの置き場所の自由さっぷりは両刃の剣なわけで。



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch