Closed kjsu0209 closed 3 years ago
개인적인 의견을 드리자면, 인터페이스부터 만드는게 맞다고 봅니다. 오브젝트를 먼저 구현하게 되면 특정 기술에 종속되는 메서드 정의를 할 수 밖에 없다고 생각합니다. 그리고 오브젝트를 작성할 때는 인터페이스를 기준점으로 생각하여 설계할 수 있어야 하지, 그 반대가 되어서는 인터페이스의 추상화 난이도가 올라갈 것이라고 생각합니다.
Which comes first - The Interface or the Class
해당 질문의 Stack Overflow의 답에서는 의견이 조금 다릅니다.
위에서 말하길,
공통 기능을 가진 클래스가 여러 개 있을 때까지는 인터페이스가 무엇인지 예측하기 어렵다고 합니다.
따라서, 여러 구현 클래스를 작성한 후 리펙토링을 통해 공통 기능을 추출한 다음에 인터페이스를 작성하라고 되어있습니다.
즉, [구현 클래스 -> 리펙토링 -> 인터페이스 생성]의 순서로 이루어진다고 합니다.
조금 더 읽어보니, TDD 방식을 사용하면 다음과 같은 과정이 이루어 진다고 합니다.
1. Test를 먼저 한다.
2. 해당 Test를 통과 할 수 있는 코드를 구현한다.
3. 테스트를 통과하는 과정에서 기존 클래스의 공통 기능을 추출하여 인터페이스를 만드는 과정이 있을 수 있다
따라서, 인터페에스에 어떤 내용이 들어갈 지 미리 추측하지 말라네요
조금 더 읽어보니, TDD 방식을 사용하면 다음과 같은 과정이 이루어 진다고 합니다.
1. Test를 먼저 한다. 2. 해당 Test를 통과 할 수 있는 코드를 구현한다. 3. 테스트를 통과하는 과정에서 기존 클래스의 공통 기능을 추출하여 인터페이스를 만드는 과정이 있을 수 있다
따라서, 인터페에스에 어떤 내용이 들어갈 지 미리 추측하지 말라네요
공통 기능을 추출하는데 있어서 어떤 메서드의 역할과 클래스의 책임 등을 분리하다보면 추상화가 점점 더 어려워질 것으로 봤는데 그 반대군요...
619페이지 두 번째 문단 인터페이스 분리 원칙 설명하는 부분 읽다가 졸려서 한 눈에 볼 수 있게 그려봤습니다..
이 부분에서는 오브젝트의 기능을 관심사에 따라 인터페이스로 분리해 놓아서 A가 B1이 제공하는 기능만 사용할 수 있게 한다고 나옵니다.
그러면 한 가지 궁금한 점이 생기는데, 오브젝트를 먼저 만들어 두고 오브젝트에서 제공하는 기능을 클라이언트가 요구하는 것에 맞게 인터페이스로 분리하는 게 맞는지, 또는 클라이언트가 필요로 하는 기능에 대한 인터페이스를 만들어 두고 이를 적절히 구현하는 오브젝트를 만드는지 궁금합니다.
객체지향 프로그래밍의 이론대로 보면 오브젝트부터 먼저 생각해야 될 것만 같은데, 구현할 때는 일종의 가이드라인인 인터페이스부터 만드니 뭐가 맞는지 모르겠습니다.