web-dev-qa-db-ja.com

イントロスペクションとリフレクションの違いは何ですか?

誰もがこれらの2つの概念の違いを言語/環境にとらわれない観​​点から説明できますか?

また、プログラミング言語が内省的および/または内省的であるために満たす必要がある条件のセットはありますか?

そして、もしあれば、これらの条件は何ですか?

41
U r s u s

ウィキペディアの記事 にはかなりまともな要約があります:

コンピューティングにおける型内観とは、実行時にオブジェクトの型またはプロパティを調べるプログラムの機能です。一部のプログラミング言語はこの機能を備えています。

イントロスペクションをリフレクションと混同しないでください。リフレクションはさらに一歩進んで、プログラムが実行時にオブジェクトの値、メタデータ、プロパティ、および/または機能を操作する機能です。いくつかのプログラミング言語、例えばJavaもその機能を備えています。

静的に型付けされたコンパイル済みプログラムを取得します。

SomeType function foo(int i) {
    return new SomeType(i);
}

すべての型は既知であり、コンパイル時に強制されます。プログラムは、独自の明示的な型制約を満たさない場合でもコンパイルすべきではありません。動的プログラミング言語は通常、この種の厳格さを示しません。変数のタイプはコンパイル時に必ずしも知られていません。次のようになります。

function foo(i) {
    return new SomeType(i);
}

この関数は、iが正確に何であるかを保証することはできず、単に通過させるだけです。それはどこかで問題を引き起こすかもしれませんし、そうでないかもしれません、型システムはここで助けることができません。通常、この種のエラーチェックはユーザーランドコードに委ねられます。このようなコードでは、イントロスペクション機能が必要です。

function foo(i) {
    if (!is_int(i)) {
        throw new InvalidArgumentException;
    }
    return new SomeType(i);
}

イントロスペクションとリフレクションの間に正確に線を引く場所は、いくらか議論の余地があります。イントロスペクションとは、コードがtestであるもの( "What am I?")をテストできるもので、リフレクションはプログラムを操作する能力であると言うことができます。構造自体。たとえば、PHPの例:

$ref = new ReflectionClass('Foo');
$foo = $ref->newInstanceWithoutConstructor();

上記のコードは、クラスの新しいインスタンスを作成するときにクラスFooのコンストラクターの実行を回避します。それが実行時のコード操作です。ただし、実際にはPHPのリフレクションAPIにもイントロスペクション機能が含まれています。これらの機能の一部は、「下位」イントロスペクション機能で実行できる機能の複製です。例:

$ref = new ReflectionClass($obj);
if ($ref->getName() == 'Foo') ...

if ($obj instanceof Foo) ...

どちらのスニペットも基本的に同じことを行いますが、一方はリフレクションを使用し、もう一方はイントロスペクションと呼ばれるものを使用します。ご覧のとおり、明確な境界線はほとんどありません。ただし、通常、リフレクションはイントロスペクションよりも強力です。たとえば、PHPでは、リフレクションAPIを使用して、関数が受け入れる引数のタイプに関する情報を取得する必要があります。これは単なる「パッシブ」イントロスペクションですが、リフレクションAPIに属します。しかし、実用的な実装の問題。

要するに、一般的な定義では、内省的であるためには、プログラムは実行時に自身の一部を調べ、この情報に基づいて異なるコードを実行できる必要があります。それを超える反射型プログラムは、実行時に独自のコード実行ルールを変更できます。たとえば、コンストラクターを呼び出さないことを選択できます。コンストラクターは、言語で定義されている必須の操作です。

34
deceze

Reflectionは、2つのテクニックで構成されるメカニズムです。

  1. イントロスペクション

    プログラムが自身を検査する能力

  2. 仲裁

    プログラムが自身を変更する能力(彼の行動または彼の状態)

参照 https://fr.wikipedia.org/wiki/R%C3%A9flexion_(informatique)#Introspection_et_intercession

英語のページは「仲裁」という用語を直接参照していないため、私の参照はフランス語のページです。

3
csblo

型のイントロスペクション:

実行時にオブジェクトのタイプまたはプロパティを調べるプログラミング言語の機能。

例(Java):

String myObj1 = new String();
MyCustomObject myObj2 = new MyCustomObject();
if(myObj2 instanceof MyCustomObject) {
    System.out.println("This is an example of type interospection");
}


反射:

実行時に以下のことを達成するプログラミング言語の能力。

  • タイプイントロスペクト(上記参照)
  • オブジェクトを調べて変更します。
  • などなど
1
dheeran