2011-01-21 2 views
10

저는 다양한 콘크리트 클래스에 의해 나중에 구현 될 추상화로서 많은 인터페이스의 스펙을 포함하여 현재 일부 API 디자인 작업을하고 있습니다.적절한 수준의 인터페이스 세분화

필자는 Java를 사용하고 있지만 유사한 인터페이스 개념을 지원하는 언어와 관련이 있다고 생각합니다.

내가 사이에 옵션 종종 있습니다 것으로 나타났습니다 : 다중 인터페이스 방법의 전체 범위의 일부를 포함하는 각을 만드는 방법

  • 의 전체 범위와 큰 인터페이스를 만들기

    • 의 (a 단일 구체적인 클래스는 아마도 이러한 인터페이스의 일부 또는 전부를 구현해야 할 것입니다.)

    각 접근법의 장단점은 무엇입니까?

  • +3

    인터페이스 분리 원리에 대한 Bob Martin의 기사를 보았습니까? http://www.objectmentor.com/resources/articles/isp.pdf –

    +0

    @Nathan - 매우 흥미로운 기사 - 감사합니다! – mikera

    +0

    @NathanHughes 링크를 더 이상 사용할 수 없습니다. – byxor

    답변

    2

    너무 많은 메소드가있는 인터페이스를지지하지 않으려합니다. 클래스도 마찬가지입니다. 그러한 인터페이스 나 파생 된 클래스를 사용해야하는 프로그래머는 어떻게 관계가 있는지 이해하는 데 어려움을 겪습니다. 또한 그들이 무엇인지 언제 사용하는지 기억하려고하는 것은 너무 많은 볼을 저글링하는 것과 같습니다.

    나에게는 일반적으로 모듈의 1000 줄이 너무 많습니다. 한 가지 방법으로 100 라인 이상; 클래스 또는 인터페이스에서 15 개 이상의 메소드가 필요합니다. 물론 예외가있을 수 있지만 나는 그들을 피하려고 노력한다.

    나는 어떤 인터페이스가 들어가기 전에 어떤 인터페이스를 가지고 있는지 정의하고 싶습니다. 시스템의 각 추상적 엔티티에 대한 '원자 적 비헤이비어'가 무엇인지 고려하고 필요한 경우 상속을 사용하여 각 엔티티를 인터페이스로 만듭니다. 그런 다음 메소드를 결정하십시오. 그 후에는 각 인터페이스에 많은 메소드가 없을 것입니다.

    +1

    +1 @Fabio 당신의 숫자는 좋다. 나는 엄지 수에 관한 한 가지 더 규칙이 있었을 것이다. 나는 4/5 이상의 매개 변수를 취하는 함수를 피한다. 그리고 약 100 줄 방법에 대한 ... 행위에 내 한계는 내 화면 크기입니다 : 내가 전체를 끝내기 시작에 대한 모든 기능을 읽을 수 없다면, 그것은 너무 길기 때문에 제한은 함수 당 50 줄의 코드입니다. -) –

    +0

    나는 방법 동의 크기를 포함하여 완전히 동의한다 - 스크린에 맞는 것이 이상적이다. 내가 사용하는 모든 언어 (Java, C, C++, C#)에 대해 동일한 표준을 갖고 싶었고 Windows 용 C/C++에서 프로그래밍 할 때 작은 메서드를 만드는 것이 더 어려웠 기 때문에이 특정 규칙을 약간 완화해야했습니다. 때로는 IRS 폼처럼 보이는 거대한 Win32 API 함수와 구조체가 있습니다. –

    4

    인터페이스를 분리하는 방법은 함께있는 것이 합리적 인 책임 그룹으로 방법을 나눌 수 있다는 것입니다. 단점은 인터페이스가 이제는 하나의 클래스가 구현할 수있는 작은 것들로 분할된다는 것입니다.

    가독성을 높이기 위해 인터페이스를 분리하는 것이 좋습니다. 10 개의 인터페이스를 구현하는 클래스가 하나있는 경우 인터페이스를 하나로 결합해야합니다. 그렇지 않으면 클래스가 많은 책임을지고 실제로 두 개 이상의 클래스가되어야합니다.

    2

    만들기 여러 인터페이스 그 접근 방식은 별도의 클래스가 각각 하나를 구현할 수 있기 때문에, "prefer composition to inheritence"의 설계 원리와 더 잘 작동하는 경향

    방법의 전체 범위의 부분 집합을 포함하는 각 (또는 몇 가지 인터페이스).내가 너무 많은 인터페이스가 소위 요요-문제로 이어질 수 있음을 말할 것입니다 안티 패턴의 측면에서

    2

    질문에 대한 좋은 답변이 없습니다. API 디자인은 약간의 예술입니다. 커다란 디자인 작업을하는 중이라면 NetBeans 명예의 Jaroslav Tulach가 직접 Practical API Design 사본을 가져 오는 것이 좋습니다.

    나는 그가 너무 많은 방법에 대해 추천 할 것이라고 생각하는데, 그 중 일부는 단지 도우미 방법 일 수 있습니다. API로 작업하는 데 필요한 최소값을 노출해야합니다. 덜 자세한 정보 일수록 좋습니다.

    2

    인터페이스의 메소드 수는 알려진 (또는 예상 된) 사용법에 의해서만 구동되어야합니다. 호출자가 일반적으로 인터페이스의 여섯 멤버 중 세 가지 다른 (그러나 겹치는) 멤버를 사용하면 여섯 개입니다.

    많은 수의 방법은 빈약 한 응집력을 나타내며 좋은 개체 디자인은 그 수에 자연적인 제한을 두어야합니다. 그러나 인터페이스에 포함 된 메소드의 수를 줄이기 위해 인터페이스를 분할해서는 안됩니다.

    3

    아직 언급되지 않은 한 가지 문제 : 컬렉션에 항목을 넣는 인터페이스는 항목을 가져 오는 인터페이스와 분리되어야합니다. 결합 된 인터페이스는 두 인터페이스를 상속해야합니다. 이런 식으로 인터페이스를 분리하면 공분산과 반항이 가능합니다. 예를 들어 ReadableBunch (Of ToyotaPrius)는 ReadableBunch (Of Of Car)를 기대하는 루틴에 안전하게 전달 될 수 있습니다. [ToyotaPrius의 인스턴스를 제공하는 객체가 Car의 인스턴스를 제공하므로] WritableQueue (Of Car)은 WriteableQueue (Of HondaCivic)를 기대하는 루틴에 안전하게 전달 될 수 있습니다. [Car를 수락 할 수있는 객체가 정의에 따라 HondaCivic을 수락 할 것이기 때문에].

    이 유형의 공분산 및 반공립성이 Java에서 어떤 의미인지는 모르겠지만이 질문은 언어에 구애받지 않는 태그가 붙어 있기 때문에 공분산 및 반항을 지원하는 플랫폼을 코딩하는 사람은이 문제를 고려해야합니다 (예 : .net)

    +0

    +1 공/반항의 언급. – 9000

    +0

    좋은 원칙 - API 설계 결정 중 하나를 직접 도와 주셔서 +1합니다. – mikera