안녕하세요. 도미닉입니다.
저번에 SOLID 에 대해 정리해보았습니다. SOLID 원칙
시간이 좀 지났고 자세히 더 알아보고 싶어서 각 원칙에 대해 글을 작성하고자 합니다.
SOLID 는 5가지 원칙을 가지고 있습니다.
이번에는 첫번째 S에 해당하는 SRP 에 대해 정리해보겠습니다.
SRP (Single Responsibility Principle)
한글로는 단일 책임 원칙입니다.
객체는 하나의 기능과 책임을 가져야만 한다는 원칙입니다.
코드로 풀어서 설명을 해보겠습니다.
아래와 같이 스마트폰 객체가 있습니다.
스마트폰에는 기능이 거의 무한적으로 있으나 이 코드에서는 call과 showYoutube만 있는 것으로 하겠습니다.
이제 스마트폰에 갤럭시 폴드가 나와서 접혀있는 상태가 추가된다라고 하면 아래와 같이 스마트폰을 수정할 수 있을 것입니다.
하지만 위와 같이 작성하면 SmartPhone 중 갤럭시 폴드가 아닌 스마트폰들은 항상 isFolded 값이 False 일 것입니다.
이러할 때 아래 SRP가 안 지켜진 사례를 참고하면 SRP 원칙에 위반됩니다.
SRP가 안 지켜진 사례
변수레벨
- 하나의 속성이 여러 의미를 갖는 경우
- 어떤 곳에서는 쓰고, 어떤 곳에선 안 쓰는 속성이 있는 경우
메소드레벨
- 분기 처리를 위한 if문, switch문이 많은 경우
위 사례 중 어떤 곳에선 안 쓰는 속성이 있는 경우에 포함되기 때문에 SRP를 위반합니다.
이럴 때는 SmartPhone 객체를 상속받는 갤럭시 폴드 객체를 아래처럼 만들어서 SRP를 지킬 수 있습니다.
또한 앞으로 폴더 폰이 많이 생길 것을 예상하고 아래처럼 프로토콜을 활용할 수 있습니다.
다른 예를 보겠습니다.
아래와 같이 titleForHeaderInSection 메소드를 구현할 수 있습니다.
식당의 등급에 따라 헤더가 보여집니다.
이러할 때 식당의 등급이 필요한 코드마다 분기 처리를 위한 if문, switch문이 반복될 것 입니다.
이럴 때는 열거형을 활용할 수 있습니다.
위와 같이 등급을 저장하는 열거형을 작성하면 각 케이스에 맞는 이름을 메소드로 받아올 수 있습니다.
위와 같이 titleForHeaderInSection 메소드에서는 분기 처리를 하지않고 등급의 이름을 헤더로 뿌려줄 수 있습니다.
정리
오늘은 SOLID 원칙 중 SRP에 대해 정리해봤습니다.
위에 SRP가 안 지켜진 사례를 유념하고 이러한 상황이 발생할 때 상속이나 프로토콜, 열거형 등을 이용해 SRP가 잘 지켜지는 코드를 작성하면 좋을 것입니다.
읽어주셔서 감사합니다.