2009-06-24 4 views
6

Iは、以下のAPIいますJavaは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破損と見なしますか?

クライアントのコードはまだコンパイルされますが、MyExcepitonが「新しい」条件によってスローされるため、API javadocで定義されたメソッドコントラクトはもう尊重されません。

APIのjarファイルのみが更新されても、クライアントアプリケーションは引き続き動作しますが、クライアントが例外をキャッチする方法によっては、アプリケーションの動作が大きく変わる可能性があります。

あなたはそれについて何を考えていますか?

答えて

7

はい、C1が発生しなかった場合に例外をスローすることによって、インターフェイスのコントラクトを破棄しています。

慣習としては、インタフェース契約が曖昧さを感じると、簡単に中断しないようにします。インターフェイスが明示的なC1で定義されているのではなく、より一般的な用語で定義されていれば、柔軟性。

6

私の見解では、ドキュメントでAPIによって定義されたコントラクトを変更しないでください。新しい動作が必要な場合は、次のいずれかを行う必要があります。)この新しい動作を反映しているクライアントが呼び出すことができる新しいメソッドを作成するか、またはb)クライアントに変更の必要性について話し合い、

これは本当に両方向に進むことができます。これはあなたのアプローチがどのようになるかについて、あなたとあなたのクライアントの間です。

1

これは大きくc2に依存します。それは既存契約の論理的境界内にあるのか?もしそうなら、あなたはMyExceptionをスローすることによって契約を満たしています。そうでない場合は、おそらく新しいタイプの例外をスローする必要があります。

私はチェック例外の巨大なファンではないことを指摘しておきます。最終的に、誰かが例外を処理するように強制しても、必ずしもコードがより良くまたはより安全になるわけではありません(実際には、誤った例外を呑み込んでしまう可能性があります)。

1

MyExceptionがRuntimeExceptionでない限り、APIの破損は「いいえ」と言います。そうです。

とにかく、私は「例外」私見である必要があり、条件C2

、両方の条件C1とC2のためMyExceptionをサブクラス化したい、私は例外をスロー

1

それが破損だの習慣をすることはないだろう。 APIが言語構造によって強制されるか、単に文書化されるかは無関係です。

この破損によってクライアントコードに問題が発生するかどうかは、別の質問です。不具合を修正しており、ケースC2をこのようにしてカバーする必要があるかもしれません。その点から、クライアントコード開発者は、あなたがこの変更を行ったことを喜んでいるかもしれません(彼らが現在、欠陥にぶつかるような方法で、変更に直面していないと仮定すると!)

1

ここでの問題は、あなたがあなたのインターフェース、実装固有の条件の一部を作ったことだと思います。 "C1"条件が実装の一部に過ぎない場合は、インターフェイスを破ることなく "C1"または "C2"の例外をスローする新しい実装を作成するだけでした。

関連する問題