단일 책임 원칙 (Single Responsibility)
위키에 검색해보면 module, class, function은 하나의 파트에 대해서만
responsibility를 가져야한다. 라고 써있다.
매우 쉬운 원칙이기도하고 당연한 원칙이기도한데
프로그래밍을 처음 배우시는 분들이 놓치는 내용이기도하다.
간단한 예를 들어보겠다.
두 수를 더해주는 함수에 add함수와
숫자를 출력해주는 함수 numPrint를 만들 수 있다.
def add(num1,num2):
return num1+ num2
def numPrint(num):
print(num)
두 함수를 보면 add함수는 두수를 더해서 리턴해주고,
numPrint함수는 넘겨받은 숫자를 출력해준다.
각각 하나의Responsibility를 가지고 만들어진 함수이다.
근데 이제 굳이 함수의 수를 줄이기 위해서 합쳐 있는 함수를 만들 필요는 없다.
def addPrint(num1, num2):
num = num1 + num2
print(num)
return(num)
이러한 함수 예제는 너무 쉬우니까
class 예제를 들어보겠다.
#고양이라는 클래스를 만들고
class Cat:
#이와 이름을 속성으로 만들 수 있다.
def __init__ (self,age,name):
self.age = age
slef.name = name
# 고양이가 할 수있는 일에는 먹는것, 걷는것, 말하는 것들이 있다.
def eat(self,food):
pass
def walk(self,food):
pass
def speaak(self,food):
pass
#고양이의 상태를 출력해주는 ptint 함수
def pritnt(self):
pritnt(f"age:{self.age} name:{slef.name}")
#고양이 상태를 로그로 남기는 고양이 함수를 만드는 경우
def log(self.logger):
logger.log(f"age:{self.age} name:{slef.name}")
logger.log(datetime.now)())
그런데 우리가 고양이에 대해서 생각할 때
먹기 > 걷기 > 말하기 같은 동작을 하는건 당연한데
print하기 log 남기기 등은 우리가 아는 고양이의 기능은 아니다.
Single Responsibility에 맞지않는것이다.
이런 경우는 고양이 클래스에서
print함수와 log 함수를 뺘줘야합니다.
그럼 고양이 class에서 print, log함수는 삭제해주는 대신
다른 방식으로 두개의 기능을 구현해야한다.
그 방법에는 고양이의 상태를 나타내는
representation 함수를 만들어 줄 수 있다.
class Cat:
def __init__ (self,age,name):
self.age = age
slef.name = name
def eat(self,food):
pass
def walk(self,food):
pass
def speaak(self,food):
pass
def repr(self):
return f"age:{self.age} name:{slef.name}"
#고양이를 사용하는 클라이언트코드에서는 그 상태를 리턴래주는
# representation 함수를 가져다가 print를 해주는 방법으로 로그를 남기는 방법사용
kitty = Cat()
print (kitty.repr())
logger.log(kitty.repr())
이렇게하면 고양이 클래스에는
고양이와 관련된 함수들만 남게되고
Single Responsibility 원칙을 준수하게 된다.
'DesignPattern' 카테고리의 다른 글
Architecture EDA(Event Driven Architecture) 마틴 파울러의 4가지 구현 패턴에 대해 (0) | 2023.05.08 |
---|---|
AOP 입문자를 위한 기초 개념 : Spring을 사용하지 않는 AOP 구현 방법 (0) | 2022.12.29 |
MSA 아키텍쳐 (0) | 2022.10.05 |
디자인 패턴 SOLID : Open- closed principle 개방 폐쇄 원칙 (1) | 2022.10.05 |