JavaScript新手在这里,当我遇到一个用于创建对象的辅助函数时,我正在编写一些js代码,就像这样
createElement = function(name, data){
if(name == TYPES.TEXT){
return new Text(data);
}
else if(name == TYPES.WORD){
return new Word(data);
}
else if(name == TYPES.PARAGRAPH){
return new Paragraph(data);
}
else if(name == TYPES.TABLE){
return new Table(data);
}
<list goes on and on and on... >
}
虽然这确实完成了工作,但我想知道是否有更好,更清晰的写作方式。
答案 0 :(得分:9)
你是对的,过多的if..then
或switch
逻辑是code smell,并且几乎总能被重构为更优雅的东西。在这种情况下,基于名称的工厂可以重构为字典,其中key作为名称,值作为返回函数
var dictionary = {};
dictionary[TYPES.TEXT] = Text;
dictionary[TYPES.WORD] = Word;
dictionary[TYPES.PARAGRAPH] = Paragraph;
dictionary[TYPES.TABLE] = Table;
createElement = function(name, data){
return new dictionary[name](data);
}
编辑: createElement
方法中的那一行可以/应该首先检查是否为传入的TYPES.*
配置了一些内容。一个好方法是检查是否有在尝试调用该方法之前,字典中的元素。
return (typeof dictionary[name] == 'function') ? new dictionary[name](data) : some_default_value;
答案 1 :(得分:0)
使用switch语句会有点干净但在语义上相同。
function createElement(name,data){
switch(name)
{
case TYPES.TEXT:
return new Text(data)
break;
case TYPES.WORD:
return new WORD(data)
break;
default:
// etc. code to be executed if no values match
}
}