アカウント名:
パスワード:
breakするよりgotoで飛ばした方が速度出たりするんだよね
goto文やtry-catchの代わりにdo~while(0)でbreakさせると何これって言う人が必ずいる
例外を例外以外に使うのだけはやめてくれ
私も同意見ですが、CORBAでは例外以外も例外で扱うんですよね。初めてソース見たときはびっくりしましたが、タイムアウトでも例外が発生します。
CLUではEOFも例外処理で扱うとか。
continue くらいになると存在自体を忘れてたり...f(^^;
for文ばっかり使いすぎてて、do - while()が咄嗟に思いつかないことも。
whileの条件が常に偽なので、「何で1度しか実行しないのにループを形成しているの?」という意味で「何これ」って言うことはありますね。
同意
いまだにgotoは悪だというけど、C言語だと仕様上goto使ったほうがシンプルでわかりやすくなる箇所は必ずある。
goto文は(そう書いた方がよい場面というのはあるのだけど、一概に示せるものでもないし、説明したとてもお前は正しく理解して活用出来そうにないから)使うな
まさにgotoはこれ…人員のレベルが保証できてる時は使ってもいいと設定するけどそんなことはほとんどない&改修とかで全くアレなのが弄ってぐちゃになることを防ぐために禁止せざるをえない
try-catch的に使うとか、ラベル付きbreak的に使うとか、ですね。try-catch的に末尾に飛ばすのは、リソースの解放忘れを防げるし、常用してる。
try-catchがあるとか、ラベル付きbreakがあるとか、いったいどういう世界のCなんだ。
ないから、goto文で代用する;という話ですが、なにかおかしなことを言っています?
try-catch的に (エラー時にretにエラーコードを入れて、関数末尾に飛ぶgotoを) 使う;ラベル付きbreak的に (多重のfor/switchの中から、外側にラベルを張って そこに飛ぶgotoを) 使う;とか。
単に、「的」を見落として、「gotoがなければtry-catchをつかえばいいじゃない」という意見だと誤読してました。もうしわけない。
「的に」という言葉の意味がわからないの?
gotoを使ったほうが良い具合に見やすくなるケースをいくつか見た。
上手く使えばわかりやすくなるけど、考えなく使われるとひどい事にもなるから内規のコーディングルール上は原則禁止にしときたくもなる
「goto を使ってはいけません」と習ったので、頑なにそれを守って「多重ループを一気に抜けるためだけに」関数化して return で抜ける人もいたりする……
「gotoをつかってはいけません」に加えて「関数の途中でreturnで抜けるの禁止、というか1関数にreturnは1つだけな」みたいな変な制約つけるところあるけどね。構造化プログラミングの名の下に。
> …1関数にreturnは1つだけな」みたいな変な制約
最初見た時、複数の値を返す事言ってるのかと思ったけど、returnするところは 1個所のあれか。あれの利点がよくわからない。デバッガで止めやすいからなんだろうか…。
変数宣言は全て先頭でとかも未だにあるよね。
そういう決まり作ってる所のコードは大抵にして 1メソッドが無駄に長くて読みにくいんだよなぁ。
長い長い関数の途中でreturnされているのを見落として痛い目にあったことがある人が決めたルールなんじゃないのかな。でもこの場合の正解は長い長い関数を書かずに適切に短い関数に分割せよ、なんだけどねえ。
「長くなってきたな…」と思ったときにそのまま分割できる構造になっているので、単一returnっていうのもそこそこ健全なメンテナンスポリシーのひとつだと思いますよ。
構造化プログラミングの「入口一つ、出口一つ」を「return一つ」と勘違いしただけじゃないかな。
出口が1つだけの方がリソースの解放とかの後始末を忘れにくいからだと聞いたことがあります。狙いは分からんでもないので、全関数対象ではなく条件付きのルールにして欲しいと思いました。
そういう人は強制されなければmain関数1つに処理を全部書きそうだからむしろいいんじゃないかな。
速度以前に、goto文を避けるためにフラグを乱用してぐちゃぐちゃになっているのを見ている。ルールを適用するときには、目的と手段とが入れ替わっていないかちょっとは考えるべき。
そのレベルになると目的と手段の入れ替わり以前の問題だと思う
この国は外見が良ければ中身なんてどうでもいいという責任者が多すぎる
そうだと思う。
なぜ、そういう複雑なループ終了条件になるのか、ロジックから見直すことを、まず考えたほうがよいと思われる。後で何か改変が入った時、ロジックが入り組んでいると、その改変が可能かどうかさえわからなくなる。
出ました、「この国は」w
グダグダした話題なら何にでも使える万能の枕詞で悟り顔するのはストレス解消に良いよね。# 「ついつい使ってしまう悪いテクニック」
gotoは前方に飛ばなければ有りだと思う。
あと、飛び先が遠くないこと。これは関数が長くなければ自然にそうなる。
gotoが適切に使えない人は結局プログラム自体汚い。gotoが必要とされる状況のある言語では、goto禁止は誤ったルール。コードを適切な形に直す考え方で対応するべき。
お前さんのローカルルールで語られても。グローバルな一例を挙げてやるから勉強しとけ。
MISRA-C 2012ルール 15.2必要:goto文は、同じ関数のより後ろで宣言されたラベルにジャンプしなければならない。
それは言ってることは同じだと思うぞ。原則としてforwardへ飛べというのはプログラムの進む方向という意味での「前方」だし、「同じ関数のより後ろで宣言されたラベル」の「後ろ」は当然ながら「back」の意味じゃない。どちらも表現は違えど「後戻りgoto禁止」。
前方参照とかの「前方」の定義について。
その前は先に出てくるという意味だから、frontだな。Forwardは進行の意味だから、プログラムコードの後方、endへ向かう。
元コメはちゃんとforwardって書いてあるし、誤解の余地はないように読めるぞ。あえて言うなら「先方」と書いてあればこんなに枝が伸びずに済んだとは思うが。言い回しは一つと限ったものでもないし「前後」なんて向きをどちらに取るか次第だから文字や単語だけじゃなくて文をちゃんと読むべきだと思うぞ。
そういう問題じゃない使用するプログラミング言語によってはエラーハンドリングにはgoto使った方が素直になる場合がある
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
goto文は使い方 (スコア:0)
breakするよりgotoで飛ばした方が速度出たりするんだよね
do~while(0)でbreak (スコア:2)
goto文やtry-catchの代わりに
do~while(0)でbreak
させると何これって言う人が必ずいる
Re:do~while(0)でbreak (スコア:2)
Re: (スコア:0)
例外を例外以外に使うのだけはやめてくれ
Re:do~while(0)でbreak (スコア:2)
私も同意見ですが、
CORBAでは例外以外も例外で扱うんですよね。
初めてソース見たときはびっくりしましたが、
タイムアウトでも例外が発生します。
Re: (スコア:0)
CLUではEOFも例外処理で扱うとか。
Re:do~while(0)でbreak (スコア:1)
continue くらいになると存在自体を忘れてたり...f(^^;
for文ばっかり使いすぎてて、do - while()が咄嗟に思いつかないことも。
Re: (スコア:0)
whileの条件が常に偽なので、
「何で1度しか実行しないのにループを形成しているの?」
という意味で「何これ」って言うことはありますね。
Re:goto文は使い方 (スコア:1)
同意
いまだにgotoは悪だというけど、C言語だと仕様上
goto使ったほうがシンプルでわかりやすくなる箇所は必ずある。
Re:goto文は使い方 (スコア:3, すばらしい洞察)
goto文は(そう書いた方がよい場面というのはあるのだけど、一概に示せるものでもないし、説明したとてもお前は正しく理解して活用出来そうにないから)使うな
Re: (スコア:0)
まさにgotoはこれ…
人員のレベルが保証できてる時は使ってもいいと設定するけど
そんなことはほとんどない&改修とかで全くアレなのが弄ってぐちゃになることを防ぐために禁止せざるをえない
Re:goto文は使い方 (スコア:2)
try-catch的に使うとか、ラベル付きbreak的に使うとか、ですね。
try-catch的に末尾に飛ばすのは、リソースの解放忘れを防げるし、常用してる。
Re: (スコア:0)
try-catchがあるとか、ラベル付きbreakがあるとか、いったいどういう世界のCなんだ。
Re:goto文は使い方 (スコア:2)
ないから、goto文で代用する;という話ですが、なにかおかしなことを言っています?
try-catch的に (エラー時にretにエラーコードを入れて、関数末尾に飛ぶgotoを) 使う;
ラベル付きbreak的に (多重のfor/switchの中から、外側にラベルを張って そこに飛ぶgotoを) 使う;
とか。
Re:goto文は使い方 (スコア:1)
単に、「的」を見落として、「gotoがなければtry-catchをつかえばいいじゃない」という意見だと誤読してました。もうしわけない。
Re: (スコア:0)
「的に」という言葉の意味がわからないの?
Re:goto文は使い方 (スコア:1)
gotoを使ったほうが良い具合に見やすくなるケースをいくつか見た。
上手く使えばわかりやすくなるけど、考えなく使われるとひどい事にもなるから
内規のコーディングルール上は原則禁止にしときたくもなる
Re: (スコア:0)
「goto を使ってはいけません」と習ったので、
頑なにそれを守って「多重ループを一気に抜けるためだけに」関数化して return で抜ける人もいたりする……
Re:goto文は使い方 (スコア:1)
「gotoをつかってはいけません」に加えて「関数の途中でreturnで抜けるの禁止、というか1関数にreturnは1つだけな」みたいな変な制約つけるところあるけどね。
構造化プログラミングの名の下に。
Re: (スコア:0)
> …1関数にreturnは1つだけな」みたいな変な制約
最初見た時、複数の値を返す事言ってるのかと思ったけど、returnするところは 1個所のあれか。
あれの利点がよくわからない。デバッガで止めやすいからなんだろうか…。
変数宣言は全て先頭でとかも未だにあるよね。
そういう決まり作ってる所のコードは大抵にして 1メソッドが無駄に長くて読みにくいんだよなぁ。
Re: (スコア:0)
長い長い関数の途中でreturnされているのを見落として痛い目にあったことがある人が決めたルールなんじゃないのかな。
でもこの場合の正解は長い長い関数を書かずに適切に短い関数に分割せよ、なんだけどねえ。
Re: (スコア:0)
「長くなってきたな…」と思ったときにそのまま分割できる構造になっているので、
単一returnっていうのもそこそこ健全なメンテナンスポリシーのひとつだと思いますよ。
Re: (スコア:0)
構造化プログラミングの「入口一つ、出口一つ」を「return一つ」と勘違いしただけじゃないかな。
Re: (スコア:0)
最初見た時、複数の値を返す事言ってるのかと思ったけど、returnするところは 1個所のあれか。
あれの利点がよくわからない。デバッガで止めやすいからなんだろうか…。
出口が1つだけの方がリソースの解放とかの後始末を忘れにくいから
だと聞いたことがあります。
狙いは分からんでもないので、全関数対象ではなく条件付きのルールにして欲しいと思いました。
Re: (スコア:0)
そういう人は強制されなければmain関数1つに処理を全部書きそうだからむしろいいんじゃないかな。
Re: (スコア:0)
速度以前に、goto文を避けるためにフラグを乱用してぐちゃぐちゃになっているのを見ている。
ルールを適用するときには、目的と手段とが入れ替わっていないかちょっとは考えるべき。
Re: (スコア:0)
そのレベルになると目的と手段の入れ替わり以前の問題だと思う
この国は外見が良ければ中身なんてどうでもいいという責任者が多すぎる
Re:goto文は使い方 (スコア:1)
そうだと思う。
なぜ、そういう複雑なループ終了条件になるのか、ロジックから見直すことを、まず考えたほうがよいと思われる。
後で何か改変が入った時、ロジックが入り組んでいると、その改変が可能かどうかさえわからなくなる。
Re: (スコア:0)
出ました、「この国は」w
グダグダした話題なら何にでも使える万能の枕詞で悟り顔するのはストレス解消に良いよね。
# 「ついつい使ってしまう悪いテクニック」
Re: (スコア:0)
gotoは前方に飛ばなければ有りだと思う。
Re: (スコア:0)
あと、飛び先が遠くないこと。これは関数が長くなければ自然にそうなる。
gotoが適切に使えない人は結局プログラム自体汚い。
gotoが必要とされる状況のある言語では、goto禁止は誤ったルール。コードを適切な形に直す考え方で対応するべき。
Re: (スコア:0)
Re: (スコア:0)
お前さんのローカルルールで語られても。
グローバルな一例を挙げてやるから勉強しとけ。
MISRA-C 2012
ルール 15.2
必要:goto文は、同じ関数のより後ろで宣言されたラベルにジャンプしなければならない。
Re: (スコア:0)
それは言ってることは同じだと思うぞ。
原則としてforwardへ飛べというのはプログラムの進む方向という意味での「前方」だし、
「同じ関数のより後ろで宣言されたラベル」の「後ろ」は当然ながら「back」の意味じゃない。
どちらも表現は違えど「後戻りgoto禁止」。
Re: (スコア:0)
前方参照とかの「前方」の定義について。
Re: (スコア:0)
その前は先に出てくるという意味だから、frontだな。
Forwardは進行の意味だから、プログラムコードの後方、endへ向かう。
Re:goto文は使い方 (スコア:1)
Re: (スコア:0)
元コメはちゃんとforwardって書いてあるし、誤解の余地はないように読めるぞ。
あえて言うなら「先方」と書いてあればこんなに枝が伸びずに済んだとは思うが。
言い回しは一つと限ったものでもないし「前後」なんて向きをどちらに取るか次第だから
文字や単語だけじゃなくて文をちゃんと読むべきだと思うぞ。
Re: (スコア:0)
そういう問題じゃない
使用するプログラミング言語によってはエラーハンドリングにはgoto使った方が素直になる場合がある