- ベストアンサー
ループ内での条件処理
ループ内で、ある条件の時だけ処理をする場合は、どういう書き方しますか? 例えば、私は while(ループ条件) { if (判定==false) continue; 処理 } ってやります。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
私なりに質問の意図を汲み取り回答します。 continueを使うか入れ子にするかの2択を迫られた場合、どちらを選択しても論理的な構造は変わりません。これは絶対前提条件です。その上でcontinueを使うのが嫌いか、入れ子を嫌うかの違いにすぎません。 両者のメリットとデメリットを考えた場合、 continueを使う場合、入れ子が少なくできる continueを使わない場合、使用する命令の種類を減らすことができる 位しかありません。 これ以外の理由で何か議論をしている場合、中身の無い屁理屈でしかないように思えます。 で、continueを使わないことと入れ子を減らすことのどちらがよりよいかと言う話になりますが、私はcontinueを使う方が好きです。私はcontinueを使うことに抵抗はありませんし、入れ子を減らすほうが表記上の構造がシンプルになり単純な可読性が向上しますので。 しかし、複数の人がかかわる開発などでは、優れた構造のプログラムが必ずしもよいわけではありません。 例えば正規表現は文字列操作のために用意された機能ですが、これを習得していない技術者も少なくありません。正規表現を使えば1行ですむ処理を何十行も書いて処理をする汚いソースはよく存在します。正規表現がわかる人にとっては正規表現を用いて1行で記述してくれたほうがずっとわかりやすいし、構造的にも優れていることは間違いありません。しかし、正規表現がわからない人にとっては、読めないソースになってしまいます。 それと同じようなことがこの件についても言えます。continueは全ての言語に共通する命令ではありません。また、違和感を感じる人や読みにくいと感じる人もいるでしょう。そのような人が読む可能性のあるチームであえてcontinueを使うのであれば、それは人が読めないソースを書いていることになります。 「人が読めないソース」がいいソースであるはずがありません(まぁ読めない人には少し勉強してほしいものですが…)。 ケースバイケースであると思います。
その他の回答 (6)
#1です。 回答は出ているようですが一応自分の回答に補足しときます。 補足要求した理由は、質問文だけでは「全くの初心者」なのか「少しは知ってる人」なのかの判断がつかなかったからです。 「初心者が Java の文法を勉強するために質問している場合」と「中級者が他者のソースのトレースをやりたがっている場合」とでは回答が全く変わってしまいます。 なので、あなたががある程度以上のレベルの人だと最初から分かっていたなら、俺も他の方と同じように「Java の条件判断文は if と switch しかありませんので、あとはフリーフォーマット方式を採用している関係で違って見えるくらいのバリエーションしかありません」と答えたでしょう。 ちなみに質問文の中に例として載せてある構文であれば、 while ( (data = get()) ) { if ( !data ) continue; process(data); } という書き方をします。 判定はできるだけイコールを使わずに判定し、ループ内で使用するデータは while 文の中で取得するように心がけています。また、ブロック文がいらないケースでは if に中括弧は使いません。 これは「何例かの決まりきった構文を使う場合、1文字でも少ない方がトレーサビリティは向上するはずだ」という俺のポリシーによるものです。
最初、質問を読んだときよく意味がわからなかったんですが、補足で意味がわかりました。面白そうなので回答します。 while(ループ条件){ if (判定条件==true) { 処理 } } 私も、これに一票ですね。最初に実行条件に符合しないものを例外的に構文から外に出すやりかたはあまりとりません。 これがループだとどっちでもいい感じがしますけど、サブルーチン(メソッド)などの場合にはかなり印象が違ってきます。例えば、あっちこっちにreturnがいくつもあるような書き方は最悪でしょう。returnは常に最後に1つだけで済む形で書くのが基本ですね。 それと同じように、ループの場合も、例外がいくつもあちこちにある書き方は、後で修正などを行うことになったとき、取りこぼしを誘発する可能性があります。条件が最初にすべてまとめられるのならいいのですが、 while(ループ条件){ if (○○){ continue; } ・・・処理・・・ if (○○){ continue; } ・・・処理・・・ if (○○){ continue; } ・・・処理・・・ } こんな具合に何かの処理をしてから条件に応じて構文を抜け出すような処理になってきた場合、後で条件などが変更されたとき、つい修正の取りこぼしを誘います。 ifでネストされた中に書く方法は、一見すると読みにくそうに思えますが、「どの処理がどの条件内で実行すべきか」が明確にわかり、条件変更などに伴う取りこぼしの可能性を抑制できるように思えます。 while(ループ条件){ if (○○){ ・・・処理・・・ if (○○){ ・・・処理・・・ if (○○){ ・・・処理・・・ } } } これなら、どの条件に符合するときどの処理をすべきかが直感的にわかります。条件の変更が必要となっても修正の取りこぼしをすることはまずありません。改変に伴う修正の取りこぼしなどを考えると、continueを使わないほうがコードとしては安全かな?と思ったりします。
- tatsu99
- ベストアンサー率52% (391/751)
私もその方法をとります。 つまり、本題としてやるべきことは、なるべくif文のNESTのなかでやるのではなく、素直な流れのなかでやる方が、ソースが見やすくなります。また、このようなループのなかで、良くあるケースを最初に除いておくことは、処理のスピードアップにもつながることがあります。
- fortranxp
- ベストアンサー率26% (181/684)
while(ループ条件){ if (判定条件==true) { 処理 } } に一票。 ていうかループ処理ならば 他に選択肢が思いつきません。
- fortranxp
- ベストアンサー率26% (181/684)
あまり良いほうほうではないでしょうが。 while(ループ条件){ if(判定条件==true){ flag=1;} if(flag==0){ 処理A(falseのとき);} else{ 処理B(trueのとき);} flag=0;} } ムダみたいですが自分的には 頭に入りやすいのでつい。 ちゃんと紙にやりたいことを 書いてやればこんなことは ないでしょう。
補足をお願いします。 1.あなたは Java の勉強中ですか? だとすれば、どれくらい勉強しましたか? 2.なぜこのような質問をしなければならなかったのですか? もしくは単に興味本位であれば、なぜそのような興味が沸いたのですか?
お礼
すいません。 逆に、なぜそれが気になったのですか? おかしなことを聞いてしまったでしょうか。
補足
1.Javaは2年くらいやってます。現在も勉強中ですが・・・。 2.色々な人のコードをみてると同じ意味でも違う描き方をしてるので、もっと色々な人のコードを見てみたいと思って質問しました。
補足
すいません。説明が足りなかったでしょうか。 ループ処理で、 ある条件のときだけ処理をするときです。 ^^^^^^^^^^ elseの処理がないときです。 他にも、 while(ループ条件){ if (判定条件==true) { 処理 } } という書き方があると思います。