2009-06-24 5 views
6

나는 다음과 같은 API 있습니다 :자바 API 휴식

public class MyApiImpl { 

    public void method() throws MyException { 
    if (C1) { 
     throw new MyException("c1 message"); 
    } else if (c2) { 
     throw new MyException("c2 message"); 
    } 
    ... 
    } 
} 

당신을 수행 : 지금 내 API 구현에 다음과 같은 수정을 수행하고

public interface MyApi { 

    /** 
    * Performs some stuff. 
    * @throws MyException if condition C1 
    */ 
    public void method() throws MyException; 
} 

public class MyApiImpl { 

    public void method() throws MyException { 
    if (C1) { 
     throw new MyException("c1 message"); 
    } 
    ... 
    } 
} 

에 의해 대체된다 이것을 API 파손이라고 생각하십니까?

클라이언트의 코드는 계속 컴파일되지만 API javadoc에 정의 된 메소드 계약은 MyExcepiton이 "새"조건에 의해 throw되므로 더 이상 존중되지 않습니다.

내 API jar 파일 만 업데이트되는 경우에도 클라이언트 응용 프로그램은 작동하지만 클라이언트가 예외를 잡는 방식에 따라 응용 프로그램 동작이 많이 바뀔 수 있습니다.

당신의 관점은 무엇입니까?

답변

7

예, C1이 발생하지 않을 때 예외를 throw하여 인터페이스 계약을 파기합니다.

엄밀히 말하면, 인터페이스 계약이 모호해집니다. 인터페이스가 명시 적 C1으로 정의되어 있지는 않지만 더 일반적인 용어로 정의 된 인터페이스는 더 많은 것을 제공합니다 적응성.

6

나의 관점은 문서에서 API로 정의 된 계약을 변경해서는 안된다는 것입니다. 새로운 행동이 필요한 경우에는 다음 중 하나를 수행해야합니다.)이 새로운 동작을 반영하는 클라이언트가 호출 할 수있는 새 메소드를 작성하거나 b) 클라이언트에게 변경의 필요성을 설명하고이를 알립니다.

이것은 실제로 두 가지 방향으로 갈 수 있으며, 귀하의 접근 방식은 귀하와 귀하의 고객 사이입니다.

1

크게 c2가 무엇인가에 달려 있습니다. 기존 계약의 논리적 범위 내에 있습니까? 그렇다면 MyException을 던져서 계약을 만족하게된다. 그렇지 않다면 새로운 유형의 예외를 던질 필요가있을 것입니다.

내가 확인 예외의 큰 팬이 아니란 것을 지적해야합니다. 궁극적으로 누군가가 예외를 처리하도록 강요하지 않아도 코드가 더 좋거나 더 안전하지는 않습니다 (실제로는 가짜 예외를 삼켜 버릴 수있는 반대 효과가 있습니다).

1

MyException이 RuntimeException이 아니면 않는 한 "아니오", API 중단 없음이라고 말하고 싶습니다. 그렇다.

어쨌든, "뛰어난"이럴 수 있어야 조건 C2

그리고 두 조건 C1과 C2에 대한 MyException를 서브 클래 싱 것, 내가 던지는 예외

1

그것은 파손의의 습관을하지 않을 것입니다. API가 언어 구성에 의해 시행되는지 또는 단순히 문서화되는지는 부적절합니다.

이 파손으로 인해 클라이언트 코드에 문제가 발생하는지 여부는 다른 질문입니다. 결함을 수정하고이 문제를 해결하기 위해이 방법으로 케이스 C2를 덮을 필요가있을 수 있습니다. 그 점에서 클라이언트 코드 개발자는 여러분이이 변경을했음을 기뻐할 것입니다 (변경 사항에 직면했을 때와 같은 방식으로 결함을 해결하지 못한다고 가정 할 때!)

1

여기서 문제는 사용자가 인터페이스, 구현 특정 조건의 일부라고 생각합니다. "C1"조건이 구현의 일부일 경우 인터페이스를 손상시키지 않고 "C1"또는 "C2"에 대한 예외를 throw하는 새 구현을 간단하게 만들 수 있습니다.