[내배캠] TIL, WIL/TIL

객체지향 SOLID 원칙

값싼외노자 2022. 12. 28. 15:43

3) 개방-폐쇄 원칙 (Open-Closed Principle, OCP)

의 문제

 

/** OCP Before **/
function calculator(nums, option) {
  let result = 0;
  for (const num of nums) {
    if (option === "add") result += num; // option이 add일 경우 덧셈 연산을 합니다.
    else if (option === "sub") result -= num; // option이 sub일 경우 뺄셈 연산을 합니다.
    // 새로운 연산(기능)을 추가 하기 위해서는 함수 내부에서 코드 수정이 필요합니다.
  }
  return result;
}

console.log(calculator([2, 3, 5], "add")); // 10
console.log(calculator([5, 2, 1], "sub")); // -8

위의 코드는 간단한 계산기 함수인데 현재는 덧셈과 뺄셈만 구현이 되어있다.

만약, 여기서 나눗셈과 곱셉 등을 추가하려고 하지만 OCP 원칙 중 '확장은 가능하나 변경에는 닫혀있어야 한다'는

원칙에 위배될 수 있다.

 

그래서 콜백함수를 사용하여 추가할 수 있다.

 

/** OCP After **/
function calculator(nums, callBackFunc) {
  // option을 CallbackFunc로 변경
  let result = 0;
  for (const num of nums) {
    result = callBackFunc(result, num); // option으로 분기하지 않고, Callback함수를 실행하도록 변경
  }
  return result;
}

const add = (a, b) => a + b; // 함수 변수를 정의합니다.
const sub = (a, b) => a - b;
const mul = (a, b) => a * b;
const div = (a, b) => a / b;
console.log(calculator([2, 3, 5], add)); // add 함수 변수를 Callback 함수로 전달합니다.
console.log(calculator([5, 2, 1], sub)); // sub 함수 변수를 Callback 함수로 전달합니다.

이렇게 수정하면 calculator 함수를 건드리지 않고 수정은 할 수 있으나 여기서 문제가 발생하였다.

바로 뺼셈과 곱셈을 할때 버그를 발생하는 것이다.

 

이 강의의 자료에서는 리설트라는 변수에 0을 준 다음 각 계산 결과를 처리하였지만 이렇게 되면 5 - 2 - 1 이 -8이 되는

어처구니 없는 결과가 나오게 된다. 이걸 고치려면 결국 함수안의 코드를 고쳐야하는데 ...

 

어떻게 고쳐야할까 솔리드의 O 원칙에 위배되지 않게 ...

 

'[내배캠] TIL, WIL > TIL' 카테고리의 다른 글

TIL  (0) 2022.12.31
TIL  (0) 2022.12.29
노드JS 프리티어  (1) 2022.12.26
노드JS 스웨거  (0) 2022.12.26
로그인 문제  (0) 2022.12.23