2

ロギングのためにクラスをFrameworkA消費するとします。ロギング ライブラリを別のもの (クラス)FrameworkA.StandardLoggerに置き換えたい。SuperLogger

それを可能にするために、インターフェースがあります:他のライブラリが実装しなければならないインターフェースをFrameworkA提供します。FrameworkA.Logger

しかし、他のライブラリがそのインターフェースを実装していない場合はどうなるでしょうか? インターフェイスを気FrameworkAにするほど人気のないフレームワークかもしれません。SuperLogger

考えられる解決策は次のとおりです。

  • 標準化されたインターフェースを持っている (JSR、PSR などの標準によって定義されている)
  • 書き込みアダプター

標準化されたインターフェースがなく、クラスに互換性がある場合に役に立たないアダプターを作成する手間を省きたい場合はどうすればよいでしょうか?

クラスがコントラクトを満たしていることを確認するための別のソリューションはありませんが、実行時にありませんか?

想像してみてください (疑似コードでの非常に単純な実装):

namespace FrameworkA;
interface Logger {
    void log(message);
}

namespace SuperLoggingLibrary;
class SupperLogger {
    void log(message) {
       // ...
    }
}

SupperLoggerLoggerLogger インターフェースを実装していれば互換性があります。しかし、 への「強い依存関係」を持つ代わりにFrameworkA.Logger、そのパブリックな「インターフェース」(または署名) を実行時に検証できます。

// Something verify that SupperLogger implements Logger at run-time
Logger logger = new SupperLogger();

// setLogger() expect Logger, all works
myFrameworkAConfiguration.setLogger(logger);

偽のシナリオではLogger logger = new SupperLogger()、クラスがインターフェイスと互換性がない場合は実行時に失敗すると予想されますが、互換性がある場合は成功します。


それはOOPで有効なことでしょうか? はいの場合、どの言語にも存在しますか? いいえの場合、なぜ有効でないのですか?

私の質問は、静的型付け言語 (Java など) または動的型付け言語 (PHP など) を表しています。

PHP & al の場合: 型チェックがない場合、インターフェイスを実装していなくても、必要なオブジェクトを使用できることはわかっていますが、オブジェクトがインターフェイスに準拠していることを実際にチェックするものに興味があります。

4

2 に答える 2

0

これは、OOP の問題というよりは、静的に型付けされた問題です。Java と Ruby は両方とも OO 言語ですが、Java は (静的に型付けされているため) 必要なものを許可しませんが、Ruby は (動的に型付けされているため) 許可します。

静的に型付けされた言語の観点から見ると、主要な (主要ではないにしても) 利点の 1 つは、代入が安全で有効かどうかをコンパイル時に把握できることです。あなたが探しているものは、動的に型付けされた言語 (Ruby など) によって提供されますが、静的に型付けされた言語では不可能です。これは設計によるものです (コンパイル時の安全性)。

あなたはできますが、それは醜いですが、(Javaで)次のようなことをします:

Object objLogger = new SupperLogger();
Logger logger = (Logger)objLogger;

これはコンパイル時には成功しますが、代入が無効な場合は実行時に失敗します。

とは言っても、上記はかなり醜く、私がすることではありません-それはあなたに多くを与えず、実行時に不快な(そしておそらく驚くべき)例外のリスクを冒します.

Java のような言語で期待できる最善の方法は、使用したい場所から作成物を抽象化することだと思います。

Logger logger = getLogger();

getLogger何を返すかを決定する内部構造を使用します。ただし、これは実際の作成をさらに下に延期するだけです。静的に型付けされた安全な方法で行う必要があります。

于 2013-02-20T11:30:06.067 に答える