メタオブジェクト

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピュータサイエンスではメタオブジェクトは、オブジェクト(それ自体を含む)を操作、作成、記述、または実装するオブジェクトです。メタオブジェクトが関係するオブジェクトは、ベースオブジェクトと呼ばれます。メタオブジェクトが定義する可能性のある情報には、ベースオブジェクトのタイプインターフェイスクラスメソッド属性解析ツリーなどが含まれます。メタオブジェクトは、リフレクションのコンピューターサイエンスの概念の例です。、システムが(通常は実行時に)独自の内部構造にアクセスできる場合。リフレクションを使用すると、システムは基本的にその場で自分自身を書き直し、実行時に独自の実装を変更できます。[1]

メタオブジェクトプロトコル

メタオブジェクトプロトコル(MOP)は、オブジェクトのシステムの構造と動作にアクセスして操作するための語彙(プロトコル)を提供します。メタオブジェクトプロトコルの典型的な機能は次のとおりです。[2]

  • 新しいクラスを作成または削除します
  • 新しいプロパティまたはメソッドを作成します
  • クラスを別のクラスから継承させます(「クラス構造を変更する」)
  • クラスのメソッドを定義するコードを生成または変更する

メタオブジェクトプロトコルは、ソフトウェアオブジェクトシステムは拡張のためにオープンであるが、変更のためにクローズされるべきであるというバートランドメイヤーオープン/クローズド原則に反しています。この原則は、オブジェクトを追加して拡張することと、オブジェクトを再定義して変更することを効果的に区別し、前者が望ましい品質であることを提案します(「オブジェクトは将来のユースケースの要件を満たすために拡張可能である必要があります」)。後者は望ましくありません( "オブジェクトは、サマリーリビジョンの対象とならない安定したインターフェイスを提供する必要があります対照的に、メタオブジェクトプロトコルは、システム自体の観点から、オブジェクトの内部構成とオブジェクトシステム全体を透過的に公開します。実際には、これは、プログラマーがオブジェクトを使用して、おそらく非常に複雑な方法で自分自身を再定義できることを意味します。

さらに、メタオブジェクトプロトコルは、単に「基礎となる」実装へのインターフェイスではありません。むしろ、メタオブジェクトプロトコルを介して、オブジェクトシステムはメタオブジェクトシステムの観点から再帰的に実装されます。メタオブジェクトシステム自体は理論的にはメタメタオブジェクトシステムの観点から実装され、以下同様に任意のベースケース(オブジェクトシステムの一貫した状態)まで続きます。 )が決定され、プロトコル自体がこれらの実装レベル間の再帰的な機能関係になります。

このような方法でオブジェクトシステムを実装すると、根本的な裁量による再設計の可能性が開かれ、深い柔軟性が提供されますが、複雑または理解しにくいメタ安定性の問題が発生する可能性があります(たとえば、オブジェクトシステムは自身のメタオブジェクトプロトコル(内部の自己)を破壊的に更新してはなりません)表現-しかし、一部の更新の潜在的な破壊性は、予測するのが簡単ではなく、必要な変更が伝播される再帰的な深さに応じて、推論するのが難しい場合があります)。[3]このため、メタオブジェクトプロトコルは、言語で存在する場合、通常は控えめに使用され、他のソフトウェアまたはそれ自体を高度な方法で変換するソフトウェアなどの特殊な目的で使用されます。たとえば、リバースエンジニアリングなどです。[4]

実行時間とコンパイル時間

実行時にコンパイルが利用できない場合、メタオブジェクトプロトコルの実装にはさらに複雑な問題があります。たとえば、このようなプロトコルを使用して型階層を変更することは可能ですが、そうすると、代替のクラスモデル定義でコンパイルされたコードで問題が発生する可能性があります。一部の環境では、コンパイル時にメタオブジェクトの問題を処理するなど、これに対する革新的なソリューションが見つかりました。この良い例はOpenC++です。[5]セマンティックWebオブジェクト指向モデルは 、ほとんどの標準オブジェクトシステムよりも動的であり、ランタイムメタオブジェクトプロトコルと一貫性があります。たとえば、セマンティックWebモデルでは、クラスは相互の関係を変更することが期待されており、特別な推論エンジンがあります。進化するクラスモデルを検証および分析できる分類子として知られています。[6]

使用法

最初のメタオブジェクトプロトコルは、XeroxPARCで開発されたSmalltalkオブジェクト指向プログラミング言語でした。Common Lisp Object System(CLOS)は後に登場し、Smalltalkプロトコルと、評価者の無限の塔としての3-Lispに関するBrianC.Smithの最初の研究の影響を受けました。[7] CLOSモデルは、Smalltalkモデルとは異なり、クラスが複数のスーパークラスを持つことを可能にします。これにより、一部のオブジェクトインスタンスのクラス階層の系統を解決するなどの問題がさらに複雑になります。CLOSは、ジェネリック関数を介して処理される動的マルチメソッドディスパッチも可能にしますSmalltalkのシングルディスパッチのようにメッセージを渡すのではなく[8] Common Lispでのメタオブジェクトプロトコルのセマンティクスと実装を説明する最も影響力のある本は、Gregor KiczalesetalによるTheArtof theMetaobjectProtocolです。[9]

メタオブジェクトプロトコルは、ソフトウェアエンジニアリングアプリケーションでも広く使用されています。事実上すべての商用CASE、リエンジニアリング、および統合開発環境には、設計成果物を表現および操作するための何らかの形式のメタオブジェクトプロトコルがあります。[10] [11] [12]

メタオブジェクトプロトコルは、アスペクト指向プログラミングを実装する1つの方法です。その後、 Gregor Kiczalesを含むMOPの初期の創設者の多くは、アスペクト指向プログラミングの主要な支持者になりました。Kiczalesetal。PARCは、ネイティブメタオブジェクトプロトコルを持たない言語であるAspectJforJava 設計するために採用されました

も参照してください

参照

  1. ^ スミス、ブライアンC(1982-01-01)。「プログラミング言語における手続き的考察」MITテクニカルレポート(MIT-LCS-TR-272)。2015年12月13日にオリジナルからアーカイブされました2013年12月16日取得
  2. ^ フット、ブライアン; ラルフ・ジョンソン(1989年10月1〜6日)。「Smalltalk-80の反射施設」Oopsla '89:327–335。土井10.1145/74877.74911ISBN 08979133372013年12月16日取得
  3. ^ メタオブジェクトプロトコルの技術、付録C —循環性のある生活
  4. ^ Favre、Lilliana; リリアナマルティネス; クラウディアペレイラ(2009)。オブジェクト指向コードのMDAベースのリバースエンジニアリングスプリンガー。土井10.1007/978-3-642-01862-6_21ISBN 978-3-642-01861-9
  5. ^ 千葉繁(1995)。「C++用のメタオブジェクトプロトコル」Oopsla '95:285–299。土井10.1145/217838.217868ISBN 978-08979170322013年12月27日取得
  6. ^ Knublauch、Holger; Oberle、Daniel; テトロー、フィル; ウォレス、エヴァン(2006-03-09)。「オブジェクト指向ソフトウェア開発者のためのセマンティックWeb入門書」W3C 2008年7月30日取得
  7. ^ ダニエルP.フリードマン; ミッチェルワンド(1988)。「塔の謎が解き明かされた」タワーの謎が明らかになりました:反射タワーの無反射の説明pp。298–307。土井10.1145/319838.319871ISBN 978-0897912006
  8. ^ 「オブジェクト指向と関数型プログラミングの統合」(PDF)2016年7月7日取得
  9. ^ Kiczales、Gregor; ジム・デ・リヴィエール; ダニエルG.ボブロウ(1991年7月30日)。メタオブジェクトプロトコルの芸術MITプレス。ISBN 978-0262610742
  10. ^ ジョンソン、ルイス; デビッドR.ハリス; ケビンM.ベナー; マーティンS.フェザー(1992年10月)。「牡羊座:KBSAの要件/仕様ファセット」。ローマ研究所最終テクニカルレポートRL-TR-92-248。
  11. ^ 「洗練の起源」(PDF)www.metaware.frメタウェアホワイトペーパー。2014年1月7日にオリジナル(PDF)からアーカイブされました2014年1月6日取得
  12. ^ 「OMGのメタオブジェクトファシリティ」omg.orgObjectManagementGroup 2014年1月7日取得

外部リンク