클린 코드: 클래스
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()
<참고>
'# Development > Methodologies' 카테고리의 다른 글
[성능 테스트] Throughput(TPS), Latency (0) | 2023.02.02 |
---|---|
[클린 코드] 에러 핸들링 (0) | 2023.01.31 |
[클린 코드] 함수 (0) | 2023.01.31 |
[클린 코드] 주석 & 포맷팅 (0) | 2023.01.31 |