2013-02-04 33 views
3

將這個塊是什麼樣的使用if/else語句,而不是三元?替換嵌套條件運營商的if/else在此塊

返回值== NULL? name.local? attrNullNS:attrNull:typeof運算 值=== 「功能」? name.local? attrFunctionNS:attrFunction: name.local? attrConstantNS:attrConstant;

(我想一定是我做的另一種解決類似的15塊之前這個權利......理想情況下,我想,以取代所有這些塊用正則表達式,但似乎沒有方法?Replace conditional operator with if/else automatically?

回答

0

這篇真快,僅通過更換三元運營商,但我猜它看起來像這個有很多:

if (value == null) { 
    if (name.local) { 
     return attrNullNS; 
    }else{ 
     return attrNull; 
    } 
}else if (typeof value === "function") { 
    if (name.local) { 
     return attrFunctionNS; 
    }else{ 
     return attrFunction; 
    } 
}else{ 
    if (name.local) { 
     return attrConstantNS; 
    }else{ 
     return attrConstant; 
    } 
} 
2

好問題。

首先,我同意,誰離開你這個代碼的開發應該LARTed。

但是,如果您考慮到the syntax for the Conditional Operator is LogicalORExpression ? AssignmentExpression : AssignmentExpression or … : AssignmentExpressionNoInthe longest possible match wins,則可以計算出該結果(無代碼格式化程序,如Eclipse JSDT)。

屬於相同的原子條件運算表達式相鄰,但無法通過? S或: S於雙方劃定,因爲語法不允許。所以只要把自己成作品根據ECMAScript的語法;-)反覆問自己這個問題:「可以將此代碼由生產該目標的符號產生的?」一個LL(N)解析器的位置;如果答案是「否」,則回溯到較短的匹配,直到它可以,否則如果沒有生產工作,則會出現語法錯誤。

  1. return(value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant);
  2. return (value == null ?(name.local ? attrNullNS : attrNull):(typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant));
  3. return ((value == null)? (name.local ? attrNullNS : attrNull) : ((typeof value === "function")?(name.local ? attrFunctionNS : attrFunction):(name.local ? attrConstantNS : attrConstant)));

於是:

if (value == null) 
{ 
    if (name.local) 
    { 
    return attrNullNS; 
    } 
    else 
    { 
    return attrNull; 
    } 
} 
else 
{ 
    if (typeof value === "function") 
    { 
    if (name.local) 
    { 
     return attrFunctionNS; 
    } 
    else 
    { 
     return attrFunction; 
    } 
    } 
    else 
    { 
    if (name.local) 
    { 
     return attrConstantNS; 
    } 
    else 
    { 
     return attrConstant; 
    } 
    } 
} 

(CMIIW)這可以被進一步降低到

if (value == null) 
{ 
    if (name.local) 
    { 
    return attrNullNS; 
    } 

    return attrNull; 
} 

if (typeof value === "function") 
{ 
    if (name.local) 
    { 
    return attrFunctionNS; 
    } 

    return attrFunction; 
} 

if (name.local) 
{ 
    return attrConstantNS; 
} 

return attrConstant; 
0

三元運算符的語法( 「分組」)和無阻塞如果-else語句非常相似,因此您可以從替換爲if (…)和每個:else。然後圍繞每個包裝return聲明,並使用自動縮進。也許你甚至可以通過自動更換仔細(分步)執行一些這些任務。你會以

if (value == null) 
    if (name.local) 
     return attrNullNS; 
    else 
     return attrNull; 
else if (typeof value === "function") 
    if (name.local) 
     return attrFunctionNS; 
    else 
     return attrFunction; 
else if (name.local) 
    return attrConstantNS; 
else 
    return attrConstant; 
+0

希望他們最終會得到含有大括號的東西。 – PointedEars

+0

@PointedEars:如果您認爲它們提高了可讀性,那麼您的自動縮進應該能夠添加它們。我故意忽略它們來表明我的觀點,即無條件的條件語句非常像無支撐的三元運算符。 – Bergi

+0

你在說什麼?自動縮進本身*不能*自動添加大括號。比可讀性更重要的是可維護性。當不僅有一條語句依賴於條件表達式時,此代碼將開始失敗。 – PointedEars