IF_ELSE 조건을 리팩터링하는 방법

if-else 작성은 프로그래머의 일상 업무입니다. 코드를 작성할 때마다 무언가가 참인지 거짓인지 확인합니다. 그러나 if-else 조건을 너무 많이 작성하면 코드를 읽을 수 없게 됩니다. 다음은 if-else 블록을 리팩터링하기 위해 따르는 몇 가지 단계입니다.

메서드 호출:



때로는 하나의 매개변수를 기반으로 다른 작업을 수행해야 했습니다.

class SomeClass {
  public action(status: string) {
    if (status === 'draft') {
      //Do some operations
    } else if (status === 'confirmed') {
      //Do some operations
    } else if (status === 'payed') {
      //Do some operations
    } else if (status === 'shipped') {
      //Do some operations
    }
  }
}


매개 변수 값을 기반으로 메서드를 호출하여 이를 개선할 수 있습니다.

class SomeClass {
  public action(status: string) {
    if (typeof this[status] === 'undefined') {
      //Throw your exception, do some default operations and return
    }
    return this[status]()
  }

  public draft() {
    //Do the draft operations
  }

  public confirmed() {
    //Do the confirm operations
  }

  public payed() {
    //Do the payed operations
  }

  public shipped() {
    //Do shipped operations
  }
}


객체 리터럴:



매개변수에 따라 하나의 값만 반환해야 하는 경우 객체 리터럴을 사용할 수 있습니다.

if (operator === '=') {
  return a === b;
} else if (operator === '<') {
  return a < b;
} else if (operator === '>') {
  return a > b;
} else if (operator === '>=') {
  return a >= b;
} else if (operator === '<=') {
  return a <= b;
} else if (operator === 'like') {
  return String(a).toLowerCase().includes(String(b).toLowerCase());
}


리팩토링

action(operator) {
    const operators = {
      '=': (a, b) => a === b,
      '<': (a, b) => a < b,
      '>': (a, b) => a > b,
      '>=': (a, b) => a >= b,
      '<=': (a, b) => a <= b,
      like: (a, b) => String(a).toLowerCase().includes(String(b).toLowerCase()),
    };

    if (typeof operators[operator] === 'undefined') {
      //Do your operation and return
    }
    return operators[operator];
 }


참고: 공장 설계 패턴을 사용할 수도 있습니다. 하지만 대부분의 경우 과잉일 것입니다.

좋은 웹페이지 즐겨찾기