とある掲示板で「条件分岐は悪」という発言を見かけたのですが実際どうなんでしょうか?
またその理由も教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答11件
0
ベストアンサー
オブジェクト指向言語のポリモーフィズムの文脈では「条件分岐は悪」という考え方はありますよね。
送信側で条件分岐をして処理を変えるのではなく、受け手を抽象化してポリモーフィズムに従って実装すれば条件分岐がなくなります。
「なぜ悪なのか」という答えは、、、すみません、わかりません。複雑になるからですかね?
ちなみに、純粋オブジェクト指向言語と呼ばれている Smalltalk には他言語のような「if文」はありません。
http://ja.wikipedia.org/wiki/Smalltalk
投稿2015/04/26 03:41
総合スコア759
0
あくまで推測ですが、1つの関数で何でもかんでもやってしまおうとして、引数に条件判断用のパラメータだらけ、内部ではやたらネストの深い条件分岐、というような作りのことを言っているとすれば確かにスパゲッティ化してバグの温床になりますので「条件分岐は悪」と言われるでしょう。
まあ条件分岐が全くない、ということはありえないので程度の問題だとは思いますが、将来のメンテナンスのためにもあまり複雑怪奇な構造にしないというのはコーディングの基本だと思います。
投稿2015/04/26 01:57
総合スコア3041
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
前にもおっしゃられている通り前後の文脈が分からないのでなんとも言えませんが、
条件分岐は私は悪ではないと思っております。
なぜなら条件分岐は必ず出てくるものですから。
それを無理に処理したりするのは逆に可読性を落とす原因になるのではないかと。
私の中での悪の条件式というと例として1つif文を挙げさせて頂くとネストの多い条件式です。
つまり
if() { // if1
if() { // if2
if() { // if3
} else {
}
} else {
}
}else{
}
のようにifが続くものは私個人は悪だと思います。
この場合if3まで処理を追う場合にif1とif2の値を頭に覚えておく必要があるからです。
つまり、バグが発生した場合にデバッグを用意の行う事ができません。
このようなif文は経験上、ある程度は解消する事ができます。
リーダブルコード等の書籍を読んでみると悪のif文がどのようなものなのかは
わかりやすくのっています。
私のこの見解も本で学び実際にやってみたところかなりスッキリしたので紹介させて頂きました。
投稿2015/04/26 07:35
編集2015/04/26 09:26総合スコア233
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「条件分岐は悪」という部分だけを拾い出してしまうと、なかなか真意を読み取れないですね。
的を得ているかは解りませんが、思うところを書かせて頂きます。
「条件分岐は悪」という言葉が指しているところは、
手続き型プログラミングでは、if、switchをなどの条件分岐で処理を分けますが、
プログラミングでのバグの多くは条件分岐にあることが多いということに対して、
オブジェクト指向プログラミングでいえば、クラス・インスタンスを分けること、
関数型プログラミングでいえば、引数のパターンマッチを利用して分けることで、
条件分岐をしなくても処理を分け実行できるようにすれば、
バグが減るという考え方の話なのかと思います。
私個人としては、あまりそこにこだわる必要はないと思います。
プログラムはロジックだけでなく、可読性、メンテナンス性、性能やコストなど、
良い悪いというのも視点を変えれば変わります。
プログラミングにはいろいろな言語があり、流行りのようなものもがありまから、
今この考え方がいいとなっていても数年後は変わっていいることもあるでしょう。
一つの言葉に固執せず臨機応変に考えるべきかと思います。
しかし、臨機応変すぎると無秩序になるので、指針がとしては良いかもしれません。
論点がずれていたり質問の回答になってなかったらごめんなさい(^_^;)
投稿2015/04/26 06:27
総合スコア18
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
条件分岐は確かに悪ですが、回避法としてよく用いられる state / strategy パターンは
どうしても 大がかりすぎて、やろうとしていることに対してコストが
かかりすぎることが多い。
場合分け爆発が起こる場合、状態遷移が必要な場合というのは、
たとえば、GUIで、同じボタンがモードごとに処理が違う場合、
より具体的には、[copy]ボタンは、選択されているものが文字か図形かで処理が違ったりする。
こういう場合は、明らかに state と strategy パターンを使うべき、ということになります。
やってみれば分かりますが、かなりすっきりする場合も多いです。
ただしこれは、条件分岐が山ほど増えてきて、かつそれぞれの処理ブロックでやることが
全く違う場合であって、ほぼ同じことをするだけの条件分岐ならば、switch文などで
処理した方が 後で見ても 圧倒的に楽だし、パフォーマンス上もよいのです。
パフォーマンス性能やらリーダビリティが優れている方を取るべきで、
条件分岐を回避すべきときとそうでない場合がある、というのが真の回答で、
こういう問題こそ、グループで相談して決めるべきことかと思います。
投稿2015/05/06 09:49
総合スコア200
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
下手なロジックを組むなという事であって、状況次第だと思います。
Cで極端な例を出すと
分岐
lang
1if (a > 0) 2 c += b; 3 4cycle++; 5if (cycle >= 16) 6 cycle = 0;
分岐なし
lang
1c += b * (a > 0); 2 3cycle++ 4cycle = cycle % 16;
一般には前者の書き方が良いとされていますね。
後者は言語機能に強い人にはすんなり把握できますが、人により一瞬???となる書き方でしょう。
個人的には分岐を使うかどうかはその処理の抽象度によります。処理が漸化式や法に基くなら分岐排除して良し、そうでなければ分岐で(ポリモーフィズムの場合も抽象度で判断)。
「悪」の発言者は、誰かから「テストで分岐のカバレッジを100%にしろ」と言われてうんざりしているとか?前者で書いてもコンパイラが後者のロジックを吐いたりしますし。
投稿2015/04/28 10:27
総合スコア44
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/03 01:47
0
ある人はgotoを使うなと言います。ある人はネストの深いところから抜けるのにgotoを使うと言います。「ネストの深いところ」がないほうがいいのに決まっています。ただ、例外処理が実装されてない言語もあるので一概にgotoダメとは言えないところもあります。(関数の途中からreturnで戻るのも広義のgotoと変わらない)なので、私はネストが深くなりそうだったら、関数としてほおり出せばいいと思っています。・・・けっこう使いますね途中からの脱出^^;
#・・・2千行もあるCの関数見せられたら作った奴を呪いたくなります;;
すみません長々とmm
投稿2015/04/28 09:00
総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
よろしければ、その掲示板のURLをご教示いただけないでしょうか。
前後の文脈が分からないと何とも言えないです。。。
投稿2015/04/26 00:46
総合スコア736
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/28 04:58
2016/09/03 09:22