を利用して参りたいと考えておりまくことができるようになりの'else'JavaScript
-
10-07-2019 - |
質問
私はプロジェクトに取り組んでいるかの複雑なJavaScriptの処となります。この入れ子 if
-else
sである。していることが定められていますが、そのケア市場に出す前に指令に適合JavaScriptコードとしてシステムにおける相分離による読書、その他のヒントにスタックオーバーフローが、私の場合、下記の二つを構築しまうに違いの速度だけでは
if(some_condition) {
// process
return ;
}
// Continue the else condition here
vs
if(some_condition) {
// Process
}
else {
// The 'else' condition...
}
解決
常に最初の方法を使用します。読みやすく、インデントが少なくなります。実行速度に関する限り、これは実装に依存しますが、私はそれらが両方とも同一であることを期待します。
他のヒント
多くの言語では、反転 if
ネストを減らすためのステートメントまたは前提条件を使用します。
また、コードのネストが少ないと、コードの可読性と保守性が向上します。
"プロフィール、推測しないでください!"
- あなたは馬の前にカートを置いています(人間による維持可能性は機械の速度に勝ります)
-
測定によって最適化の努力を促す必要があります。つまり、
- 自分で実行時間を計るべきです。ブラウザやバージョンによって明らかに異なります
- アプリケーションのホットスポットの速度のみを最適化する必要があります(ポイント1を参照)
パフォーマンスに違いはありません。保守性のために2番目の例をお勧めします。一般に、ルーチンの出口ポイントは1つだけにすることをお勧めします。デバッグと理解に役立ちます。
無効な状況を除外するときは、最初のアプローチを使用します。
たとえばいくつかの検証を行うときに最初のアプローチを使用し、検証のいずれかが失敗した場合に戻ります。前提条件のいずれかが失敗した場合、先に進むことは意味がありません。同じことは、Martin fowlerのリファクタリングの本で言及されています。彼はそれを「条件をガード句に置き換える」と呼んでいます。そして、コードを本当に理解しやすくすることができます。
これはJavaの例です。
public void debitAccount(Account account, BigDecimal amount) {
if(account.user == getCurrentUser()) {
if(account.balance > amount) {
account.balance = account.balance - amount
} else {
//return or throw exception
}
} else {
//return or throw exception
}
}
VS
public void debitAccount(Account account, BigDecimal amount) {
if(account.user != getCurrentUser()) return //or error
if(account.balance < amount) return //or error
account.balance = account.balance - amount
}
おそらく少しですが、関数の残りの部分に「重い」部分が含まれていない限り、測定できるとは思いません。 (それ以外の場合は、戻り値が同じ結果になると想定しているため冗長です)js呼び出し。
補足として、これは不必要なマイクロ最適化であり、おそらくパフォーマンスの改善のために他の場所を探す必要があります。つまり、Chromeの開発者ツールまたはFirefoxのFirebug(または同様のツール)でスクリプトをプロファイルし、低速/長時間実行を探す必要があります呼び出し/関数。
実行中のブラウザーのJavaScript実装に依存しますが、それらの間に顕著な違いはありません(速度の点で)。
2番目の形式は、フローを中断することはプログラミングの適切な習慣ではないため、望ましい方法です。また、アセンブリでは、評価に関係なく、ジャンプ命令(マイクロ操作)が常に評価されることを考慮してください。
自分でテストします。このJavaScriptがブラウザーで実行されている場合、ほぼ確実にブラウザーのJavaScript解析エンジンに依存します。
if条件で分岐するため、違いは生じないでしょう。そのため、some_conditionがtrueの場合、else部分は、戻り値がなくても変更されません。
return
が1ミリ秒かかるのに対し、ネストされた if
は0.1ミリ秒かかる(またはその逆)と仮定します。
どちらかがこれほど遅いと想像するのは難しいです。
今、あなたは毎秒100回以上やっていますか?
もしそうなら、多分気をつけるべきです。
がある場合のみシングル if..else
の性能はほぼ同じ ではどちらでも構いません。いは読みやです。がら入れ子の諸表を使用 return
は 最performant 比 if...else
や case switch
私の経験から言えば、それはあなたがチェックしている状態に依存します。
-
if .. return
は、以下のコード全体をまったく実行する必要のないブール条件(おそらく設定)をチェックすると読みやすく、読みやすくなります。 -
if .. else
は、ある値が2つ(またはそれ以上)の可能な値のいずれかであり、両方のケースで異なるコードを実行する場合に読みやすくなります。 2つの可能な値の意味は、解釈可能な値が等しい条件を表しているため、同じ論理レベルで記述する必要があります。
私の意見では、returnとelseは上記の場合と同じですが、一般に if-else
と if()return;
は大きく異なります。現在のスコープから親スコープに移動するときにreturnステートメントを使用できますが、 if-else
の場合は、同じスコープでさらにif-elseを確認できます。