에 대해 프로그래밍 인터페이스:당신은 당신 인터페이스에 대한 모든 도메인의하십니까?

StackOverflow https://stackoverflow.com/questions/152077

  •  02-07-2019
  •  | 
  •  

문제

I agree,그에 대해 프로그래밍 인터페이스 이하로 유지하는 것이 좋습니다.대부분의 경우에 Java"인터페이스"이러한 의미에서 의미하는 언어를 구축 인터페이스,그래서 당신이 쓰는 인터페이스 구현한 클래스를 사용 하는 인터페이스 구현 클래스의 대부분의 시간입니다.

내가 궁금해하는 경우 이것은 좋은 연습을 쓰기 위해 도메인 모델로습니다.그래서 예를 들어,당신은 도메인 등 고객과 각 고객의 주문 목록,당신 일반적으로 또한 쓰 인터페이스 ICustomer 및 IOrder.또한 고객의 목록을 가지고 IOrders 대신 Orders?또는 당신은 사용 인터페이스에서 도메인을 모델하는 경우에만,그것은 정말에 의해 몰아 도메인,예를 들어,당신은 적어도 두 개의 서로 다른 종류의 주문?즉,당신은 인터페이스를 사용하기 때문에 단지 기술적 요구 도메인에 있는 모형,또는 때에만 그것은 정말 적절한과 관련하여 실제 도메인으로 이동할 수 있을까요?

도움이 되었습니까?

해결책

인터페이스를 작성하면 "단지"키스 원칙 위반은 말할 것도없이 나를 시간과 에너지의 낭비로 쳐서 나를 때리기 때문입니다.

나는 그들이 멋진 헤더 파일뿐만 아니라 관련 클래스의 일반적인 동작을 나타내는 데 실제로 유용 할 때 그것들을 씁니다.

다른 팁

시스템을 과도하게 설계하지 마십시오. 여러 유형의 주문이 있음을 알게되고 필요할 때 리팩터링하는 것보다 주문에 대한 인터페이스를 선언하는 것이 적절하다고 생각하면. 도메인 모델의 경우, 특정 인터페이스가 개발 수명에 걸쳐 크게 변할 확률이 높기 때문에 인터페이스를 조기에 쓰는 것은 거의 유용하지 않습니다.

인터페이스는 단위 테스트 목적 및 일반 종속성 관리를 위해 구성 요소를 분리하는 훌륭한 방법입니다. 나는 종종 추상 클래스를 선호하기 때문에 인터페이스가 가져 오는 일부 복제를 강요하기보다는 적어도 일부 공통 동작이 오프로드됩니다. 최신 IDE는 인터페이스를 빠르고 쉽게 생성 할 수 있도록합니다. 저것 많은 일 :-)

아니요, 도메인 객체의 인터페이스 만 사용하여 느슨하게 결합합니다. 저에게 인터페이스로 내 코드를 개발하는 주요 후크는 단위 테스트를 수행 할 때 쉽게 모의를 만들 수 있다는 것입니다. 서비스 계층 또는 DAO 계층 클래스와 동일한 종속성이 없기 때문에 도메인 개체를 조롱하는 요점이 보이지 않습니다.

이것은 확실히 도메인 객체에서 인터페이스를 사용하지 않아도되는 것은 아닙니다. 적절한 경우 사용하십시오. 예를 들어, 최근에는 다른 유형의 도메인 객체가 사용자가 주석을 남길 수있는 Permalink 페이지에 해당하는 WebApp에서 작업했습니다. 따라서 이러한 각 도메인 객체는 이제 "주석 가능한"인터페이스를 구현합니다. 그런 다음 모든 주석 기반 코드는 도메인 객체 대신 주석 가능한 인터페이스로 프로그래밍됩니다.

나는 Lean과 Agile을 유지하는 것이 좋습니다.해야 할 때까지 아무것도하지 마십시오. 그런 다음 IDE가 필요할 때 리팩토링을하도록하십시오.

아이디어/이클립스는 사소한 아이디어/이클립스를 콘크리트 클래스를 인터페이스로 바꾸는 것이 필요합니다.

그런 다음 종속성 주입을 사용하십시오 또는 기체 코드의 장소에 주입하기 위해 인터페이스를 많이 구현할 수있는 경우 '새'를 사용하고 있습니다.

실제로이 질문은 "인터페이스에 대한 프로그래밍"에 대한 일반적인 오해의 예입니다.

알다시피, 이것 ~이다 아주 좋은 원칙이지만 그렇습니다 ~ 아니다 많은 사람들이 그것이 의미하는 바를 의미합니다!

"구현이 아닌 인터페이스로의 프로그램"(GOF 책에서) 만들다 모든 것을위한 별도의 인터페이스. 당신이있는 경우 ArrayList 객체, 그런 다음 변수/필드/매개 변수/반환 유형을 유형 인 것으로 선언합니다. List. 클라이언트 코드는 인터페이스 유형 만 처리합니다.

Joshua Bloch의 "효과적인 Java"책에서 원칙은 "항목 52 : 인터페이스별로 객체를 참조하십시오"에서 더 명확하게 표현됩니다. 대담한 편지로 말합니다.

적절한 인터페이스가없는 경우 인터페이스가 아닌 클래스별로 객체를 참조하는 것이 전적으로 적절합니다.

단위 테스트의 경우 상황은 전적으로 사용 된 조롱 도구의 기능에 달려 있습니다. 내 도구로 jmockit, 나는 테스트중인 코드 내부에서 인스턴스화 된 최종 클래스를 사용하는 코드와 같이 인터페이스 및 종속성 주입을 사용하는 코드에 대해 쉽게 단위 테스트를 작성할 수 있습니다.

따라서 저에게 대답은 다음과 같습니다. 항상 존재하는 인터페이스를 사용하지만 그렇게 할 이유가 없다면 새로운 인터페이스를 만드는 것을 피하십시오 (그리고 테스트 가능성, 그 자체로는 하나가되어서는 안됩니다).

인터페이스가 필요하기 전에 (테스트 또는 아키텍처를 위해) 쓰기는 과잉입니다.

또한 인터페이스를 수동으로 작성하는 것은 시간 낭비입니다. Resharper의 Refactoring "Pull Members"를 사용하여 몇 초 만에 특정 클래스에서 새 인터페이스를 생성 할 수 있습니다. IDE와 통합되는 다른 리팩토링 도구도 비슷한 기능을 가져야합니다.

나는 보통 소규모 프로젝트에서 의미가있는 인터페이스 만 사용합니다. 그러나 최신 작업에는 거의 모든 도메인 객체가 인터페이스가있는 큰 프로젝트가 있습니다. 아마도 과잉 일 것입니다. 분명히 성가 시지만 종속성 주입을 위해 스프링을 테스트하고 사용하는 방식에는 필요합니다.

우리는 주로 개찰구, 스프링 및 최대 절전 모드로 웹 응용 프로그램을 작성하며 스프링 콩, 예를 들어 서비스 및 DAO에 인터페이스를 사용합니다. 이 클래스의 경우 인터페이스가 완전히 이해됩니다. 그러나 우리는 또한 모든 단일 도메인 클래스에 인터페이스를 사용하며 이것이 과잉이라고 생각합니다.

하나의 콘크리트 유형의 모델 객체 만있을 것이라고 확신하더라도 인터페이스를 사용하여 조롱과 테스트가 다소 쉬워집니다 (그러나 요즘에는 콘크리트 자바 클래스의 경우 조롱 클래스를 자동으로 생성하는 데 도움이되는 Framworks가 있습니다. Mockito, Jtestr, Spring, Groovy ...)

그러나 테스트 중에 조롱하는 것이 훨씬 더 중요하기 때문에 서비스를위한 인터페이스를 더 자주 사용하고 인터페이스에 대한 프로그래밍은 캡슐화와 같은 것들에 대한 생각을 도울 수 있기 때문입니다.

쓰 인터페이스를 위한 도메인 클래스를 만들 수 있는 경우에 당신은 그것을 사용에 대한 단위 테스트입니다.우리가 사용하는 모의 개체에 단위 테스트입니다.그래서,인터페이스가 있는 경우 도메인에 대한 개체고 도메인의 개체가 준비되지 않았지만 클라이언트할 수 있는 테스트를 사용한 인터페이스의 도움으로 모의 개체입니다.

Intefaces 도 테스트에 여러 개의 구현이의 인터페이스에 대한 귀하의 도메인 모델입니다.그래서 저는 생각하지 않은 항상입니다.

인터페이스에 대한 프로그래밍의 주된 이유는 테스트 가능성이라고 생각합니다. 따라서 도메인 객체의 경우 - Pojos 또는 POC#OS 등을 고수하십시오. : : 즉, 클래스가 특정 프레임 워크를 추가하지 않도록하여 다른 프레임 워크 및 런타임 종속성을 방지하기 만하면됩니다. 그래도 DAO를위한 인터페이스를 만드는 것은 좋은 생각입니다.

우리는 테스트 (조롱) 및 AOP와 같은 물건에 도움이되기 때문에 모든 것에서 인터페이스를 추출합니다. Eclipse는이 작업을 자동으로 수행 할 수 있습니다 : Refactor-> Extrace Interface.

나중에 클래스를 수정 해야하는 경우 Refactor-> Pull Up ...을 사용하여 필요한 메소드를 인터페이스로 끌어 올릴 수 있습니다.

*도메인 객체의 프록시를 만들기 위해 필요하기 때문에 그렇게합니다.

그것은 특히 생성 된 도메인과 DAO 객체와 함께 내가 실행한다는 것을 명심해야 할 또 다른 것입니다. 많은 인터페이스가 너무 구체적입니다. 많은 도메인 객체에 ID와 상태 필드가 있다고 말합니다. 왜 공통 인터페이스를 공유하지 않습니까? 이로 인해 불필요하게 평평한 (상속) 도메인 모델 인 좌절감이 발생했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top