インターフェースが具象クラスに依存することは問題ありませんか?


9

カスタムエラーハンドラーのJavaでインターフェイスを作成しています。

引数エラーオブジェクトを渡したいのですが、Exceptionクラスの子である必要があります。

定義したクラス名をインターフェイスで使用しても大丈夫ですか?

実装に依存しないという点で、インターフェースを少なくしませんか?

私はこのようなことをやろうとします:

public class CustomException {
    /* ... Implementation ... */
}

public interface Interface {

    void onError(CustomException ex);

}

インターフェースで別のクラスを継承してもよいかどうか尋ねようとしていますか?
スヌープ

@StevieVいいえ。質問を編集しました。
nikachx 2016年

1
@AndresF。これは単なる例であり、インターフェイスでのクラスの使用に関するあらゆるOO言語に適用できます。
nikachx

3
教えてください:CustomException実装の一部ですか、インターフェースの一部ですか?
user253751

2
@nikachx「安全」とはどういう意味かわかりません。どのような点でString安全ですCustomExceptionか?CustomException次に、他の依存関係があるかどうかが重要なのはなぜですか?
Andres F.

回答:


2

最初に私はCustomException拡張しないという事実を指摘しなければならないExceptionので、それは実際にはありませんException

それは言った:

Dependency Inversion Principleを気にしない場合は、そのままにしておきます。インターフェースが具象クラスに依存することは完全に問題ありません。たとえば、多くのインターフェースは具象クラスに依存している、StringまたはObject具象クラスです。問題は、Java SDKに属するクラスは、私たちが作成したクラスよりも安定している(コードを壊す変更が少ない)と信じがちなことです。

その一方で:

DIP(無数の利点があり、私の推奨事項です)をフォローしたい場合は、次の2つのいずれかを行う必要があります。

オプション1

  • 作るCustomException抽象
  • キープvoid onError(CustomException ex)そのまま

オプション2

  • CustomExceptionインターフェースを作る
  • キープvoid onError(CustomException ex)そのまま

これらのオプションのいずれかを使用すると、インターフェイスは具体的なクラスに依存せず、抽象化にのみ依存するため、DIPに準拠します。

依存関係の逆転の直接適用では、抽象は上位層/ポリシー層によって所有されます。このアーキテクチャは、上位/ポリシーコンポーネントと下位サービスを定義する抽象を同じパッケージにまとめたものです。下位層は、これらの抽象クラスまたはインターフェースの継承/実装によって作成されます。マーティン、ロバートC(2003)。

  • アジャイルソフトウェア開発、原則、>パターン、および実践。プレンティスホール。127-131ページ。ISBN 978-0135974445。

1
抽象クラスを受け入れるか具象(非最終)クラスを受け入れるかには大きな違いはなく、インターフェースとの違いはそれ以上のものではありません。インスタンスがパラメーターとして渡され、実装でハードコーディングされていない限り、DIの基礎が得られます。
Jacob Raihle

@JacobRaihle実装でハードコードされたインスタンスを渡すとはどういう意味ですか?
TulainsCórdova16年

「渡されハードコーディングされていない限り」と私は言った。私は何を意味しているためということであるInterfaceインターフェースが受け入れるCustomException1つを提供するために、呼び出し元に、葉、それをアップし、呼び出し側が拡張するすべてのクラスを提供するために自由であるCustomException場合でもCustomExceptionあれば不可能でした-具象クラスでInterface作成するための何らかの形で責任があったがそれ。この制御の逆転は、インターフェースでの作業(それは確かに役立ちます)よりも、DIのすべてのことだと私は思います。
Jacob Raihle、2016年

@JacobRaihle "依存関係逆転の直接アプリケーションでは、抽象は上位/ポリシーレイヤーによって所有されます。このアーキテクチャは、上位/ポリシーコンポーネントと下位サービスを同じパッケージで定義する抽象をグループ化します。下位レベルのレイヤーが作成されますこれらの抽象クラスまたはインターフェースの継承/実装による。」マーティン、ロバートC(2003)。アジャイルソフトウェア開発、原則、パターン、および実践。プレンティスホール。127-131ページ。ISBN 978-0135974445。
TulainsCórdova16年

適切なデフォルトを提供できる場合、抽象クラスのポイントは何ですか?それを提供することで何を失うのですか?本を引用するだけでなく、考えてください。
Jacob Raihle 2016年

2

Tulainsは正解です。インターフェースは常に具象クラスに依存しています。彼らは彼ら自身の懸念のために契約を作成することのみを意図しています。その契約には、あらゆる種類のデータの取得と返却が含まれます。

高水準言語では、プリミティブ型でもそれほどプリミティブではないことに注意してください。とにかくあなたは具体的なタイプで作業しています!


0

名前からすると、実際のクラス自体を意味していると思います。Reflectionを介して対応する例外を初期化するために実際の例外クラスを指定しようとしている場合、これは正しい方法ではありません。

インターフェイスでカスタムクラスを使用する場合は、もちろん、独自のインターフェイスで独自のクラスを使用できます。クラスは、ライブラリ/ APIのパブリックインターフェイスの一部になります。データ構造と例外は、インターフェースでよく使用されるクラスの良い例です。

コンテキストに応じて異なる例外を使用する必要がある場合は、ジェネリックスの使用に興味があるかもしれません。


いいえ私は反射を意味するものではありません。はい。例外とデータ構造はデータのみを含み、プラットフォームや他のクラスに依存しないため、インターフェイスで使用できます。ありがとうございました。
nikachx 2016年

2
OPの質問に対する回答...コメントを入力して、回答を入力してください。
スヌープ

1
@StevieV:最初の段落はより修辞的な質問でした。そして、OPのコメントが示すように、私は実際にOPの質問に答えました。
Arseni Mourzenko 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.