私は個人的に、変数に分解します。
var isAEqualToB = a === b
var isCEqualToD = c === d
var isEEqualToA = e === a
var isAOrDTruthy = a || d
var isEEqualToAAndAOrDTruthy = isEEqualToA && isAOrDTruthy
if ((isAEqualToB || isCEqualToD) && isEEqualToAAndAOrDTruthy) {
// Do your thing here
}
多くの人が少ないのラインを持つことは良いコードの兆候であると思いますが、それは間違いなくませです。可読性と保守性は、コードを処理するすべての開発者にとってはるかに意味があります。
非常に理解しやすい変数(条件を説明する変数名を使用)に条件を分割し、単純なものに減らします。完全な条件を小さな関数に分割することも役に立ちます。
もう一つ意味のあるブール式を考えてみましょう。我々は場合にのみ、コードのブロックを実行したいとしましょう:
- それは
-
skyColorの値が「グレー」です
-
午前6時と午後の間であなたの名前は「ozbarry」または「ウェブ - のいずれかですDEV」
- nの値は2またはあなたの現在の例に基づいて
999、我々のようなもので開始したいです:
var skyColor = 'grey';
var name = 'ozbarry';
var n = 2;
if (
// Condition 1, time is between 6am and 2pm
((new Date()).getHours() >= 6 && (new Date()).getHours() <= 14) &&
// Condition 2, skyColor is 'grey'
(skyColor === 'grey') &&
// Condition 3, name is either 'ozbarry' or 'web-dev'
(name == 'ozbarry' || name == 'web-dev') &&
// Condition 4, n is either 2 or 999
(n == 2 || n == 999)
) {
// Do a thing here
}
これは正しいことですが、これは維持する悪夢となります。これはかなり基本的な例です。リファクタリングをしましょう!
まず、変数名は、我々がテストしているものが反映されますので、私たちは、よりよいそれらを追跡し、コメントを削除することができますので、のは、変数にこれらの条件のいくつかを引いてみましょう:
var skyColor = 'grey';
var name = 'ozbarry';
var n = 2;
var isHourBetween6And14 = (new Date()).getHours() >= 6 && (new Date()).getHours() <= 14;
var isSkyGrey = skyColor === 'grey';
var isNameValid = name === 'ozbarry' || name === 'web-dev'
var isN2Or999 = n === 2 || n === 999
if (
isHourBetween6And14 &&
isSkyGrey &&
isNameValid &&
isN2Or999
) {
// Do a thing here
}
これは良いですが、そこまだいくつかの問題があります。コードの観点からは、まだまだ長いか不明確な条件があります。私は主にisHourBetween6And14
を見ているんだけど、最後の二つはまた、いくつかの注意を使用して、それでは意味のある機能の中にこれらを分割しましょうことができます:最後に
function isNumberBetween(value, min, max) {
return value >= min && value <= max
}
function isValueOneOf(value, validValues) {
for(validIdx=0; validIdx < validValues.length; validIdx++) {
if (validValues[validIdx] === value) {
return true;
}
}
return false;
}
var skyColor = 'grey';
var name = 'ozbarry';
var n = 2;
var isHourBetween6And14 = isNumberBetween((new Date()).getHours(), 6, 14)
var isSkyGrey = skyColor === 'grey';
var isNameValid = isValueOneOf(name, ['ozbarry', 'web-dev']);
var isN2Or999 = isValueOneOf(n, [2, 999])
if (
isHourBetween6And14 &&
isSkyGrey &&
isNameValid &&
isN2Or999
) {
// Do a thing here
}
、私がやりたい事は、if文の前に長い結合条件であります。これは、将来の開発者は、それがブロックを実行するかどうかを知るために精神的にロジックを毎回行う必要がありませんが、あなたの条件がはるかに読みやすくなります。これは、物事を行うには、完全に独断的な方法です
function isNumberBetween(value, min, max) {
return value >= min && value <= max
}
function isValueOneOf(value, validValues) {
for(validIdx=0; validIdx < validValues.length; validIdx++) {
if (validValues[validIdx] === value) {
return true;
}
}
return false;
}
var skyColor = 'grey';
var name = 'ozbarry';
var n = 2;
var isHourBetween6And14 = isNumberBetween((new Date()).getHours(), 6, 14)
var isSkyGrey = skyColor === 'grey';
var isNameValid = isValueOneOf(name, ['ozbarry', 'web-dev']);
var isN2Or999 = isValueOneOf(n, [2, 999])
var canDoThing = isHourBetween6And14 && isSkyGrey && isNameValie && isN2Or999;
if (canDoThing) {
// Do a thing here
}
を、最も人々はリファクタリング後にコードが大きくなるのが好きではありませんが、より小さなコードよりも保守可能なコードを持つ方が良いです。
varsがtrueまたはfalseでない限り、trueまたはfalseを返しません。 – dandavis
@dandavisこれは間違いです。 JavaScriptでは、リテラル値以外にも、すべての値が真実性を保持します。たとえば、 'if("真実である "){alert("真実! "); } 'はアラートボックスを実行します。 – OzBarry
@OzBarry:私は、4/5が 'false'なのでOPのIFが常に' false'であるとは限りません。 '0 && 1'は精神的に" not true "を読むので、' x =(0 && 1 || 0) 'は' false'と考えていますが、実際には "0 else 0"結果は「0」です。比較結果ではなくデータム結果。 IF内の式の値は、 'false'とfalseys(' 0'のように)は同じ効果を持ちます。 – dandavis