1

나는 플레이어가 동작 버튼을 클릭 할 수있는 게임을 만들고있다. 이 동작 버튼은 상황에 따라 완전히 다른 작업을 수행합니다.큰 조건문을 어떻게 리팩토링합니까?

function doAction() { 
    if (standingOnItem) { 
     if (itemOnGround === POTION) { 
      if (equippiedItem === POTION) { 
       // mix potions 
       return; 
      } 

      if (equippiedItem === TORCH) { 
       // boil potion 
       return; 
      } 

      // pick up potion 
     } 

     if (itemOnGround === CHEST && equippedItem === KEY) { 
      // open chest 
     } 

     return; 
    } 

    if (equippedItem === POTION) { 
     // put potion on the ground 
    } 

    if (equippedItem === TORCH) { 
     // put out torch and drop it on the ground 
    } 

    if (standingOnStaircase && equippedItem === KEY) { 
     // move down one level 
    } 
} 

위 코드는 예제 코드이지만 doAction 함수에는 이미 50 개 이상의 조건이 있습니다. 그냥 그들을 넣어 어떤 순서로 알고있는 모든 내가 추가 한 모든 문제에 대한 문제가되었습니다. 문제는 모든 다른 조합이 다소 더 독특한 특성을 지니고 있다는 것입니다.

더 좋은 방법으로 어떻게 리팩터링 할 수 있습니까? 내가 사용할 수있는 특정 디자인 패턴이 있습니까?

+0

당신은 같은 변수의 서로 다른 값을 테스트하는 경우 'switch' 문을 사용하여 시작할 수 :

function doAction() { if (standingOnGround) { doOnGroundAction(); } else if (standingOnItem) { doOnItemAction(); } else { doBasicAction(); } } 

그럼 당신은 다른 변수에 따라 행동의지도를 할 수 있습니다. –

+0

https://en.wikipedia.org/wiki/Strategy_pattern – Bergi

답변

1

이 경우 사용자가 서있는 곳과 같은 최상위 수준 결정에 따라 개별 기능으로 분류 할 수있는 것 같습니다.

// Map of item on the ground and item equipped. 
var groundActions = { 
    POTION: { 
     POTION: function() {}, 
     TORCH: function() {} 
    }, 
    CHEST: { 
     KEY: function() { 
      // open chest. 
     } 
    } 
}; 

function doGroundAction() { 
    // If there is an action defined in the map execute it, otherwise 
    // perform some default action. 
    if (groundActions[itemOnGround] && groundActions[itemOnGround][equippedItem]) { 
     groundActions[itemOnGround][equippedItem](); 
    } else { 
     // Some default action. 
    } 
} 
1

이 문제에 접근하는 데는 몇 가지 방법이 있습니다. 당신은 단지 하나의 조건을 테스트하는 경우, switch 문이 정상

는 ... 말했다

switch (action) { 
    case "drop": 
    // handle drop 
    break; 
    case "get": 
    // Handle get 
    break; 
}; 

, 정말 switch 문을 통해 자바 스크립트 객체를 사용하는 것을 선호합니다. 나는 그들이 단지 깨끗하다고 ​​생각한다.

var actions = { 
    get: function(obj) { 
    // handle get 
    }, 
    drop: function(obj) { 
    // handle drop 
    } 
}; 

var verb="get"; 
action[verb](obj);