オブジェクト統合失調症または自己統合失調症は、オブジェクト指向プログラミングにおける委譲および関連技術から生じる合併症であり、/ が複数のオブジェクトを参照する可能性がある。解離性同一性障害と精神医学的診断である統合失調症が混同されていること(前者は「分裂人格」と関連付けられている)を比喩的に用いて、この構成はオブジェクト指向プログラミングにおいてオブジェクト統合失調症または自己統合失調症と呼ばれる。 [ 1 ]selfthis
オブジェクトとは、データと動作を組み合わせた、固有の識別子を持つコンピューティング概念と定義できます。クラスベースのプログラミングでは、オブジェクトはクラスシステムに基づいて構築され、オブジェクトはクラスのインスタンスです。クラスは継承によって関連付けられます。基底クラスはオブジェクトの基本的な動作またはデフォルトの動作を提供し、オブジェクトを作成するためのテンプレートとして機能します。一方、派生クラスは基底クラスの動作をオーバーライドするために使用でき、基底クラスの動作を洗練させたオブジェクトのテンプレートとして使用できます。
クラスと継承の代替手段として、プロトタイプと委譲[ 2 ]があり、これはプロトタイプベースのプログラミングで使用され、より動的です。あるクラスを使用して別のクラスを改良するのではなく、委譲を使用すると、あるオブジェクトが別のオブジェクトの動作をオーバーライドできます。元のオブジェクトa (派生クラスの動作に相当) は、そのメソッドの一部を別のオブジェクトb (基底クラスの動作に相当)に委譲できます。aがfooメソッドをbのbarメソッドに委譲すると、aでfooを呼び出すと、 bのbarメソッドが実行されます。ただし、bar はaオブジェクトのコンテキストで実行されるため、たとえば、その識別子はbではなくaを参照します。self
委譲を使用する場合、オブジェクトaselfのメソッドをオブジェクトbのメソッドに委譲して評価する場合、の値は何になるのかという疑問が生じます。識別子は分割され、aまたはbを参照できます。 2 つのオブジェクトは別個の物理的な識別子を持っていますが、 は(明示的に使用されるか暗黙的に使用されるかにかかわらず)曖昧であることに注意してください。self
Herrmann [ 3 ]によると、この用語は、IBM Research の William Harrison が 1997 年 5 月頃に、一般的な設計パターンのいくつかで発生する問題について議論した一連の Web ページの中で造語したとのことです (これらの Web ページは現在公開されていません)。提示された例では、典型的な解決策では委譲の弱い形式(転送と呼ばれることもあります) を使用するため、委譲中に元の受信オブジェクトに関する知識が実際に失われるという事実によって問題が悪化していました。ここで転送を使用するのは、主流のオブジェクト指向プログラミング言語のほとんどが、より強い形式の委譲をサポートしていないためです。Harrison らは、静的構成によってオブジェクトの分裂症の問題を回避する主題指向プログラミングを解決策として提案しました。一方、Herrmann は、コンテキストロールを特徴とする言語は、ロールオブジェクトとその関連する基本オブジェクトの間で動作を共有する手段として委譲を使用しているにもかかわらず、オブジェクトの分裂症の潜在的な問題が実質的に関係ないように設計できることを示しています。