web-dev-qa-db-ja.com

'if'ステートメントを多すぎるとプログラミングが悪くなりませんか?

If/elseifステートメントを多用しすぎているかどうか知りたいです。私はjavascriptを使用してtic-tac-toeプログラムを作成しており、コンピューターがプレーヤーをブロックする必要があるかどうかを判断するために、約9のifステートメントを使用しています。3が連続しているかどうかを判断する場合は約9を使用します。

例えば:

if(r1c1V === xOrO && r1c2V === xOrO && r1c3V === xOrO)
{
    is3InARow = true;
}
else if(r2c1V === xOrO && r2c2V === xOrO && r2c3V === xOrO)
{
    is3InARow = true;
}
else if(r3c1V === xOrO && r3c2V === xOrO && r3c3V === xOrO)
{
    is3InARow = true;
}
.
.
.
.

等々。

だから私の質問は、私はあまりにも多くのifステートメントを使用していますか?またはこれを行うためのより良い方法はありませんか?私の友人は、私がそれほど多くのifステートメントを使用するべきではないと言っていましたが、彼が本当かどうかはわかりません。なぜそれが遅くなるか悪いかは理解できますが、よくわかりません。

前もって感謝します!!

8
user5187524

プログラミングとは、プロセスを自動化することです。あなたは私があなたがこれをしている方法が間違っていると言うのを聞くことはありません。それが機能する場合、それは大丈夫です。しかしもちろん、すべてを自動的にチェックする方法を見つけることができれば、もっと美しいでしょう。すべてのxコードをループするように、それらすべてがチェックされているかどうかを確認します。これは簡単ではないかもしれませんが、より拡張可能になります。 10 x10グリッドでゲームをプレイしたい場合。そうすれば、それがフィールドのサイズであると言うだけで済みます。今のところ、他のすべてのコード行を追加する必要があります。

4
StijnvanGaal

これはかなり主観的なものであるため、スタックオーバーフローにはあまり理想的ではありません。

あなたの友人がおそらく示唆しているのは、長いif/elseステートメント、ネストされたifなどを使用するプログラムは、保守が難しい場合があり、常に読みやすいとは限らないということです。 long ifステートメントを別の関数に置き換えることができる場合があります。これにより、保守がはるかに簡単になります。

たとえば、tic-tac-toeの場合:

function checkRow(rowToCheck){
    if (rowToCheck[0] === rowToCheck[1] && rowToCheck[1] === rowToCheck[2]){
        return true;
    } else {
        return false;
    }
}

それが完璧または優れたコードであるとは言えませんが、コード内のifステートメントの数を減らすことができる方法を確認できます。それはさらに考慮に入れることができます:

function checkRow(rowToCheck){
    var allMatch = true;
    for (var i=0;i<rowToCheck.length && allMatch;i++){
        allMatch = rowToCheck[i] === rowToCheck[0];
    }
    return allMatch;
}

これにより、さまざまな長さの行が可能になり、ifステートメントが削減されます。とにかく、それがifステートメントを削除できるいくつかの方法を説明していることを願っています。


編集

さらに将来的には、行内の要素の同等性をチェックするためのさらに別のより良い方法があることをお勧めします。

const o = 'o'
const x = 'x'

const rows = [
  [o, x, x],
  [x, x, x],
  [o, o, x]
]

const rowIsEqual = row => !row
  .some(square => square !== row[0])
  
const results = rows.map(rowIsEqual)
  
console.dir(results)
12
OliverRadini

厳格なルールはありません。 &&および|| are short-circutted結果がわかると、評価が停止することを意味します。それと、ifステートメントを好きなように並べ替えることができるという事実は、最初に頻繁な比較を検討することで物事を最適化できることを意味します。

常に最も明確なことを行い、パフォーマンスが重要な場合は、最も速いことを行います。

1
Bathsheba

If-elseステートメントを多すぎると、プログラムの読みやすさが低下すると思います。if-elseステートメントを使用する代わりにswitch-caseステートメントを使用できます。javascriptでswitch-caseをグーグルするだけで、多くの役立つリンクが表示されます。それ。

0

あなたのシナリオでは、それはまったく悪くありません。可能であれば、コードにreturnを追加して、他の条件を実行しないようにすることができます...シナリオで可能な場合に限ります。

0
ninja

一般的に、はい、「多すぎる」ifは悪いです。 ifを使用するだけで問題を解決できますが、関数型プログラミング、再帰、オブジェクトモデリングなど、身の回りにあるすべてのものが、ifが制御不能になり、理解できないコードが広大になるのを防ぐためにあります。シーケンスの長さよりも、ネストされたifの深さについてもっと心配する必要があります。本当の賢さを見たいのなら、ロゼッタコードの tic-tac-toe です。

0
bbsimonbb

非常に多くのアプリが長いifthen elseステートメントで構築されていますか?どうして?辞書の方がいいのではないでしょうか。キーワードを検索し、関連するアクションを実行します。データベースを含む複数のバックエンドに対してこれを行う単純なpythonライブラリが見つからないことに驚いています。

0
Micheal Bee