JavaScriptのプロパティを繰り返しながら過度のネスティングを防ぐための良いパターンを継続する場合は、
-
04-10-2019 - |
質問
私は通常、このパターンを使用してオブジェクトを繰り返します。
for(var property in object) {
if(object.hasOwnProperty(property)) {
...
}
}
私はこの過度のインデンテーションが好きではなく、最近、これを行うことでそれを取り除くことができると私に指摘されました:
for(var property in object) {
if(!object.hasOwnProperty(property)) {
continue;
}
...
}
これは、インデントの余分なレベルを導入しないので、これが好きです。このパターンは大丈夫ですか、それともより良い方法はありますか?
解決
私は個人的に好む:
for(var property in object) if(object.hasOwnProperty(property)) {
...
}
なぜなら、追加のインデントはありません for
, if
, 、巻き毛の装具を除外すると、次の声明が発生します。すべてのコードを内部に配置しているため if hasOwnProperty
ブロックします for
声明は不要です。
本質的には次のものと同等です。
for(var property in object) {
if(object.hasOwnProperty(property)) {
...
} else {
continue;
}
}
他のヒント
また、私はこのようなものを好むでしょう
function own(obj) {
var ownprops = {};
for (var prop in obj)
if (obj.hasOwnProperty(prop)) ownprops[prop] = 1;
return ownprops;
}
for (var property in own(object)) {
//code
}
見た目は良さそうですが、同じオブジェクトの上に2つのループを伴いますが、パフォーマンスの賢明ではありません。
それを行うもう1つの方法は機能です
function foreach(obj, func, thisp) {
for (var prop in obj)
if (obj.hasOwnProperty(prop)) func.call(thisp, obj[prop], prop);
}
foreach(object, function(val, key) {
//code
});
1つのループのみですが、すべての反復に対して関数が呼び出されますが、これは素晴らしいパフォーマンスではなく、最後のソリューションよりも優れています。また、の価値を巻き起こすことに注意してください this
, 、しかし、その価値をオプションの3番目の引数として明示的に渡すことができます。
いくつかの選択肢。あなたがそれをしている方法、そしてダニエルが説明した方法はうまくいっていて、パフォーマンスの妥協はありません。
また、私はあなたがしないことを指摘したい 持ってる 巻き毛のブレースごとにコードをインデントするために...
1つの要因は、ダグラスクロックフォードを聴くかどうかに依存します。彼の本、JavaScript:The Good Parts、彼はしこります continue
で 悪い 部品。
「Contingステートメントを削除するためにリファクタリングして改善されていないコードを見たことがありません。」 - ダグラス・クロックフォード、JavaScript:良い部分
として ティムダウン 彼のコメントで言及されたクロックフォードは、その本に理由を説明する理由を与えません continue
避けるべきです。しかし、 彼のウェブサイト 彼は、「関数の制御フローを曖昧にする傾向がある」と彼は言います。多くの人が彼を権威だと考えているので、私はクロックフォードの意見についてのみ言及しています。
個人的には、あなたがあなたのループをどのようにコーディングしたかに問題はありません。 continue
簡単に見落とされることのない頂上に現れます。開発者チームと協力していますか?彼らは何をよく理解していますか continue
やりますか?声明の深いネスティングを処理する方法について説明するコードコンベンションドキュメントはありますか?
マコンネル:
多くの休憩を持つループは、ループの構造または周囲のコードにおけるその役割についての不明確な考えを示すかもしれません。過度の休憩の上昇は、ループが一連のループとしてより明確に表現できることをしばしば示します。ブレークの使用は、ループをブラックボックスとして扱う可能性を排除します。 1つのステートメントでループの出口条件を制御して、ループを簡素化します。 「ブレイク」は、ループのコントロールを理解するために、コードを読んでいる人に中を見るように強制し、ループをより困難にします。
Dijkstra:
Breakのような機能は、構造化プログラミングの利点を妨害し、プログラマーが独立ユニットの構成としてプログラムを理解できないようにする傾向があります
継続的なループをこの形式に因数分解できるため、ループをブラックボックスとして扱うことができます。クロフォードは間違っています。臭いがしますが、続行は良いです。
さらなる分析: http://sites.google.com/site/dustingetz/dev/break-and-continue