JavaBookStudy / JavaBook

책읽기 스터디
https://javabookstudy.github.io/
Apache License 2.0
19 stars 2 forks source link

[토비의 스프링] 7.4.1 인터페이스를 사용해야 하는 이유 두 번째 #124

Closed kjsu0209 closed 3 years ago

kjsu0209 commented 3 years ago

image

619페이지 두 번째 문단 인터페이스 분리 원칙 설명하는 부분 읽다가 졸려서 한 눈에 볼 수 있게 그려봤습니다..

이 부분에서는 오브젝트의 기능을 관심사에 따라 인터페이스로 분리해 놓아서 A가 B1이 제공하는 기능만 사용할 수 있게 한다고 나옵니다.

그러면 한 가지 궁금한 점이 생기는데, 오브젝트를 먼저 만들어 두고 오브젝트에서 제공하는 기능을 클라이언트가 요구하는 것에 맞게 인터페이스로 분리하는 게 맞는지, 또는 클라이언트가 필요로 하는 기능에 대한 인터페이스를 만들어 두고 이를 적절히 구현하는 오브젝트를 만드는지 궁금합니다.

객체지향 프로그래밍의 이론대로 보면 오브젝트부터 먼저 생각해야 될 것만 같은데, 구현할 때는 일종의 가이드라인인 인터페이스부터 만드니 뭐가 맞는지 모르겠습니다.

daebalprime commented 3 years ago

개인적인 의견을 드리자면, 인터페이스부터 만드는게 맞다고 봅니다. 오브젝트를 먼저 구현하게 되면 특정 기술에 종속되는 메서드 정의를 할 수 밖에 없다고 생각합니다. 그리고 오브젝트를 작성할 때는 인터페이스를 기준점으로 생각하여 설계할 수 있어야 하지, 그 반대가 되어서는 인터페이스의 추상화 난이도가 올라갈 것이라고 생각합니다.

taxol1203 commented 3 years ago

Which comes first - The Interface or the Class

해당 질문의 Stack Overflow의 답에서는 의견이 조금 다릅니다.

위에서 말하길,
공통 기능을 가진 클래스가 여러 개 있을 때까지는 인터페이스가 무엇인지 예측하기 어렵다고 합니다.

따라서, 여러 구현 클래스를 작성한 후 리펙토링을 통해 공통 기능을 추출한 다음에 인터페이스를 작성하라고 되어있습니다.

즉, [구현 클래스 -> 리펙토링 -> 인터페이스 생성]의 순서로 이루어진다고 합니다.

taxol1203 commented 3 years ago

조금 더 읽어보니, TDD 방식을 사용하면 다음과 같은 과정이 이루어 진다고 합니다.

1. Test를 먼저 한다.  
2. 해당 Test를 통과 할 수 있는 코드를 구현한다.
3. 테스트를 통과하는 과정에서 기존 클래스의 공통 기능을 추출하여 인터페이스를 만드는 과정이 있을 수 있다

따라서, 인터페에스에 어떤 내용이 들어갈 지 미리 추측하지 말라네요

daebalprime commented 3 years ago

조금 더 읽어보니, TDD 방식을 사용하면 다음과 같은 과정이 이루어 진다고 합니다.

1. Test를 먼저 한다.  
2. 해당 Test를 통과 할 수 있는 코드를 구현한다.
3. 테스트를 통과하는 과정에서 기존 클래스의 공통 기능을 추출하여 인터페이스를 만드는 과정이 있을 수 있다

따라서, 인터페에스에 어떤 내용이 들어갈 지 미리 추측하지 말라네요

공통 기능을 추출하는데 있어서 어떤 메서드의 역할과 클래스의 책임 등을 분리하다보면 추상화가 점점 더 어려워질 것으로 봤는데 그 반대군요...