-
Open-closed Principlepython/SOLID 2023. 12. 6. 20:27
정의
Open for extension but closed for modification.
위반 코드
class Employee: def __init__(self, name): self.name = name class Manager(Employee): def __init__(self, name, department): super().__init__(name) self.department = department def print_employee(e): if type(e) is Employee: print(f"{e.name} is an employee") elif type(e) is Manager: print(f"{e.name} leads department {e.department}")
- print_employee() 작성을 위해서는 모든 Employee 타입(Employee, Manager) 을 알아야 한다.
- 새로운 Programmer(Employee) 타입을 추가한다면, 클래스 선언 후 추가적으로 print_employee() 도 잊지 않고 수정해야 한다.
- Manager 클래스가 더 이상 필요없어 삭제한다면, Manager 클래스 정의를 삭제 후 print_employee() 도 잊지 않고 수정해야 한다.
- 다른 모듈에서 사용할 때 마다 아래 처럼 Employ, Manager 가 import 되어야 한다.
# Database module from employees import Employee from employees import Manager def save_employee(e): if type(e) is Employee: ... elif type(e) is Manager: ...
개선 코드
class Employee: def __init__(self, name): self.name = name def get_info(self): return f"{self.name} is an employee" class Manager(Employee): def __init__(self, name, department): super().__init__(name) self.department = department def get_info(self): return f"{self.name} leads department {self.department}" def print_employee(e): print(e.get_info())
- 만약 새로운 Programmer(Employee) 타입을 추가한다면, print_employee() 에 전혀 영향을 주지 않고 아래처럼 추가할 수 있다.
class Programmer(Employee): def __init__(self, name, programming_language): super().__init__(name) self.programming_language = programming_language def get_info(self): return f"{self.name} programs in {self.programming_language}"
- Manager 클래스가 더 이상 필요없어 삭제한다면, print_employee() 에 영향을 주지 않고 Manager 클래스 정의만 삭제하면 된다.
참고: https://www.udemy.com/course/solid-design-principles-with-python
'python > SOLID' 카테고리의 다른 글
Dependency Inversion Principle (0) 2023.12.06 Interface Segregation Principle (0) 2023.12.06 Liskov Substitution Principle (0) 2023.12.06 Single Responsibility Principle (0) 2023.12.05