6/23 I Learned

진정한 SRP란?

오늘 지인이 준비하는 Clean Code 세션을 같이 보면서 SRP에 대해서 더 깊이 이해하게 되었다.

Clean Code 중의 내용은 Switch문에 대한 내용이었고, 이를 피해야 한다는 것이었다. 그러면서 나온 예제는 직원 유형에 따라서 다른 값을 계산해 반환하는 함수였다.

public Money calculatePay(Employee e) throws InvalidEmployeeType {
		switch(e.type) {
	case COMMISSIONED:
		return calculateCommissionedPay(e);
	case HOURLY:
		return calculateHourlyPay(e);
	case SALARIED:
		return calculateSalariedPay(e);
	default:
		throw new InvalidEmployeeType(e.type);
	}
}

이 코드는 객체지향적으로 바라보았을 때 SRPOCP를 위반한다고 한다. OCP(개방 폐쇄 원칙)에 대해서는 이해가 가는데, 왜 SRP 측면에서 이것이 위반된 것인지 이해가 가지 않았다.

SRP(단일 책임 원칙)

단일 책임 원칙은 보통 하나의 클래스는 하나의 역할만을 가진다.라고 이해하지만 이는 잘 와닿지 않는다.

여기서 말하는 역할이란 무엇일까? 역할은 해당 클래스가 수행하는 일을 말한다. 인간으로 따지면, 나에게는 학생으로서 수행하는 책임이 있고 딸로서 수행하는 책임이 있을 것이다. 그런 것들이 각각이 책임이 된다.

그리고 이러한 책임이 달라진다면, 코드를 수정해야 할 것이다. 예를 들어서 내가 학생으로 원래는 항상 B+ 이상의 성적을 받아야 했지만, A+을 받는 것으로 바뀐다면, 이 책임에 대한 로직을 변경해야 할 것이다. 하지만 위의 학생으로서 수행하는 책임과 딸로서 수행하는 책임이 혼재되면, 결국 이러한 책임에 대해서 같은 클래스를 계속 변경해야한다.

이렇게 다른 여러개의 책임을 같이 구현하게 된다면 해당 책임이 서로 관계를 맺으면서 책임에 대한 변경이 다른 하나의 책임 때문에 엉키거나 변경 자체가 불가능하게 될 수 있을 것이다.

그래서 단일 책임 원칙은 하나의 클래스의 변경 이유는 단 한가지여야 한다.라는 말로 설명할 수 있다.

추가로 이런 SRP의 변경의 이유는 사용자와 이해 관계자를 일컫기 때문에, 하나의 모듈은 오직 하나의 액터에 대해서만 책임져야 한다.라고 정의할 수 있다.




참고 포스팅
OOP 설계원칙 – SRP편 – GIS Developer


minzoovv
Written by@minzoovv
성장하고 있는 개바라기 입니다 :D

GitHubInstagram