Today I Learned

단일책임원칙_Single Responsibilty Principle(SOLID 5원칙 중 한가지) - TIL

jjjkh 2023. 7. 27. 21:10

! 정의

작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집궁되어 있어야한다는 원칙입니다.

이는 어떤 변화에 의해 클래스를 변경해야 하는 이뉴는 오직 하나뿐이어야 함을 의미합니다. SPR원리를 적용하면 무엇보다도 책임 영역이 확실해지기 때문에 한 책임의 변경에서 다른 책임의 변경으로의 연쇄작용에서 자유로울 수 있습니다. 뿐만 아니라 책임을 적절히 분배함으로써 코드의 가독성 향상, 유지보수 영이라는 이점까지 누릴 수 있으며 객체지향 원리의 대전제 격인 OCP원리뿐 아니라 다른 원리들을 적용하는 기초가 됩니다. 이 원리는 다른 원리들에 비해서 개념이 비교적 단순하지만, 이 원리를 적용해서 직접 클래스를 설계하기가 그리 쉽지만은 않습니다. 왜냐하면 실무의 프로세스는 매우 복잡 다양하고 변경 또한 빈번하기 때문에 경험이 많지 않거나 도메인에 대한 업무 이해가 부족하면 나도 모르게 SRP원리에서 멀어져 버리게 됩니다. 따라서 평소에 많은 연습과 경험이 필요한 원칙이다.

 

!적용방법

리팩토링에서 소개하는 대부분의 위험한 상황에 대한 해결 방법은 직/간접적으로 SRP원리와 관련이 있으며, 이는 항상 코드를 최상으로 유지한다는 리팩토링의 근본 정신도 항상 객체들의 책임을 최상의 상태로 분해한다는 것에서 비롯 되기 때문입니다.

여러원인에 읜한 변경: Exract Class을 통해 혼재된 각 책임을 각각의 개별 클래스로 분할하여 클래스 당 하나의 책임만 맡도록 하는 것이다. 여기서 관건은 책임만 분리하는 것이 아니라 분리된 두 클래스간의 관계의 복잡도도 줄이도록 설계하는 것이다.Exract Class된 각각의 클래들이 유사하고 비슷한 책임을 중복해서 갖고 있다면 Extract Superclass를 사용할 수 있습니다. 이것은 Extract된 각각의 클래스들의 공유되는 요소를 부모 클래스로 정의하여 부모 클래스에 위임하는 기법입니다. 따라서 각각의 Extract Class들의 유사한 책임들은 부모에게 명백히 위임하고 다른책임들은 각자에게 정의할 수 있습니다. 

산탄총 수술(Shotgun Surgery): Move Field와 Move Method를 통해 책임을 기존의 어떤 클래스로 모으거나 이럴만한 클래스가 없다면 새로운 클래스를 만들어 해결할 수 있습니다. 즉 산발적으로 여러곳에 분포된 책임들을 한 곳에 모으면서 설계를 깨끗하게 합니다. 즉 응집성을 높이는 작업이다.

 

!적용 사례

SRP적용 전

위와 같이 serialNumber는 변화요소로 보지않고 고유정보로 볼 수 있다. 그리고 price와 maker, type, model, backWood, topWood, srtingNum등은 모드 특성 정보군으로 변경이 발생될 수 있는 부분이라고 추론이 가능하다. 따라서 특정 정보군에 변화가 발생하면 해달 클래스 모두를 수정해야하는 부담이 발생하게 됨으로 이런 점에서 SRP적용이 필요한것이다.

 

SRP적용 후

위의 적용 사례를 보면 변경이 될 수 있는 특성 정보군을 다른 클래스로 분리한 것을 확인할 수 있다. 따라서 특성 정보에 변경이 일어난다면 해당 클래스만 변경하게 되는 것이다. 이렇게 코드를 변경하니 가독성도 좋아지고 변경 부분을 쉽게 찾아 변경할수 있는것을 확인할수있다.