2011-08-23 6 views
7

자바 스크립트 초보자, 여기는 직장에서 몇 가지 js 코드를 통해 갈 때이JavaScript 객체 생성

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

당신은 [스위치 구조]에 관심이있을 수 있습니다 (https://developer.mozilla.org/en/JavaScript/Reference/Statements/switch) ... – DaveRandom

답변

9

맞습니다. 과도한 if..then 또는 switch 로직은 code smell이며 거의 항상 더 세련된 것으로 리팩터링 될 수 있습니다. http://jsfiddle.net/KkMnd/

편집 : 그 선이 경우, 이름에 따라 공장은

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; 
+0

더 나은 자신의 대답을 좋아합니다. – Prospero

+0

+1 그리고이 솔루션에 대한 또 다른 좋은 점은 만약 당신의'TYPES'가 확장되어야한다면, 당신은'switch '로해야 할 * logic *을 변경할 필요가 없다는 것입니다. – peirix

+3

+1이 패턴의 이름을 단순화하고 언급하기 위해 (공장 패턴). 나에게 우려되는 점은 OP가 마지막 "_else_"진술을 언급하지 않았기 때문이며, 예를 들어 여기에서도 OP를 구현해야한다는 것입니다. 'return (typeof dictionary [name]! = 'undefined')? dictionary [name] (data) : something_goes_here;'(something_goes_here를 아무것도 찾지 못하면 예상 결과로 대체하십시오.) – Tadeck

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 
} 
}