SRP와 ISP 정리한 것입니다. 설계 잘 아시는 분들 도와주세요.
★ 정리 (SRP vs ISP)
분명 SRP와 ISP는 처음 적용할때 모순이 존재하는 것처럼 보인다.
하지만 명백히 SRP와 ISP는 다르다.
SRP : 단일 책임의 원칙 => 즉, 클래스는 하나의 책임을 가진다.
ISP : 인터페이스 격리의 원칙 => 클래스의 사용하지 않는 기능은 인터페이스로 분리되어야한다. 또는 클라이언트는 자신이 사용하지 않는 메소드에 의존관계를 맺으면 안된다. 라는 깊은 뜻이 담겨있다.
여기서 자신이 사용하지 않는 메소드라는 문장에 깊은 관심을 가질 필요가 있다.
여기서 생기는 혼돈(?)은 SRP는 단일 책임을 지닌다고 하였는데.. ISP에 의해 나뉘어진 인터페이스를 구현하면 다수의 책임을 가지고 있는 것이 아닌가? 라는 의문이 생기기 마련이다. 대부분의 설계 원칙을 처음 접한 사람들은 분명 이러한 고민을 해봤을 것이다.
하지만 이것은 SRP와 ISP의 관계를 확실하게 파악하지 못했기 때문이다. 예로 설명하겠다.
게임 오브젝트(GameObject)는 자신을 관리하는 책임을 가진다. (여기서 관리한다라는 말은 그리기와 업데이트가 될 수 있다는 뜻이다. 즉, Update() , Draw() 메소드를 가진다.)
여기서 Update와 Draw 메소드는 다른 객체에서 호출될 수 있다. 정리하자면 GameObject의 Update와 Draw 메소드는 자신이 직접 호출하지 않는다는 뜻이다. 이 말을 간단하게 말하면 GameObject의 Update, Draw 메소드는 다른 클래스 혹은 다른 로직에서 호출될 수있다는 뜻이다. 그렇다면 이 Update, Draw 메소드를 클라이언트는 자신이 사용하지 않는 메소드에 의존관계를 맺으면 안된다. 의 ISP 원칙을 적용하여 인터페이스로 분리한다.
따라서 인터페이스 IDrawable : Draw() , IUpdateable : Update() 인터페이스로 분리해내고, GameObject 는 이 인터페이스 둘을 구현한다.
그리고 게임의 흐름에서 GameObject는 Draw와 Update메소드는 호출되어진다.(이때 DIP의 원칙이 적용될 수 있다.)
이로써 SRP와 ISP의 원칙은 모순이 존재하지 않는다는 것을 알게되었다.
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
요즘 설계에 관해 너무 관심이 많아서 KLDP 회원님들께 질문을 너무 많이합니다. 저도 공부 많이해서 빨리 다른분들 도와주고 싶습니다 ㅠ.ㅠ...
제가 SRP와 ISP를 공부하면서 모순점이 생겼는데.. 이것을 조금더 깊이 공부해서 위와같이 정리하였습니다. 만약 이상하다거나 뭔가 아니다 싶으면 답변 부탁드립니다 ㅠ..
위의 내용처럼 제가 확립한 OOP 5대 설계원칙이 맞다면 KLDP 회원여러분들께 OOP 5대 설계원칙을 정리해서 '강좌' 포럼에 올리고싶습니다.
그럼 답변 기다리겠습니다. 충성!
댓글 달기