인터페이스가 구체적인 클래스에 의존해도 괜찮습니까?


9

사용자 정의 오류 처리기를 위해 Java로 인터페이스를 만들고 있습니다.

인수 오류 객체를 전달하고 싶지만 Exception클래스의 자식이어야 합니다.

인터페이스에서 정의 된 클래스 이름을 사용해도 괜찮습니까?

구현에 의존하지 않는다는 점에서 인터페이스가 적지 않습니까?

나는 이런 식으로하려고합니다.

public class CustomException {
    /* ... Implementation ... */
}

public interface Interface {

    void onError(CustomException ex);

}

인터페이스에서 다른 클래스를 상속해도 괜찮은지 묻고 싶습니까?
스눕

@StevieV 아니요. 질문을 편집했습니다.
nikachx

1
@AndresF. 이것은 단지 예일 뿐이며 인터페이스에서 클래스 사용에 관한 모든 OO 언어에 적용될 수 있습니다.
nikachx

3
말해보십시오 : CustomException구현의 일부입니까 아니면 인터페이스의 일부입니까?
user253751

2
@nikachx "안전하다"는 말의 의미를 이해하지 못합니다. 어떤 방법으로 String보다 안전 CustomException합니까? 만약 CustomException다른 의존성이 있다면 왜 중요한가 ?
Andres F.

답변:


2

먼저CustomException 확장되지 않는 사실을 지적해야 Exception하므로 실제로는 아닙니다 Exception.

그것은 말했다 :

당신이 걱정하지 않는 경우 의존 관계 역전 원칙 그대로, 다음을 둡니다. 그것은 완벽하게 괜찮 인터페이스 콘크리트 클래스에 의존하는 예를 들어, 많은 인터페이스에 의존 String하거나 Object구체적인 클래스있는 . 문제는 Java SDK에 속하는 클래스가 작성하는 클래스보다 코드가 변경되지 않는 것보다 안정적이라고 생각하는 경향이 있다는 것입니다.

다른 손에:

DIP를 따르고 싶다면 (여러 가지 이점이 있으며 권장 사항입니다) 다음 두 가지 중 하나를 수행해야합니다.

옵션 1

  • CustomException초록 만들기
  • 계속 void onError(CustomException ex)그대로

옵션 2

  • CustomException인터페이스 만들기
  • 계속 void onError(CustomException ex)그대로

이러한 옵션 중 하나를 사용하면 인터페이스가 구체적인 클래스에 의존하지 않고 추상화에만 의존하기 때문에 DIP를 준수하게됩니다.

의존성 역전의 직접 적용에서, 초록은 상위 / 정책 계층에 의해 소유됩니다. 이 아키텍처는 상위 / 정책 구성 요소와 하위 패키지를 정의하는 요약을 동일한 패키지로 그룹화합니다. 하위 계층은 이러한 추상 클래스 또는 인터페이스 의 상속 / 구현에 의해 생성됩니다 . Martin, Robert C. (2003).

  • 민첩한 소프트웨어 개발, 원칙,> 패턴 및 실습. 프렌 티스 홀. 127-131 쪽. ISBN 978-0135974445.

1
추상 클래스 또는 구체적 (최종) 클래스를 받아들이는 것에는 큰 차이가 없으며 인터페이스의 차이는 그 이상입니다. 인스턴스가 매개 변수로 전달되고 구현시 하드 코딩되지 않은 한 DI의 기초가됩니다.
Jacob Raihle

@JacobRaihle 구현에 하드 코딩 된 인스턴스를 전달한다는 것은 무엇을 의미합니까?
Tulains Córdova

"통과 되고 하드 코딩 되지 않은 한 "이라고 말했습니다. 내 말은 이후이다 Interface인터페이스는 허용 CustomException하나 제공하는 호출자와 잎을 위로, 호출자가 확장하는 클래스를 제공 할 수없는 CustomException경우에도 CustomException경우에 불가능했을 것입니다 - 구체적인 클래스입니다 Interface만드는 어떻게 든 책임을 그것. 인터페이스를 사용하는 것 (확실히 도움이 되긴하지만)보다이 제어의 반전은 DI에 관한 것입니다.
Jacob Raihle

@JacobRaihle "종속성 반전을 직접 적용 할 때 초록은 상위 / 정책 계층이 소유합니다.이 아키텍처는 상위 / 정책 구성 요소와 하위 패키지를 동일한 패키지에 함께 정의하는 추상을 그룹화합니다. 하위 레벨 계층이 작성됩니다. 이러한 추상 클래스 또는 인터페이스 의 상속 / 구현에 의해 . " Martin, Robert C. (2003). 민첩한 소프트웨어 개발, 원칙, 패턴 및 실습. 프렌 티스 홀. 127-131 쪽. ISBN 978-0135974445.
Tulains Córdova

합리적인 디폴트를 제공 할 수 있다면 추상 클래스의 요점은 무엇입니까? 그것을 제공함으로써 당신 무엇을 습니까? 책을 인용하지 말고 생각하십시오.
Jacob Raihle

2

Tulains는 옳습니다-인터페이스는 항상 구체적인 수업에 달려 있습니다. 그들은 단지 자신의 우려에 대한 계약을 작성하기위한 것입니다. 이 계약에는 모든 종류의 데이터를 가져오고 반환하는 것이 포함될 수 있습니다.

더 높은 수준의 언어에서는 기본 유형조차도 그렇게 원시적이지 않습니다. 어쨌든 구체적인 유형으로 작업하고 있습니다!


0

이름으로 가정 하면 실제 클래스 자체를 의미합니다. Reflection을 통해 해당 예외를 초기화하기 위해 실제 예외 클래스 이름 을 지정하려는 경우 올바른 방법이 아닙니다.

인터페이스에서 사용자 정의 클래스를 사용하려는 경우 물론 고유 한 인터페이스에서 자체 클래스를 사용할 수 있습니다. 클래스는 라이브러리 / API의 공용 인터페이스의 일부가됩니다. 데이터 구조와 예외는 인터페이스에서 자주 사용되는 클래스의 좋은 예입니다.

상황에 따라 다른 예외를 사용해야하는 경우 제네릭 사용에 관심이있을 수 있습니다.


아니요, 반성을 의미하지는 않습니다. 언급했듯이 그렇습니다. 예외와 데이터 구조는 단지 데이터를 포함하고 플랫폼이 아니거나 다른 클래스에 의존하지 않기 때문에 인터페이스에서 사용될 수 있습니다. 감사합니다.
nikachx

2
OP 질문에 대한 답변 ... 의견을 제시 한 다음 답변을 제공하십시오.
스눕

1
@StevieV : 첫 번째 단락은 더 수사적인 질문이었습니다. 그리고 OP의 의견에서 알 수 있듯이 실제로 OP의 질문에 대답했습니다.
Arseni Mourzenko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.