我想知道在我的具體情況下使用switch
聲明是否會更好。使用if/else與switch
我正在寫一個Alexa的自定義技能,我需要根據可用的信息(又名插槽)「重定向」到適當的意圖。下面就是我目前(使用if/else
):
if (_type === "IntentRequest") {
this.handler.state = states.START;
if (_slots.indexOf("address") != -1) {
this.emitWithState("GoingToAddressIntent");
} else if (_slots.indexOf("place") != -1) {
this.emitWithState("GoingToPlaceIntent");
} else if (_slots.indexOf("type") != -1) {
this.emitWithState("GoingToTypeIntent");
} else if (_slots.indexOf("purpose") != -1) {
this.emitWithState("GoingToPurposeIntent");
} else {
this.emit("Unhandled");
}
}
我希望_slots
是四個要素的任意排列的數組,[ "address", "place", "type", "purpose" ]
。因此,它可以是任何從[ "address" ]
到[ "place", "purpose" ]
等等,但是總是以相同順序(例如[ "purpose", "address" ]
永遠不會發生)。
比較的順序很重要,因爲有一個「層次」信息;所以如果「地址」插槽存在,我必須emit
"GoingToAddressIntent"
無論什麼其他插槽可用。考慮到這個要求,我認爲使用switch
聲明可能更直接和可讀,儘管必須有一些額外的代碼行來將字符串數組「轉換」爲一組布爾值。它清楚地列出了層次&確保它們按順序進行評估。我可以這樣做:
if (_type === "IntentRequest") {
this.handler.state = states.START;
slots = [
_slots.indexOf("address") != -1,
_slots.indexOf("place") != -1,
_slots.indexOf("type") != -1,
_slots.indexOf("purpose") != -1
]
switch(slots.indexOf(true)) {
case 0:
this.emitWithState("GoingToAddressIntent");
break;
case 1:
this.emitWithState("GoingToAddressIntent");
break;
case 2:
this.emitWithState("GoingToTypeIntent");
break;
case 3:
this.emitWithState("GoingToPurposeIntent");
break;
default:
this.emit("Unhandled");
}
}
...在這種情況下,我有一個額外的線來定義布爾值的數組,使用indexOf()
得到true
文字(因爲所有4個插槽中第一次出現的索引總是按照層次結構的順序),並通過switch語句運行它。然而,我想問問專家他們的想法是什麼,最好的編程實踐是在這種情況下,以及它背後的原因,因爲我希望這成爲一個可維護的長期項目,並且我相信我可以從他們的見解中學到一些東西。
請發表評論,如果你認爲這應該被遷移到另一SE社區,但是從我research(儘管3歲),我相信這應該是很好(我在只是沒有100%的信心這個)。
爲什麼第二個版本使用'.hasOwnProperty()'如果'_slots'是一個數組? (不應該爲每個元素使用'.indexOf()!= - 1'來構建布爾數組嗎?)無論如何,我認爲這兩個版本之間的選擇是一個意見問題。 – nnnnnn
@nnnnnn它有所作爲嗎?我想'in','hasOwnProperty()'和'indexOf()!= -1'基本上都達到了同樣的效果(儘管'in'有它自己的注意事項) – spicypumpkin
如果它們總是處於優先順序,那麼你不需要檢查'_slots'的所有元素。您只需檢查第一個元素,然後相應地執行操作。如果你這樣做,那麼開關就會有意義。 – RJM