인터페이스가 하나뿐입니다. 다음 쌍은 간단한 Java 객체를 나타냅니다. 그 인터페이스를 제거하고 객체를 직접 사용하고 싶습니다. 그러나 나는 그것이 필요한 시점과 그것이 왜 그렇게 설계되었는지 이해하고 싶다. 단위 테스트 커버리지를 완화하지 않는 것은 분명히 완료되었습니다. 그렇다면 왜 내 프로젝트에는 하나의 구현만을 가진 인터페이스가 있습니까? 감사합니다. .구현이 하나만있는 인터페이스가 필요합니까?
답변
인터페이스는 프로젝트를 확장/변경할 때 유용합니다. 예를 들어, 텍스트 파일에 데이터를 저장하여 프로젝트를 시작한 다음 데이터베이스에서 변경하도록 결정한 경우. 이 둘 모두가 동일한 인터페이스를 구현하고 있다면, 첫 번째 인터페이스를 두 번째 인터페이스로 바꾸는 것은 매우 간단합니다. 특정 구현을 사용하는 클래스에서 스와핑하는 경우입니다. 하나의 구현을위한 인터페이스를 가지고 무의미한 것처럼 보일 수 있습니다 동안 예를 들어, 단순히
IStorage storage = new DBStorage();
에
IStorage storage = new FileStorage();
을 변경, 나중에 당신에게 리팩토링 많은 노력을 절약 할 수 있습니다.
나는 마지막 줄을 답으로 만받습니다. –
이 리팩토링을 수행하는 IDE를 사용하는 경우 나중에이를 변경할 수 있습니다 (사용하는 모든 소스에 액세스 할 수있는 경우). –
@PeterLawrey 좋은 코딩 방법을 IDE의 기능으로 대체 하시겠습니까? 그건 나쁜 생각 같아. FileStorage로 다시 전환하거나 세 번째 저장소 유형을 추가하려면 어떻게해야합니까? 또는 사용자가 저장소 유형을 선택할 수도 있습니다. 핵심 코드 기반을 변경할 필요가 없도록 세부 사항 및 구현을 추출하면 IMO가 더 나은 접근 방식이 될 수 있습니다. – Despertar
구현에 대한 인터페이스를 정의하고 프로그램에서 인터페이스를 사용하는 경우에는 항상 새 구현을 작성하고이를 사용하는 클래스의 코드를 변경하지 않고 이전 구현으로 자유롭게 바꿀 수 있습니다.
구현이 아닌 인터페이스를 사용하는 것이 좋습니다. 변경 요구 사항이 덜 유해합니다.
코드에 대한 단위 테스트를 수행하고 있다면 (원하는 경우) 일부 스텁 구현으로 클래스 사용을 모방 할 필요가있을 가능성이 큽니다. 적어도 유닛 테스트를 위해서는 인터페이스가 필요합니다.
P. Mockito와 같은 현대 조롱 프레임 워크는 수업을 기반으로 한 모의 작업을 수행 할 수 있으므로 기술적으로 인터페이스없이이 작업을 수행 할 수 있습니다. 그러나 (나를 위해) 해킹과 같은 느낌입니다. 인터페이스가 사용해야하는 장소이기 때문입니다.
다릅니다. 그러나 그렇게 나쁜 생각은 아닙니다.
C와 많은 버전의 Pascal에서는 구현과 인터페이스를 분리하는 것이 익숙한 방법입니다. 컴파일러는 변경 사항에 의존하는 구현이있을 때 불필요한 모듈 재 컴파일을 피할 수 있습니다.
Java에서는 일반적으로 컴파일러가 문제되지 않습니다. Java는 다른 클래스가 특정 클래스의 세부 사항에 의존 할 수있는 범위를 제한하는 public, protected, private 및 package-private (암시 적) 액세스 클래스를 제공합니다. Javadoc는 불필요하고 불필요한 세부 사항을 생략하는 문서를 (기본값으로) 제공합니다. 우리는 또한 YAGNI의 널리 홍보 된 원칙을 가지고 있습니다 : "당신이 필요 없을 것"이라면 그것을 엔지니어링하지 마십시오.
그럼에도 불구하고 구현을 사용하는 대신 Java에서 명시 적 인터페이스를 사용하면 특정 클래스의 사용자가 의존해야하는 구조와 동작에 대해 명확한 추가 기회를 얻을 수 있습니다. 여러 인터페이스를 구현하는 기능은 특정 클래스의 사용자가 구현의 하나 이상의 특정 측면 (예 : Serializable 특성)에 대한 종속성을 지정할 수도 있음을 의미합니다.
때로는 인터페이스를 사용하는 것이 유용 할 수 있다고 생각하는 경우가 있습니다. 이것은 항상 나쁜 것은 아니지만 때로는 단지 노력의 낭비 일뿐입니다.당신이 실제로 당신은 당신이 그들을 필요가 예견하지 때, 필요할 때 YAGNI
의 원칙에서
항상 일을 구현합니다.
- 1. 얼마나 복잡한 인터페이스가 필요합니까?
- 2. 우리는 왜 인터페이스가 필요합니까?
- 3. 역할 공급자 구현이 필요합니까?
- 4. RESTful 웹 서비스의 인터페이스가 필요합니까?
- 5. 왜 JPA에서 많은 인터페이스가 필요합니까?
- 6. 왜 우리는 IAudioRenderClient 인터페이스가 필요합니까
- 7. 공유 계약에 IExtensibleDataObject 인터페이스가 필요합니까?
- 8. Go의 인터페이스가 강제로 적용되지 않으면 필요합니까?
- 9. 왜 자바에서 개인 중첩 된 인터페이스가 필요합니까?
- 10. IDisposable with destructor : thread-safe 구현이 필요합니까?
- 11. 속성 만있는 하위 클래스에는 구현이 필요합니까?
- 12. 오버 헤드의 가치가있는 자세한 MouseListener 구현이 필요합니까?
- 13. Java 인터페이스가 예외를 throw하지만 인터페이스 구현이 예외를 throw하지 않습니다?
- 14. 인터페이스가 구현자를 알고 있습니다.
- 15. 주성분이 하나만있는 PCA 플롯
- 16. SelectedItem이 하나만있는 다중 목록보기
- 17. 감속기가 하나만있는 경우
- 18. 인터페이스 메소드 구현이 필요합니다.
- 19. 인터페이스가 너무 일반적입니다.
- 20. 로그인 시스템이있는 웹 응용 프로그램에 OAuth 서버 구현이 필요합니까?
- 21. paypal 클라이언트가 직접 지불 처리 호출을하려면 expresschekcout 구현이 필요합니까?
- 22. MBR에 활성 파티션이 하나만있는 이유는 무엇입니까?
- 23. 하나만있는 것으로 모든 것을 대체하십시오
- 24. 인증 포인트가 하나만있는 멀티 사이트
- 25. Regex에서 슬래시가 하나만있는 URL을 찾습니다.
- 26. IEDriver 구현이 테스트에 실패했습니다.
- 27. 필요합니까? 아니면 그냥 저장소가 필요합니까?
- 28. Assembly.GetExportedTypes는 구현이
- 29. GoF의 구현이
- 30. 자바 클래스가 하나만있는 특정 xml 레이아웃 표시
코드 또는 간략화 된 코드를 표시 하시겠습니까? –
코드에 특정 방법이있는 이유는 한 사람 만 말할 수 있습니다. 코드 작성자는 프로그래머입니다. 그 사람에게 왜 그들이 한 짓을했는지 물어 보지 않으시겠습니까? –
그 사람이 자바에서 훌륭하거나 끔찍했기 때문에. (더 많은 코드가 필요합니다) – Zyerah