I am currently using the following code for parison but as you can see, I am making tonnes of if else statements. Is there a way to simplify the code and make it more efficient?
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'
I am currently using the following code for parison but as you can see, I am making tonnes of if else statements. Is there a way to simplify the code and make it more efficient?
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'
Share
Improve this question
asked Nov 23, 2012 at 8:42
ZhenZhen
12.4k38 gold badges125 silver badges200 bronze badges
7 Answers
Reset to default 5You could use a map
var rules = {
'female': {
'he': 'she',
'his': 'her',
// ...
},
'male': {
'he': 'he',
// ...
},
'default': {
'he': 'he/she'
// ...
}
};
this.gender_ref = rules[gender ? gender : 'default'][grammer];
It's extensible and can also be dynamically generated from another backend (e.g. a DB).
Edit (by Linus G Thiel) The same in coffeescript:
rules =
female:
he: 'she'
his: 'her'
// ...
male:
he: 'he'
// ...
default:
he: 'he/she'
// ...
@gender_ref = rules[gender or 'default'][grammer]
Use map to cache the possible values. You can extend it at any point and will be able to simplify your method:
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];
}
}
Consider to use a switch-statement
switch (gender) {
case "1":
alert("");
break;
case "2":
alert("");
break;
case "3":
alert("");
break;
case "4":
alert("");
break;
default:
alert("default");
break;
}
Use a multi-dimensional hash table.
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]
You could reduse the length a tiny bit as follows:
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'
You can't make it a lot shorter than this, because you have alot of different output options. A swtich / case could be a option, but that would be just as much code.
Another option would be to use a object:
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];
It would be easy if you go step-by-step. You would learn how to refactor plex conditions that way.
First, notice that you have a mon check in the first if
and its subsequent else if
s, that is if gender?
. You should take that out as a mon check and refactor your code as follows:
if gender?
...
else # if gender == null
...
This forms your main if and else clause. You will nest if and switch statements under these. The refactored if/else code is given below:
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'
Switches in Coffeescript can work great for your situation, making the code pretty readable and less plex. You can optimize this further.
Here is a simple optimization, where you do the assignment to @gender_ref
at the beginning of switch
statement (again, taking the mon part out):
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'
You can optimize it even further by moving @gender_ref =
assignment to the parent if (it's not working in the else clause though ... I wonder why).
In terms of performance there is nothing wrong with if statements. I can't help but wonder if this isn't just about readibility.
Anyway here is another option still using if statements.
@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';
}