본문 바로가기

# Development/Methodologies

[클린 코드] 클래스

클린 코드: 클래스

1. 단일 책임 원칙(SRP)을 지킨다.
하나의 클래스는 하나의 책임만 가진다.

2. 응집도를 높인다.
응집도가 높을수록 클래스의 메서드들은 인스턴스 변수들을 많이 사용한다.

### as-is
class LowCohesion:
    def __init__(self):
        self.a = ...
        self.b = ...
        self.c = ...

    def process_a(self):
        print(self.a)

    def process_b(self):
        print(self.b)

    def process_c(self):
        print(self.c)
### to-be
class HighCohesion:
    def __init__(self):
        self.abc = ...

    def process_a(self):
        self.abc.process_a()

    def process_b(self):
        self.abc.process_b()

    def process_c(self):
        self.abc.process_c()

3. 변경하기 쉽게 만든다.

기존의 기능을 수정하거나 새로운 기능을 추가 할 때 코드의 변경을 최소화 한다. 추상화를 통해 구체 클래스에 의존하지 않고 추상 클래스(인터페이스)에 의존하도록 코드를 짤 수 있다.

 

추상클래스란(abstract class)?

  • 매서드의 목록만 가진 클래스
  • 자식클래스에 해당 추상 메소드를 반드시 구현하도록 강제한다.

추상클래스 사용방법

1. import로 abc 모듈(abstract base class)을 가져온다. 
2. 클래스 괄호() 안에 metaclass=ABCMeta 지정한다.
3. 매서드 위에@abstractmethod를 붙여서 추상 매서드로 지정한다.

from abc import *

class 추상클래스명(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def 추상메소드(self):
        ...

 

다음은 추상 메서드를 사용한 예시이다.

### as-is
class Developer:
    def coding(self):
        print("코딩을 합니다")

class Designer:
    def design(self):
        print("디자인을 합니다")

class Analyst:
    def analyze(self):
        print("분석을 합니다")

class Company:
    def __init__(self, employees): #구체 클래스에 의존합니다. 
        self.employees = employees

    # employee가 다양해질수록 코드를 계속 변경해야 한다.
    def make_work(self):
        for employee in self.employees:
            if isinstance(employee, Developer):
                employee.coding()
            elif isinstance(employee, Designer):
                employee.design()
            elif isinstance(employee, Analyst):
                employee.analyze()
### to-be
class Employee(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def work(self):
        ...

class Developer(Employee):
    def work(self):
        print("코딩을 합니다")

class Designer(Employee):
    def work(self):
        print("디자인을 합니다")

class Analyst(Employee):
    def work(self):
        print("분석을 합니다")

#상속을 통해 쉽게 구현이 가능함 -> 확장에 열려있다.
class Manager(Employee):
    def work(self):
        print("매니징을 합니다")

class Company:
    def __init__(self, employees: List[Employee]): #추상 클래스에 의존합니다.
        self.employees = employees

    # employee가 늘어나더라도 변경에는 닫혀있다.
    def make_work(self):
        for employee in self.employees:
            employee.work()

 

 

<참고>

  1. https://yansfil.github.io/awesome-class-materials/
  2. https://dojang.io/mod/page/view.php?id=2389

'# Development > Methodologies' 카테고리의 다른 글

[성능 테스트] Throughput(TPS), Latency  (0) 2023.02.02
[클린 코드] 에러 핸들링  (0) 2023.01.31
[클린 코드] 함수  (0) 2023.01.31
[클린 코드] 주석 & 포맷팅  (0) 2023.01.31