2013-04-25 2 views
4

인터페이스가 하나뿐입니다. 다음 쌍은 간단한 Java 객체를 나타냅니다. 그 인터페이스를 제거하고 객체를 직접 사용하고 싶습니다. 그러나 나는 그것이 필요한 시점과 그것이 왜 그렇게 설계되었는지 이해하고 싶다. 단위 테스트 커버리지를 완화하지 않는 것은 분명히 완료되었습니다. 그렇다면 왜 내 프로젝트에는 하나의 구현만을 가진 인터페이스가 있습니까? 감사합니다. .구현이 하나만있는 인터페이스가 필요합니까?

+0

코드 또는 간략화 된 코드를 표시 하시겠습니까? –

+0

코드에 특정 방법이있는 이유는 한 사람 만 말할 수 있습니다. 코드 작성자는 프로그래머입니다. 그 사람에게 왜 그들이 한 짓을했는지 물어 보지 않으시겠습니까? –

+2

그 사람이 자바에서 훌륭하거나 끔찍했기 때문에. (더 많은 코드가 필요합니다) – Zyerah

답변

10

인터페이스는 프로젝트를 확장/변경할 때 유용합니다. 예를 들어, 텍스트 파일에 데이터를 저장하여 프로젝트를 시작한 다음 데이터베이스에서 변경하도록 결정한 경우. 이 둘 모두가 동일한 인터페이스를 구현하고 있다면, 첫 번째 인터페이스를 두 번째 인터페이스로 바꾸는 것은 매우 간단합니다. 특정 구현을 사용하는 클래스에서 스와핑하는 경우입니다. 하나의 구현을위한 인터페이스를 가지고 무의미한 것처럼 보일 수 있습니다 동안 예를 들어, 단순히

IStorage storage = new DBStorage(); 

IStorage storage = new FileStorage(); 

을 변경, 나중에 당신에게 리팩토링 많은 노력을 절약 할 수 있습니다.

+4

나는 마지막 줄을 답으로 만받습니다. –

+0

이 리팩토링을 수행하는 IDE를 사용하는 경우 나중에이를 변경할 수 있습니다 (사용하는 모든 소스에 액세스 할 수있는 경우). –

+1

@PeterLawrey 좋은 코딩 방법을 IDE의 기능으로 대체 하시겠습니까? 그건 나쁜 생각 같아. FileStorage로 다시 전환하거나 세 번째 저장소 유형을 추가하려면 어떻게해야합니까? 또는 사용자가 저장소 유형을 선택할 수도 있습니다. 핵심 코드 기반을 변경할 필요가 없도록 세부 사항 및 구현을 추출하면 IMO가 더 나은 접근 방식이 될 수 있습니다. – Despertar

1

구현에 대한 인터페이스를 정의하고 프로그램에서 인터페이스를 사용하는 경우에는 항상 새 구현을 작성하고이를 사용하는 클래스의 코드를 변경하지 않고 이전 구현으로 자유롭게 바꿀 수 있습니다.

구현이 아닌 인터페이스를 사용하는 것이 좋습니다. 변경 요구 사항이 덜 유해합니다.

0

코드에 대한 단위 테스트를 수행하고 있다면 (원하는 경우) 일부 스텁 구현으로 클래스 사용을 모방 할 필요가있을 가능성이 큽니다. 적어도 유닛 테스트를 위해서는 인터페이스가 필요합니다.

P. Mockito와 같은 현대 조롱 프레임 워크는 수업을 기반으로 한 모의 작업을 수행 할 수 있으므로 기술적으로 인터페이스없이이 작업을 수행 할 수 있습니다. 그러나 (나를 위해) 해킹과 같은 느낌입니다. 인터페이스가 사용해야하는 장소이기 때문입니다.

1

다릅니다. 그러나 그렇게 나쁜 생각은 아닙니다.

C와 많은 버전의 Pascal에서는 구현과 인터페이스를 분리하는 것이 익숙한 방법입니다. 컴파일러는 변경 사항에 의존하는 구현이있을 때 불필요한 모듈 재 컴파일을 피할 수 있습니다.

Java에서는 일반적으로 컴파일러가 문제되지 않습니다. Java는 다른 클래스가 특정 클래스의 세부 사항에 의존 할 수있는 범위를 제한하는 public, protected, private 및 package-private (암시 적) 액세스 클래스를 제공합니다. Javadoc는 불필요하고 불필요한 세부 사항을 생략하는 문서를 (기본값으로) 제공합니다. 우리는 또한 YAGNI의 널리 홍보 된 원칙을 가지고 있습니다 : "당신이 필요 없을 것"이라면 그것을 엔지니어링하지 마십시오.

그럼에도 불구하고 구현을 사용하는 대신 Java에서 명시 적 인터페이스를 사용하면 특정 클래스의 사용자가 의존해야하는 구조와 동작에 대해 명확한 추가 기회를 얻을 수 있습니다. 여러 인터페이스를 구현하는 기능은 특정 클래스의 사용자가 구현의 하나 이상의 특정 측면 (예 : Serializable 특성)에 대한 종속성을 지정할 수도 있음을 의미합니다.

1

때로는 인터페이스를 사용하는 것이 유용 할 수 있다고 생각하는 경우가 있습니다. 이것은 항상 나쁜 것은 아니지만 때로는 단지 노력의 낭비 일뿐입니다.당신이 실제로 당신은 당신이 그들을 필요가 예견하지 때, 필요할 때 YAGNI

의 원칙에서

항상 일을 구현합니다.

관련 문제