반응형
Open Closed Principle 개방-폐쇄 원칙
정의 : SW entities(클래스, 모듈, 함수등)의 확장에는 열려있고 코드 수정에는 닫혀있어야 하는 원칙
조금 더 직관적으로 말하면 기존의 코드 수정없이 새로운 클래스등을 프로그램에 추가하는 것을 의미한다.
개방-폐쇄 원칙을 지키지 않은 경우에는 클래스가 추가 될 때마다 기존 코드의 수정이 발생하게 되는 문제가 있다.
클래스가 한두개 추가된다면 문제가 없겠지만 수십개가 추가되는 경우라면 OCP 원칙을 기억하면 좋겠다.
개방-폐쇄 원칙을 위반한 예
예를들어 HRManager에서 모든 Employee의 Salary를 계산해야 한다고 가정하자.
아래와 같이 디자인한 경우 각자의 Employee(Developer, Staff, Marketer)의 salary계산 함수가 존재한다.
이렇게 되면 수정에 열려있고 확장에 닫혀있는 문제가 생긴다.
int calculateAlLEmployeeSalary(Employee[] e) {
int totalSalary = 0;
for(int i = 0; i < e.size(); i++) {
if(e[i].empType == Developer)
totalSalary += (Developer)e[i].calculateDeveloperSalary();
else if(e[i].empType == Staff)
totalSalary += (Staff)e[i].calculateStaffSalary();
else if(e[i].empType == Marketer)
totalSalary += (Marketer)e[i].calculateMarketerSalary();
else
throw Exception;
}
return totalSalary;
}
위의 코드 기반으로 만약 Manager라는 Employee를 상속받는 클래스를 추가해야 한다면 어떨까? 계속해서 if/else가 증가하는 코드가 될 것이다.
따라서 이는 OCP를 위반한 사례라고 볼 수 있다. 이를 해결하기 위해서 필요한 개념이 인터페이스를 통한 추상화 이다.
아래의 구조와 같이 abstract method인 calculateSalary로 인터페이스를 통한 추상화를 구현했다.
이렇게 되면 자연스럽게 Employee를 사용하는 쪽은 코드 변경없이 확장이 가능해진다.
int calculateAlLEmployeeSalary(Employee[] e) {
int totalSalary = 0;
for(int i = 0; i < e.size(); i++) {
totalSalary += e[i].calculateSalary();
}
return totalSalary;
}
반응형
'객체지향프로그래밍' 카테고리의 다른 글
[SOLID 원칙] 5. Dependency Inversion Principle 의존관계 역전 원칙 (0) | 2022.01.16 |
---|---|
[SOLID 원칙] 4. Interface Segregation Principle 인터페이스 분리 원칙 (0) | 2022.01.16 |
[SOLID 원칙] 3. Liskov Substitution Principle 리스코프 치환 원칙 (0) | 2022.01.09 |
[SOLID 원칙] 1. Single Responsibility Principle 단일 책임 원칙 (0) | 2022.01.09 |
객체지향 패러다임 (0) | 2022.01.01 |