2012-11-23 109 views
2

我目前使用以下代碼進行比較,但正如您所看到的,我正在製作if if else語句。有沒有簡化代碼並使其更高效的方法?如何簡化多個嵌套if else語句的代碼

getGenderRef: (grammer=nil) -> 
    @gender_ref = "" 
    gender = this.get('gender') 
    if gender? and gender == 'male' 
    if grammer == 'he' 
     @gender_ref = 'he' 
    else if grammer == 'his' 
     @gender_ref == 'his' 
    else if grammer == 'him' 
     @gender_ref == 'him' 
    else if gender? and gender == 'female' 
    if grammer == 'he' 
     @gender_ref = 'she' 
    else if grammer == 'his' 
     @gender_ref == 'her' 
    else if grammer == 'him' 
     @gender_ref == 'her' 
    else if gender? or gender == null 
    if grammer == 'he' 
     @gender_ref = 'he/she' 
    else if grammer == 'his' 
     @gender_ref == 'his/her' 
    else if grammer == 'him' 
     @gender_ref == 'him/her' 

回答

5

你可以使用地圖

var rules = { 
    'female': { 
     'he': 'she', 
     'his': 'her', 
     // ... 
    }, 
    'male': { 
     'he': 'he', 
     // ... 
    }, 
    'default': { 
     'he': 'he/she' 
     // ... 
    } 
}; 

this.gender_ref = rules[gender ? gender : 'default'][grammer]; 

它是可擴展的,也可以從其他後端(如數據庫)動態生成。

編輯(由Linus摹泰爾)在CoffeeScript中的一樣:

rules = 
    female: 
    he: 'she' 
    his: 'her' 
    // ... 
    male: 
    he: 'he' 
    // ... 
    default: 
    he: 'he/she' 
    // ... 

@gender_ref = rules[gender or 'default'][grammer] 
2

考慮使用switch語句

switch (gender) { 
    case "1": 
    alert(""); 
    break; 
    case "2": 
    alert(""); 
    break; 
    case "3": 
    alert(""); 
    break; 
    case "4": 
    alert(""); 
    break; 
    default: 
    alert("default"); 
    break; 
} 
1

你可以reduse長一點點如下:

getGenderRef: (grammer=nil) -> 
    @gender_ref = "" 
    gender = this.get('gender') 
    if gender? and gender == 'male' 
    if grammer == 'he' 
     @gender_ref = 'he' 
    else if grammer == 'his' 
     @gender_ref == 'his' 
    else if grammer == 'him' 
     @gender_ref == 'him' 
    else if gender? and gender == 'female' 
    if grammer == 'he' 
     @gender_ref = 'she' 
    else if grammer == 'his' or grammer == 'him' 
     @gender_ref == 'her' 
    else if gender? or gender == null 
    if grammer == 'he' 
     @gender_ref = 'he/she' 
    else if grammer == 'his' 
     @gender_ref == 'his/her' 
    else if grammer == 'him' 
     @gender_ref == 'him/her' 

你不能使它比這短很多,因爲你有很多不同的輸出選項。 一個swtich/case可能是一個選項,但這將是一樣多的代碼。

另一種選擇是使用對象:

references = { 
    'male': { 
     'he': 'he', 
     'his': 'his', 
     'him': 'him' 
    }, 
    'female': { 
     'he': 'she', 
     'his': 'her', 
     'him': 'her' 
    }, 
    'null':{ 
     'he': 'he/she', 
     'his': 'his/her', 
     'him': 'him/her' 
    } 
} 
//Access: 
gender_ref = references[gender ? gender : 'null'][gender_ref]; 
+0

Felix剛剛建議這不是什麼嗎? Btw默認不再起作用,因爲您將密鑰名稱更改爲空。 –

+0

我想,但我只在發佈後纔看到。我們不能使用'null'字符串作爲關鍵嗎? – Cerbrus

+0

你的地圖看起來驚人地等於費利克斯的版本,相同的引號,相同的順序,相同的變量名稱...... – Christoph

2

使用多維哈希表。

grammarByGender = { 
    "male": { "he" : "he", "his": "his", "him": "him" }, 
    "female": {"he" : "she", "his" :"her", "him":"her"}, 
    "neuter": {"he":"he/she","his":"his/her","him":"him/her"} 
} 

@gender_ref = grammarByGender[this.get("gender")][grammer] 
+0

很好的答案。我喜歡使用'「neuter」':)。它有CoffeeScript和JS語法的混合。我建議使用Coffee的無支撐對象文字來減少代碼的擁擠程度,並在'grammarByGender'訪問中添加一個條件,所以在沒有性別時使用'neuter'。 [實施例](http://goo.gl/bhT0C)。 – epidemian

+0

並且[這是另一個示例](http://coffeescript.org/#try:makeGrammar%20%3D%20%28he%2C%20his%2C%20him%29%20-%3E%20%7Bhe%2C% 20his%2C%20him%7D%0A%0AgrammarByGender%20%3D%0A%20%20male%3A%20makeGrammar%20%22he%22%2C%20%22his%22%2C%20%22him%22%0A% 20%20female%3A%20makeGrammar%20%22she%22%2C%20%22her%22%2C%20%22her%22%0A%20%20neuter%3A%20makeGrammar%20%22he%2Fshe%22%2C% 20%22his%2Fher%22%2C%20%22him%2Fher%22%0A%0A%40gender_ref%20%3D%20grammarByGender [%40get%28%22gender%22%29%20%3F%20%22neuter%22 ] [grammer])使用一個小函數來避免一些代碼重複:) – epidemian

2

使用map來緩存可能的值。您可以在任何時候進行擴展,並能夠簡化你的方法:

var genders = { 
    "male" : { 
     "he": "he", 
     "his": "his", 
     "him": "him" 
    }, 
    "female" : { 
     "he": "she", 
     "his": "her", 
     "him": "her" 
    }, 
    "null": { 
     "he": "he/she", 
     "his": "his/her", 
     "him": "him/her" 
    } 
} 

function getGenderRef (grammer) { 
    var gender_ref = "", 
     availableGenders = genders[this.get('gender')]; 

    if (availableGenders) { 
     gender_ref = availableGenders[grammer]; 
    } 
} 
+0

是的,費利克斯已經給出了正確的答案 –

0

在性能方面並沒有什麼錯,如果語句。我不禁想知道這不僅僅是可讀性。

無論如何,這裏還有一個選項仍然使用if語句。

@gender_ref = grammer; // male values are the same so use as default 

if( gender == "female") { 

    if(grammer == 'he') @gender_ref = 'she'; 
    if(grammer == 'his') @gender_ref = 'her'; 
    if(grammer == 'him') @gender_ref = 'her'; 

} else if ( !gender) { // if not defined 

    if(grammer == 'he') @gender_ref = 'he/she'; 
    if(grammer == 'his') @gender_ref = 'his/her'; 
    if(grammer == 'him') @gender_ref = 'him/her'; 
} 
+0

通過用'if if'替換'if if'你正在改變代碼的行爲... – Christoph

+0

@Christoph完成了! – Bruno

+0

缺少嵌套'if'太...;) – Christoph

1

如果你一步一步走,這將是容易的。您將學習如何以這種方式重構複雜的條件。

首先,請注意,您在第一個if及其後的else if s,即if gender?中有一個共同的支票。您應該將其作爲常見檢查並重構您的代碼,如下所示:

if gender? 
    ... 
    else # if gender == null 
    ... 

這形成了您的主要if和else子句。你將嵌套if和switch語句。重構後的if/else代碼如下:在CoffeeScript中

if gender? 
    if gender == 'male' 
     switch grammer 
     when 'he' then @gender_ref = 'he' 
     when 'his' then @gender_ref = 'his' 
     when 'him' then @gender_ref = 'him' 
    else if gender == 'female' 
     switch grammer 
     when 'he' then @gender_ref = 'she' 
     when 'his' then @gender_ref = 'her' 
     when 'him' then @gender_ref = 'her' 
    else # if gender == null 
    switch grammer 
     when 'he' then @gender_ref = 'he/she' 
     when 'his' then @gender_ref = 'his/her' 
     when 'him' then @gender_ref = 'him/her' 

交換機可以爲您的情況工作的偉大,使代碼漂亮可讀和不太複雜。您可以進一步優化。


下面是一個簡單的優化,你在哪裏switch發言開始做作業到@gender_ref(再次,以公共部分出):由

if gender? 
    if gender == 'male' 
     @gender_ref = switch grammer 
     when 'he' then 'he' 
     when 'his' then 'his' 
     when 'him' then 'him' 
    else if gender == 'female' 
     @gender_ref = switch grammer 
     when 'he' then 'she' 
     when 'his' then 'her' 
     when 'him' then 'her' 
    else # if gender == null 
    @gender_ref = switch grammer 
     when 'he' then 'he/she' 
     when 'his' then 'his/her' 
     when 'him' then 'him/her' 

您可以優化其更進一步移動@gender_ref =分配給父母如果(它不工作在else子句,雖然...我不知道爲什麼)。