我目前正在使用以下代码进行比较,但正如您所看到的,我正在制作吨if语句。有没有办法简化代码并提高效率?
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'
答案 0 :(得分:5)
您可以使用地图
var rules = {
'female': {
'he': 'she',
'his': 'her',
// ...
},
'male': {
'he': 'he',
// ...
},
'default': {
'he': 'he/she'
// ...
}
};
this.gender_ref = rules[gender ? gender : 'default'][grammer];
它是可扩展的,也可以从另一个后端(例如数据库)动态生成。
编辑(由Linus G Thiel撰写)与coffeescript相同:
rules =
female:
he: 'she'
his: 'her'
// ...
male:
he: 'he'
// ...
default:
he: 'he/she'
// ...
@gender_ref = rules[gender or 'default'][grammer]
答案 1 :(得分:2)
考虑使用switch-statement
switch (gender) {
case "1":
alert("");
break;
case "2":
alert("");
break;
case "3":
alert("");
break;
case "4":
alert("");
break;
default:
alert("default");
break;
}
答案 2 :(得分: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]
答案 3 :(得分: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];
}
}
答案 4 :(得分:1)
您可以按如下方式缩短长度:
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];
答案 5 :(得分:1)
如果你一步一步走就很容易。您将学习如何以这种方式重构复杂条件。
首先,请注意您在第一个if
及其后续else if
中进行了常见检查,即if gender?
。您应该将其作为常见检查并重构您的代码,如下所示:
if gender?
...
else # if gender == null
...
这构成了你的主要if和else子句。您将嵌套if并在这些下面切换语句。重构的if / else代码如下:
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'
Coffeescript中的切换可以很好地适应您的情况,使代码具有可读性和简单性。你可以进一步优化它。
这是一个简单的优化,您可以在@gender_ref
语句的开头执行switch
的分配(同样,将公共部分取出):
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子句中不起作用......我想知道为什么)。
答案 6 :(得分:0)
在性能方面,if语句没有任何问题。我不禁想知道这不仅仅是关于可读性。
无论如何,这是另一个仍在使用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';
}