ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Open-closed Principle
    python/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

    댓글

Designed by Tistory.