アプリ版:「スタンプのみでお礼する」機能のリリースについて

コーディング規約の中でdo-while文の使用が禁止されている例をよく見かけます。
確かに、

while(1){
・・・
if(・・・){
break;
}
}

とした方が判りやすく運用の柔軟性も高いと思いますが、
do-whileはそんなに可読性を落としてしまうものなのでしょうか?

A 回答 (8件)

前にも書いたようにdo-whileを禁止する理由はどう考えても見当たりません。


逆に規約の有無に関わらず、問答無用で禁止なのは、振る舞いが未定義や不定になるものです。処理系定義のものは(なるべく避けるべきですが)状況次第では許容されるでしょう。

動作が未定義になるもので、意外にやってしまいがちなのは、
・空でないソースの最後が改行で終わっていない(ISO/IEC 9899:1999 5.1.1.2)
・下線で始まるマクロを定義してしまう(同 7.1.3)
といったものがあります。

後は、なるべく一貫性のあるコーディングをすることが大切ですね。書式だけでなく、命名方法まで含めて。
    • good
    • 1
この回答へのお礼

御回答ありがとうございます。
未定義や不定動作、確かに問題ですね。
gotoが禁止される理由は可読性だけではないと感じました。
御指摘の2点、後学の参考にさせて頂きます。
どうもありがとうございました。

お礼日時:2005/06/22 10:13

ループの中に入るときに、処理するパラメータが不定のままの可能性があるならばよろしくないでしょうね。


かならず一回はループしてしまうわけですから。
可読性よりも重要かと。
私の場合は、ループに入る前に例外を除外してから処理するようにしてます。そのほうがループ内の処理が短縮できるから。だって、for/whileだろうが余計なif文が100万回(例えばね)ループすると思うといやです。
    • good
    • 1
この回答へのお礼

御回答ありがとうございます。
確かに、通常のフローよりもループの方が不定パラメータの問題は大きそうですね。
それを一々ソースの中でチェックする手間が余計だという観点で
禁止されているのかもしれません。
頂いた御意見を参考に、自分なりにもう少し考えてみようと思います。
どうもありがとうございました。

お礼日時:2005/06/22 10:20

私もたまに見ますが、do-while だけ条件式が下にあるから、上から下に読んでいく流れに反していて見づらいって事なんでしょうね。

    • good
    • 0
この回答へのお礼

うーん、どうなんでしょう。
do-whileは一旦ループ内を一通り実行しますから、
別に流れには反していないと思うのですが……

お礼日時:2005/06/22 10:14

Do-whileは禁止しなくてもいいとおもうけど・・・


もちろん、流れ的にwhileが適当なら無理にdo-whileを
使う必要は無いと思いますが・・・

あと、盲目的に禁止してしまうのがgotoですが、
なぜ禁止かというと、プログラムの流れが複雑になる。
というのが大方の理由かと思います。

まぁ、たいてい有無を言わさず禁止するでしょうけど。
しかし、私は流れを簡略化するgotoはOKな考えで、
多重にネストが掛かった最内から、一番外のネストからの脱出のみ使用可としています。
条件分岐使ってbreakの繰り返しは見るのもいやなんで・・・

でも、一度もそんなコードになったことは無いですが(笑


いずれにせよ、流れが読みやすいのであれば、問題は無いはずです。
ただ、プロジェクト自体の規約があるので、なんでもかんでもといのは無理でしょうけど。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
私は多重ネストからのbreakは苦にしないのですが、
確かにあまり見栄えの良いものではありませんね。

gotoに関しては、例外処理でたまにお世話になるかな、という程度のことは考えていました。
以前読んだ解説書にも、例外処理ならばgotoが適当な場面があると解説されていましたので…

お礼日時:2005/06/22 09:47

コーディング規約とはローカルなもので、そのプロジェクトのリーダーさんが決めるわけですから、従わなければなりません。

理由はリーダーさんに聞くべきです。
もっとも、コーディング規約というものは、見直しもされずに機械的にコピーが配布される悪い面があり、正しくはプロジェクトごとに規約の一つ一つを見直してから修正を加えて配布すべきです。
一般には使用を禁止する筋合いのものではなく、規約に載っていなくても、禁止すべきは"goto"文でしょう。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

私もリーダーに問い合わせてみたのですが、
以前のプロジェクトからそのまま引っ張ってきた規約らしく、
本人もよく理由が分かっていないようでした。

gotoのような一方通行の制御については、
直感的に「やらないほうがいい」と理解できるのですが、
do-whileは別に一方通行でもなんでもありませんよね…

お礼日時:2005/06/22 09:43

No.2のTT414です


>No.1の方に賛成です。
>do
「do」以下の文章の文章は「No.1の方に賛成です。」の文章の説明ではありません、「No.1の方に賛成です。」の内容とは別の意味の追加意見です。
    • good
    • 0

No.1の方に賛成です。


do
 文
while(式);
は可読性が良くありませんが、
do {
 文
} while(式);
は良いと思いますし、
また、必ず1回は実行すると言う部分もあるので、do-while以外でどうやって書くのでしょう?
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
while(1){
}
ループの中からif-breakで抜ける手はあるのですが、
do-whileの方が明らかにソースは単純になりますよね。

お礼日時:2005/06/22 09:40

意味不明の規約ですね。


breakやcontinueといった強制分岐を禁止するのであれば、まだ理解できなくもありません。
    • good
    • 0
この回答へのお礼

breakを禁止してしまうとswitchで困るような……
それはともかく、複合文として記述している限り可読性は落ちないはずなので、
おや、と思った次第です。

お礼日時:2005/06/22 09:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています