6

次の API があります。

public interface MyApi {

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

現在、API 実装で次の変更を行っています。

public class MyApiImpl {

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

は次のように置き換えられます:

public class MyApiImpl {

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

これを API の破損と見なしますか?

クライアントのコードは引き続きコンパイルされますが、MyExcepiton が「新しい」条件によってスローされるため、API javadoc によって定義されたメソッド コントラクトは尊重されなくなります。

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

それについてあなたの見解は何ですか?

4

6 に答える 6

7

はい、C1 が発生しないときに例外をスローすることで、インターフェイスの契約を破っています。

経験則として、インターフェイスの契約が曖昧であるほど、壊れにくくなります:)インターフェイスが明示的なC1の観点から定義されていないが、より一般的な用語で定義されている場合、より多くの柔軟性が得られます.

于 2009-06-24T13:09:52.093 に答える
6

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

これは実際にはどちらの方向にも進む可能性があります。あなたのアプローチがどうなるかは、あなたとあなたのクライアントの間です。

于 2009-06-24T13:08:46.933 に答える
1

それは主にc2が何であるかに依存します。それは既存の契約の論理的範囲内ですか? その場合、MyException をスローすることでコントラクトを満たしています。そうでない場合は、おそらく新しいタイプの例外をスローする必要があります。

私はチェック済み例外の大ファンではないことを指摘しておく必要があります。最終的に、誰かに例外の処理を強制しても、必ずしもそのコードが改善または安全になるとは限りません (実際、偽の例外をずさんに飲み込む可能性があるため、逆の効果が生じる可能性があります)。

于 2009-06-24T13:10:30.987 に答える
1

MyException が RuntimeException でない限り、API の破損はありません。それからです。

とにかく、条件 C2 の MyException をサブクラス化します

そして、C1とC2の両方の条件は「例外的な」IMHOである必要があります。例外をスローする習慣はありません

于 2009-06-24T13:13:44.427 に答える
1

破損です。API が言語構造によって強制されるか、単に文書化されるかは関係ありません。

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

于 2009-06-24T13:15:21.507 に答える
1

ここでの問題は、インターフェースの一部、実装固有の条件を作成したことだと思います。「C1」条件が実装の一部にすぎない場合は、インターフェイスを壊さずに「C1」または「C2」で例外をスローする新しい実装を簡単に作成できます。

于 2009-06-24T13:15:29.587 に答える