2009-10-05 1 views

답변

36

)

해당 인터페이스의 모든 클래스를 그림자 할 필요가 없습니다.

더 많은 구현을 나중에 만들지도 필요한 경우 언제든지 인터페이스를 추출 할 수 있습니다.

+3

+100 내가 할 수만 있다면 사용하지 않는 인터페이스를 어디서나 생성하는 것이 역효과를냅니다. 당신이 그것을 필요로 할 때, 그것은 리팩토링하는 사람에게는 사소한 것이고, 하나는 추출하는 것입니다. – slf

+1

동의. 단일 구현이있는 내부 클래스에는 인터페이스가 필요하지 않습니다. 인터페이스는 외부 API의 일부를 구성하는 경우 흥미로울 수 있습니다. 따라서 예상하지 못한 방식으로 인터페이스를 사용하는 사람들은 구현을 확장해야합니다. –

+1

테스트 방법은 어떻습니까? 즉, EasyMock은 인터페이스 용 모의 객체 만 만듭니다. – folone

5

하나의 구체적인 구현 만 있다면 인터페이스가 있어야합니까? 난 당신이해야하지 생각

+2

맞지만 그게 답이 아니라 질문입니다. –

+2

@ Jason : 좋은 질문은 종종 가장 좋은 대답입니다. (소년은 질문으로 쓰기를 원했고 ;-)) –

13

이 질문은 세분화입니다. 불필요한 인터페이스로 코드를 복잡하게 만들 수는 없지만 레이어 간의 경계면에서 유용합니다.

언젠가이 인터페이스에 의존하는 클래스를 테스트 해 볼 수 있습니다. 그렇다면 조롱 할 수 있다는 것이 좋습니다.

저는 항상 인터페이스를 만들고 제거합니다. 인터페이스입니다. 일부는 노력할 가치가 없으며 일부는 실제로 필요합니다. 내 직관이 대부분 맞지만 일부 리팩토링이 필요합니다.

+0

요즘 우리는 클래스를 모의하기 위해 Mockito (또는 비슷한 테스트 프레임 워크)를 사용합니다. . 스텁 클래스를 수동으로 생성하고 종속성을 조롱하기 위해 (Mockito를 사용하는 대신) 단위 테스트에 의존성을 주입해야했던 시대의 인터페이스를 만드는 관행 이었습니까? 그것이 사실이라면 저에게 많은 의미가 있습니다. – Atif

0

== 인터페이스를 만들기 위해 많은 비용이 들지 않습니다 유명한 마지막 말

를 "오직 하나의 구현을해야 할 것"후에서 구체적인 클래스를 파생. 이를 수행하는 과정은 설계를 다시 생각하게하고 더 나은 최종 제품으로 이어질 수 있습니다. 그리고 한번 해보았 으면 자주 들르는 단어를 먹는다면 늘 걱정할 필요가 없습니다. 너 이미 설정 됐어. 반면 그렇지 않으면 리팩토링 더미가 생겨 고통 스러울 것입니다.

명확히하기 위해 편집 됨 :이 클래스는 상대적으로 광범위하게 퍼질 것이라는 가정하에 작업하고 있습니다. 하나의 패키지에 하나 또는 두 개의 다른 클래스가 사용하는 작은 유틸리티 클래스라면, 걱정하지 마십시오. 다중 다른 클래스에 의해 여러 패키지에서 사용될 클래스 인 경우 이전 대답이 적용됩니다. 귀하의 질문에

+2

조언을 따르면, 무의미한 인터페이스와 공장이 무척 쌓여있을 것이고, 고통이 될 것입니다. "인터페이스 프로그래밍"*을 위해 클래스 수를 세 배로 늘리면 유지 보수 비용이 들게됩니다. –

+0

@Michael Borgwardt : 그래, 나는 아마도 내가 수업 규모에 대한 잘못된 가정을하고 있음을 깨달았다. * 모든 * 작은 클래스의 인터페이스는 좋지 않습니다. 하지만 주변에 퍼져있는 더 중요한 것들을위한 인터페이스는 좋은 것입니다. 비록 당신이 단지 하나의 구현만을 가질지라도 말입니다. 리팩터링이 항상 쉽지는 않습니다. –

1

두 다소 충돌 답변 :

  1. 당신이 만드는 모든 단일 구상 클래스에서 인터페이스를 추출 할 필요가 없으며,
  2. 대부분의 자바 프로그래머들이 많은 인터페이스를 구축하지 않습니다 할까요.

대부분의 시스템 (심지어 "제거 가능한 코드")은 원래 설계가 의도 한 것보다 훨씬 진화하여 변경됩니다. 인터페이스는 커플 링을 줄임으로써 유연하게 성장할 수 있도록 도와줍니다.

  1. 는 당신도 당신이 당신의 데이터 액세스 개체를 XML을해야 할 수도 있습니다 의심되는 경우 다른 구체적인 클래스는, 같은 (동일한 인터페이스가 필요합니다 의심 마십시오 : 일반적으로, 여기에 인터페이스로 코딩 할 당신이한다고 경고 신호입니다 표현의 길 - 내가 경험 한 것)?
  2. 코드가 웹 서비스 계층의 다른 쪽에서 살아야한다고 생각합니까?
  3. 코드가 외부 클라이언트의 서비스 계층을 형성합니까?

이러한 모든 질문에 정직하게 대답 할 수 없다면 인터페이스가 과도 할 수도 있습니다. 힘. 그러나 예기치 않은 결과가 프로그래밍 게임의 이름입니다.

0

질문은 다음과 같아야합니다. "구체적인 구현은 어떻게 될 것입니까?

어떻게 완전히 확신 할 수 있습니까?

당신이 이것을 생각할 때쯤에는 이미 인터페이스를 만들었을 것이며 잘못된 것으로 판명 될 수있는 가정없이 진행될 것입니다.

오늘날의 코딩 도구 (예 : Resharper)를 사용하면 수업과 함께 인터페이스를 만들고 유지 관리하는 데 많은 시간이 걸리는 반면 추가 구현이 필요하다는 것을 알게되고 모든 구체적인 참조를 대체하면 오랜 시간과 전혀 재미가 없다 - 날 믿어.

1

공용 기능을 지정하여 프로그래밍 인터페이스가 무엇인지 결정해야합니다. 좋은 일을하지 않으면 수업을 사용하기 어려울 것입니다.

따라서 공식 인터페이스를 만들어야 할 경우 나중에 사용할 준비가되어 있어야합니다.

그래서 인터페이스를 디자인해야하지만 인터페이스로 작성한 다음 구현할 필요가 없습니다. http://www.infoq.com/presentations/integration-tests-scam

클래스해야하는 3 가지 이유가 있습니다 :

0

이의 많은 InfoQ에 이야기 Rainsberger에서 가져

  1. 그것은 어떤 가치를 보유하고 그것을 어떤 엔티티를 지속하는 데 도움이
  2. 일부 서비스를 수행합니다.

대다수의 서비스는 h ave 인터페이스. 경계를 만들고, 구현을 숨기며, 이미 두 번째 클라이언트가 있습니다. 해당 서비스와 상호 작용하는 모든 테스트.

기본적으로 모의 테스트에서 모의 ​​테스트를 원한다면 인터페이스가 있어야합니다.

2

YAGNI가 - 당신은 곧, 유혹의 순간에 필요하지 않습니다 코드를 작성하지만, 미래에있을 수있는 YAGNI 접근 방식을 옹호하는 사람들에 따르면 Wikipedia

에서 그것을 필요로하지 않고,있는 다음과 같은 단점이 있습니다.

* The time spent is taken from adding, testing or improving necessary functionality. 
* The new features must be debugged, documented, and supported. 
* Any new feature imposes constraints on what can be done in the future, so an unnecessary feature now may prevent implementing a necessary feature later. 
* Until the feature is actually needed, it is difficult to fully define what it should do and to test it. If the new feature is not properly defined and tested, it may not work right, even if it eventually is needed. 
* It leads to code bloat; the software becomes larger and more complicated. 
* Unless there are specifications and some kind of revision control, the feature may not be known to programmers who could make use of it. 
* Adding the new feature may suggest other new features. If these new features are implemented as well, this may result in a snowball effect towards creeping featurism. 
1

필자는 코드를 작성하기 위해 테스트 중심 접근 방식을 사용합니다. 이것은 종종 테스트 피팅의 일부로 모의 (mock) 또는 더미 구현을 제공하고자하는 인터페이스를 생성하게 만듭니다.

필자는 테스트와 관련성이 없으면 일반적으로 코드를 작성하지 않으며 테스트 케이스에 대한 종속성을 제공 할 때 인터페이스가 필요한 경우 구현 만하면 인터페이스를 쉽게 테스트 할 수 없으므로 인터페이스를 작성할 수 있습니다. .

또한 리팩토링, 중복 제거 또는 코드 가독성 개선을 위해 인터페이스를 만들 때도 있습니다.

나중에 필요할 때 인터페이스를 소개하도록 코드를 리팩터링 할 수 있습니다.

유일한 예외는 API 변경을위한 비용이 높은 제 3 자에게 출시 할 API를 설계하는 경우입니다. 이 경우 미래에해야 할 수도있는 변경 유형을 예측하고 향후 호환되지 않는 변경 사항을 최소화하기 위해 API를 만드는 방법을 연구 할 수도 있습니다.

1

아무도 언급하지 않은 한 가지 사실은 숙련도 문제를 피하기 위해 때로는 필요하다는 것입니다. 의존성이 거의없는 공통 프로젝트에서 인터페이스를 가질 수 있으며 많은 의존성을 가진 별도의 프로젝트에서 구현할 수 있습니다.