OOP : 클래스 기반 디자인이 인터페이스 기반 디자인보다 나은 상황은 무엇입니까?


10

JDOM의 웹 사이트를 읽고있었습니다 .

JDOM API가 인터페이스가 아닌 구체적인 클래스로 정의되는 이유는 무엇입니까?

Jason Hunter는 JDOM 용 인터페이스 기반 API에 대한 인수를 요약합니다.

인터페이스가 모든 것이 공장이되면서 요소를 방금 추가하는 대신 새 문서로 '가져와야'하고 장기 직렬화와 같은 기능을 보장 할 수 없으며 목록이 계속됩니다.

실제로 인터페이스부터 시작했습니다. 일부 동료들에 대한 시험판 검토 중에 우리는 구체적인 수업을 듣도록 피드백을 받았습니다. 우리는 해냈고 디자인은 훨씬 나아졌습니다.

나는 초보자 디자이너입니다. 지금까지 들어 본 모든 조언은 구체적인 클래스를 사용한 디자인 사용 에 대한 조언 입니다.

특정 장소에서 구체적인 수업을 사용하는 것이 좋습니다. 디자인에서 구체적인 클래스를 사용하는 데 일반적인 클래스 문제가 있습니까?


당신이보고 싶을 수 있습니다 javaworld.com/javaworld/jw-09-2001/jw-0921-interface.html
NoChance

"추상 제한"시리즈를 확인하실 수도 있습니다 : ayende.com/blog/153889/…
henginy

"우리는 해냈고 디자인은 훨씬 나아졌습니다." -어땠어?
CodeART

답변:


6
  • 상속은 구현에 대한 종속성을 생성 하는데, 이는 유지 관리 성과 관련하여 큰 문제가 될 수 있습니다. 이것의 결과는 데이터 전송 객체를 다룰 때 상속과 구체적 클래스를 안전하게 사용할 수 있다는 것 입니다. 정의에는 구현이 거의 없습니다. 이 의존성을 원할 때 구체적인 클래스의 상속을 사용할 수도 있습니다. 이 상황에서 계층의 맨 위에 공통 메소드 (일반적으로 유틸리티 함수)를 포함하는 추상 클래스를 사용할 수 있습니다.
  • 구체적인 클래스 계층 구조를 사용할 때는 Liskov 대체 원칙 을 적용하는 것을 잊지 마십시오 .
  • 클라이언트를위한 구체적인 클래스 (즉, 사용되는 클래스가 아닌 사용하는 클래스)를 사용하는 데 문제가 없습니다.
  • IMHO 변경해야 할 사항이있을 때까지 구체적인 클래스를 사용할 수 있습니다. 오픈 / 청산 원리 커플 링 방지하기 위해 인터페이스를 사용하는 당신에게 말할 것입니다,하지만 대한 당신은 곧 필요 그것은 원칙 아닌가요 당신이 구현에 변경 뭔가를 필요로 할 때 순간까지 구체적인 클래스를 사용하는 것이 좋습니다는. 문제는 클래스의 모든 클라이언트를 처음 변경했을 때마다 변경해야한다는 것입니다. 무언가 할 수있는 도구는 하나 뿐이지 만 구체적인 클래스 IMO를 사용할 수 있습니다.

[편집] JDOM의 웹 사이트는 java.io.File을 예로 들어 설명하지만, 이것은 마치 직렬화 가능한 것처럼 java.io.File 인스턴스를 조작 할 수있는 인터페이스 기반 디자인입니다. 이 상황에서 "창조자"만이 구체적인 클래스를 알 수 있습니다


떠 다니는 "값 개체"에 대한 두 가지 상충되는 정의가 있습니다. "데이터 전송 개체"라고도하는 덜 일반적인 것 같습니다.
Michael Borgwardt

@MichaelBorgwardt "데이터 전송 객체"만을 의미하는 것이 아니라 이것을 지적 해 주셔서 감사합니다. 답변을 편집합니다
Matthias Jouan

1
LSP는 중요하다 모든 하위 유형 관계, 인터페이스 구현뿐만 아니라 상속.

3

JDOM 사이트에서 :

Jason (헌터)은 Brett McLaughlin과 함께 2000 년 초 JDOM 프로젝트를 설립했습니다.

즉, Java 1.3이 출시 될 무렵입니다. Java 개발에있어 성숙도에는 아무 것도 없었습니다. 가장 숙련 된 개발자는 Java를 최대한 활용 한 데 4 년 밖에 걸리지 않았습니다. 널리 사용되는 IoC 컨테이너는 없었고 최대 절전 모드도 없었습니다. Apache Struts가 시작되었습니다.

Jason과 Brett가 잘못되었다고 말할 수 있습니다. 많은 사람들이 아직 그것을 "받지 못했습니다". 그들이 C ++ 배경을 가지고 있다면 C ++의 인터페이스가 필요하지 않습니다 (C ++에는 인터페이스가 필요했지만 실제로 필요하지 않았습니다). 왜 Java에서 인터페이스를 사용합니까? 글쎄, 다른 사람들이 당신을 지시 할 수있는 좋은 이유가 많이 있습니다.

그들은 분명히 틀렸다

인터페이스로 할 수있는 것은 서브 클래 싱으로 할 수있는 것

Java는 클래스의 다중 상속을 허용하지 않지만 다중 인터페이스 구현을 허용합니다. 그것은 실질적인 차이를 만들 수 있습니다.


3

귀하의 질문과 관련하여 소프트웨어 개발에는 문제를 해결하는 몇 가지 방법이 있으며, 일부 개발자가 귀하와 다른 기술을 사용한다고해서 이것이 솔루션이 잘못되었다는 것을 의미하지는 않습니다.

이러한 경우 중 하나는 "인터페이스"대 (기본) "클래스"입니다. 두 가지 기술로 동일한 목표를 달성 할 수있는 상황이 있습니다.

더 복잡하게 만들기 위해 언급 할 인터페이스는 여러 가지가 있습니다.

  • 하나는 "구현"없이 "계약"또는 "사양"을 설계하는 것입니다
  • 다른 것, 클래스의 새로운 클래스 나 계층이 아닌 기존 클래스 에 기능성을 추가하기 위해
  • Enterprise Beans, CORBA, COM, WebServices 등 서로 다른 객체, 기술간에 공유 액세스를 허용하기 위해 이전과 보완
  • 다중 상속을 에뮬레이션

귀하의 질문은 첫 번째 포인트에 적용됩니다.

단일 클래스가 아닌 클래스 계층 구조를 개발하고 일부 클래스가 특정 기능을 공유하려는 경우 인터페이스를 사용하여 기본 클래스로 시작할 수 있습니다.

그리고 다른 시나리오에는 인터페이스를 남겨 두십시오.

좋은 예는 위젯 (컨트롤) 라이브러리입니다.

PHP, Delphi (Object Pascal), C #과 같은 인터페이스 및 클래스를 사용하는 방법을 다른 프로그래밍 언어를 살펴보십시오.

건배.


1

API 디자인 규칙은 실제로 특정 사항입니다. 일상적인 코드를 어떻게 디자인해야하는지에 대해서는 FAQ에서 결론을 내릴 수 없습니다.

일반 코드의 경우 바닐라 상속 IMO보다 인터페이스 또는 추상 클래스 상속을 훨씬 더 자주 사용하는 것이 사실입니다.

이 규칙을 잘 이해하려면 파생 클래스와 수퍼 클래스의 관점에서가 아니라 다른 개체에 종속 된 개체의 관점에서 자신을 배치해야합니다. 구체적인 구현보다는 추상화에 의존하는 것이 거의 항상 낫습니다. 구현 세부 사항이 아닌 계약에 의존하여 일련의 다양한 클래스를 종속성으로 받아 들일 수 있기 때문입니다.

이것을 처음 사용하는 경우는 종종 단위 테스트에서 사용합니다. 클래스를 완전히 격리 하여 단위 테스트하려면 실제 프로덕션에서 사용되는 실제 구현과 다른 종속성의 가짜 구현에 대해 수행합니다.


0

일반적으로 매개 변수로 전달되거나 반환되는 항목에 대한 인터페이스를 원하므로 기본적으로 클래스를 종속성에서 분리 할 수 ​​있습니다.

그래서 우리가 수업을 찾고 있다면 우리는 정상적인 예외를 봄에 결코 지나치지 않습니다. 나는 Java 개발자는 아니지만 다른 유사한 언어에서는 예외에 대해 정의 된 인터페이스를 보지 못했다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.