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 원칙에 위배되지 않게 ...