オブジェクト指向


用語集

用語集


XP (エクストリーム プログラミング) - 用語集はこちら別頁


MDA

Model Driven Architecture (モデル駆動型アーキテクチャ) の略. OMG が提唱するシステムの構築方法で,下記にあるような幾つもの標準技術を体系化したもの.
MDA では,PIM (Platform Independent Model) と呼ばれるプラットフォームに独立なモデルと,PSM (Platform Specific Model) と呼ばれるプラットフォームに依存したモデルを想定する.
PIM は,UML や MOF (Meta Object Facility),CWM (Common Warehose MetaModel) 等の標準技術を用いて記述される.このモデルは,XMI (XML Metadata Interchange) という標準技術により,ツール間での交換が可能になる.
PSMは,Java や .NET,CORBA 等のプラットフォームに依存したモデルである.
そして,PIM から PSM (Platform Specific Model) へのマッピングルールが定義されており,MDA ツールによりこの PIM から PSM への変換 (ソースコードの生成) を自動/半自動で行うことができる.
URL: http://www.omg.org/mda/

MVC

アーキテクチャパターンの一種で,GUI アプリケーションを Model (ビジネスロジック部分),View (表示・入出力部分),Controller (通信・制御)のように三つの部分に分けてなるべく独立した作りとする.各部分間の相互依存性を低減させることで全体の保守性・拡張性を向上させることを目的としている. MVC は,Model,View,Controller の頭文字をとったもの. もとは Smalltalk というオブジェクト指向言語での GUI 設計に用いられた概念である.最近では一部を改良した MVC も用いられている.

OMG

Object Management Group の略. オブジェクト指向技術の標準化と普及のために 1989年に設立された業界団体. UML の標準化などを行っている.
URL: http://www.omg.org/

OOA

Object-Oriented Analysis (オブジェクト指向分析) の略.

OOD

Object-Oriented Design (オブジェクト指向設計) の略.

OOP

Object-Oriented Programming (オブジェクト指向プログラミング) の略.

UML

Unified Modeling Language の略. 日本語では「統一モデリング言語」と訳されている. モデリングのための言語.
URL: http://www.omg.org/uml/

UP

Unified Process (統一プロセス) の略. 反復型開発プロセスの一種. 基は RUP (Rational Unified Process).オブジェクト指向技術をベースにした開発プロセスの集大成に当たる.ユースケース駆動,アーキテクチャ中心,等の特徴がある.
URL:http://www-6.ibm.com/jp/software/rational/products/unified_process/
書籍: 『UMLによる統一ソフトウェア開発プロセス ―オブジェクト指向開発方法論』 翔泳社 Ivar Jacobson,James Rumbaugh,Grady Booch 著 日本ラショナルソフトウェア 訳 藤井 拓 監修

アーキテクチャ (architecture)

ソフトウェアにおいては,システムの組織的な構造のこと.インタフェイスを介して接続され相互作用するパーツ群 (コンポーネントやサブシステム等) によって成り立っている.

アーキテクチャパターン (architecture patterns)

ソフトウェア パターンの一種で,特にソフトウェアのアーキテクチャに関するもの. Layers パターン,MVC パターン,PAC パターン等がある.
書籍: 『ソフトウェア アーキテクチャ −ソフトウェア開発のためのパターン体系−』 株式会社ピアソン・エデュケーション F.ブッシュマン,R.ムニエ,H.ローネルト,P.ゾンメルラード,M.スタル 著 金澤 典子,水野 貴之,桜井 麻里,関 富登志,千葉 寛之 訳

アスペクト (aspect)

様々な視点からみた際に,関心事 (特に横断的関心事) として分離されるべきソフトウェアの持つ側面.

アスペクト指向 (AO: Aspect-Oriented)

アスペクトに注目することで,オブジェクト指向のパラダイムでは不十分な部分の関心事の分離を行うパラダイム.

アナリシス パターン (analysis patterns)

ソフトウェア パターンの一種で,特に OOA (オブジェクト指向分析) 時に使用されるもの.
書籍: 『アナリシスパターン ―再利用可能なオブジェクトモデル』 株式会社ピアソン・エデュケーション マーチン・ファウラー 著 児玉 公信,友野 晶夫 訳,堀内 一 監訳

アンチ パターン (antipatterns)

ソフトウェア パターンの一種で,ソフトウェア開発において「こうあるべきだ」という典型例を集めたものがデザイン パターンであるのに対し,「こうあってはならない」という典型例を集めたテンプレート集がアンチ パターン.
書籍: 『アンチパターン ―ソフトウェア危篤患者の救出』 ソフトバンクパブリッシング William J. Brown,3,Hays W."Skip" McCormick,Raphael C. Malveau,Thomas J. Mowbray 著 岩谷 宏 訳

イディオム (idiom)

プログラミング言語やプラットフォームなど,実装レベルの問題に対するソフトウェア パターン

インスタンス (instance)

実体.クラスインスタンスオブジェクトであり,メタクラスインスタンスはクラスであり,UML メタモデルインスタンスUMLモデルである.

インタフェイス (interface)

広義では,境界.或る(まと)まりと別の或る纏まりが接する点のこと. ソフトウェア開発では,或るモジュールが別のモジュールに公開している機能の利用方法を記述したもののセット. オブジェクト指向においては,特に,それを実装するクラスに必要なメソッドやプロパティ,イベントのセットを定義したもの.

オブジェクト (object)

オブジェクト指向においては,そのソフトウェアにとって意味があり,明確な境界を伴う物理上・概念上の対象物 (エンティティ) のこと. 属性 (固有の姿・形・性質) や操作 (固有の振る舞い),関係 (他のオブジェクトとの関係),アイデンティティ(識別性) を持つ.

オブジェクト指向 (object-oriented)

ソフトウェア開発の考え方のひとつ.オブジェクト同士の相互作用としてシステムの振る舞いをとらえる考え方.

オブジェクト指向言語 (object-oriented language)

OOP (オブジェクト指向プログラミング)用のプログラミング言語.

カプセル化 (encapsulation)

構造と振る舞いをグループ化して1つの抽象物を定義し,異なる抽象物を互いに別物として分離する処理のこと.

クラス (class)

共通の属性・共通の振る舞い・共通の関係・共通のセマンティクスを持ったオブジェクトの集合を記述したもの.クラスも或る種のオブジェクトであるので,オブジェクトの集合を記述したオブジェクトという言い方もできる.

コンポーネント (component)

或る機能を持った部品.他のプログラムと組み合わせて使用する.

ソフトウェア パターン (software patterns)

ソフトウェア開発のためのパターン. ソフトウェアを設計する際に繰り返し現れる経験的な要素を抽出したもので,効率の良いプログラミングをするためのテンプレート. 「デザイン パターン」,「アーキテクチャパターン」,「アナリシス パターン」,「アンチ パターン」,「イディオム」等の種類がある.
URL: http://hillside.net/patterns/

ジェネリック プログラミング (Generic Programming: 汎用プログラミング)

C++ のテンプレート,Java や C# の Generics 等の機能を利用して汎用的なアルゴリズムやデータ構造を記述し,それを組み合わせるプログラミング手法.

デザイン パターン (design patterns)

ソフトウェア パターンの一種で,OOD (オブジェクト指向設計) において,過去のソフトウェア設計者が発見し,編み出した設計ノウハウを蓄積し,名前をつけ,再利用しやすいように特定の規約に従ってカタログ化したもの.
書籍: 『オブジェクト指向における再利用のためのデザインパターン』 ソフトバンクパブリッシング Erich Gamma,Ralph Johnson,Richard Helm,John Vlissides 著 本位田 真一,吉田 和樹 訳

パターン (pattern)

基は建築家 Christopher Alexander による. 問題の典型的な解決法を或る定められたフォーマットで記述したもの.
参考: デザインパターンFAQ

パターンランゲージ (pattern language)

基は建築家 Christopher Alexander による. 相互に関連したパターンの集合.個々の問題の解決法であるパターンを組み合わせることにより,より体系的に問題を解決に導けるようにしたもの.
書籍: 『パタン・ランゲージ ― 環境設計の手引』 クリストファー・アレグザンダー 著 平田 翰那 訳

フレームワーク (framework)

目的とするものを実現するための枠組み.
支援するものの集まりや考え方までを含む.利用者は,フレームワーク内の決まり事に従って利用することによりフレームワークによる支援を受けることができる.

ソフトウェア開発におけるライブラリとしての「フレームワーク」という言葉を使用した場合は,もっと意味が狭くなる.
アプリケーションの枠組みとなるライブラリであり,ユーザーは,フレームワークから呼ばれる必要な部分だけの個別のプログラムを書くことでアプリケーションを作成する.ユーザー プログラムは,フレームワークから制御されることとなる.

この意味でのフレームワークの性格を表す言葉として,以下の「Hollywood Principle (ハリウッドの法則)」というものがある.

"Don't call us. We'll call you."
(貴方から呼ばないで下さい.必要な時に私が呼びますから)

ポリモーフィズム (polymorphism: 多態)

同じメッセージに対して異なるオブジェクトが異なる動作をすること. 実際の動作は,それぞれのオブジェクトによって異なるが,外部からは同じインターフェイスで扱えるようになる. 「一つのインタフェイス,複数の実装」と表現される.

マルチ パラダイム デザイン (Multi-Paradigm Design)

オブジェクト指向アスペクト指向ジェネリック プログラミングパターン技術等,複数のパラダイムを組み合わせるデザイン手法.
書籍: 『マルチパラダイムデザイン』 ピアソンエデュケーション James O. Coplien 著 金沢 典子, 羽生田 栄一, 平鍋 健児 訳

メタクラス (metaclass)

クラスの集合を記述したもの.インスタンスクラスを示すオブジェクトとなるようなクラス

モデリング (modeling)

モデルを作成すること.

モデル (model)

問題を関心対象に焦点を当て特定の形式で表現したもの.
本質的なものだけが強調して抜き出される.
絶対的な真実を表現したものでなく仮説.

横断的関心事 (Crosscutting Concerns)

分割されたモジュールをまたがる関心事.例えば,「オブジェクト指向のパラダイムによって関心事の分離がなされたモジュール」間にまたがる関心事

関心事 (concerns)

ソフトウェアを構成する様々な要素のうち個別に着目することができひとまとめに扱うことのできる何か.

関心事の分離 (SOC:Separation of Concerns)

関心事を分離すること.関心事によってプログラムをモジュール分割すること.

継承 (inheritance)

既存のクラスを基に拡張や変更を加えた新たなクラスを定義すること. 基のクラスが持つ性質 (属性,操作,他のクラス等との関係) を引き継ぐ.

情報隠蔽 (information hiding)

細かい構造を外部から隠蔽し,外部からは公開された手続きでしか操作ができないようにすることで部分の独立性を高めること.

名前空間 (namespace)

名前空間 (namespace) と言うのは,プログラミング言語等で良く使われる概念である.
例えば,シンボル名 (変数名やメソッド名,クラス名等) が使用している複数のライブラリ等でぶつかってしまい支障があるような状況,所謂(いわゆる) "名前の衝突" と呼ばれる状況を避ける目的で良く使われる.
名前空間というのは,一般的には,中に同じ名前のものが複数存在しないように分けたもののことである.或る名前空間の中では,名前から特定のものを一意に決定できる.別の名前空間内にあるものは,名前空間と名前を組み合わせることで一意に特定できる.
プログラミング言語以外では,UML やインターネットで使われる URI (Uniform Resource Identifier: URL もこの一種) 等でも使われている概念である.


コラム: 「オブジェクト」と「インスタンス」はどう違うのか

オブジェクト

「オブジェクト」と「インスタンス」の定義はややこしい

オブジェクト指向での「オブジェクト」という言葉と「インスタンス」という言葉はどう違うのかについて、考察してみたい。


オブジェクトの広場 2004年10月号 ― オブジェクトの広場編集員が贈る勘違い集 より引用


---- 引用 ここから ----

クラスとオブジェクトは、異なる定義だと思っていた。


実は、クラスもオブジェクトと定義されるらしい。


オブジェクト指向について習い始めたとき、クラスとインスタンス、オブジェクトという3つの言葉の使い方に翻弄されたことを覚えています。


原因は教科書によって、インスタンスのことをオブジェクトと書いていたり、クラスのことをオブジェクトと書いていたりすることがあったからです。どちらかというと、インスタンスとオブジェクトが同義語として説明している教科書が私が読んだ書物の中では多数を占めていたため、

オブジェクト = インスタンス

という関係が正しい関係だと思っていました。実際は、オブジェクト指向ではクラスとインスタンスを含めてオブジェクトというのが正解らしいです。


ただし、インスタンスのことをオブジェクトと言ってもだいたいの相手には伝わるので「オブジェクトはインスタンスである」としていいのでしょう。

---- 引用 ここまで ----

上記記事にもある通り、確かに「オブジェクト」という言葉と「インスタンス」という言葉は紛らわしい。色々な意味で使われている。

オブジェクト = インスタンス

と説明してある例も随分多い。


また、オブジェクト指向言語の解説などの場合、言語の種類 (Java、C++ 等) によっても随分言葉の使い方に癖があるような気がする。


インターネット上で、「オブジェクト インスタンス」で検索をかけてみてほしい。 本当に様々な立場からの様々な解説が有って、目が回る。


例えば、Google の検索でトップになったサイトを見てほしい。


「インスタンス」という言葉

先ず、「インスタンス」という言葉のことであるが、「クラスのインスタンス」のことを単に「インスタンス」と呼ぶ例を良く見掛ける。


私は、これは、紛らわしい感じがする。

インスタンスというのは、「クラスのインスタンス」だけではないからである。


例.
   class Foo
   {
   }

   Foo foo = new Foo();


例えば、この場合、Foo はクラスである。他のものとの関係から相対的にそう呼ばれるのでなく、絶対的な呼称である。Foo は、他のものの有無に関わらず「クラス」と呼んでしまって構わないだろう。


そして、new Foo() によって作られたものが、Foo のインスタンスである。


確かにそうであるが、しかし、クラスのインスタンスばかりがインスタンスではない。

もしも或る MetaFoo というメタクラスがあったとすると、そこから作られたクラスがあれば、そのクラスは、MetaFoo のインスタンスである。

メタモデルからモデルが作られれば、それもインスタンスであろう。 他にも様々な種類のインスタンスが考えられる。


インスタンスというのは、絶対的な呼称ではなく、相対的な呼称であると思う。

クラスのインスタンスのことだけを、特に「狭義のインスタンス」として単に「インスタンス」と呼ぶ、というのは、少し紛らわしくはないか。

言葉の用法として、「インスタンス」とだけいった場合は、「メタな概念に対して或る具体的な一つの実例を指す相対的な呼称」のことを表す、とでもしといた方が良いのではないだろうか。


日常語で喩えれば、「小学生」や「未成年者」というのが絶対的な呼称であるのに対して、「息子」とか「父」、「母」というのは相対的な呼称である。

両方に使える紛らわしい言葉に「おばさん」「おじさん」がある。 絶対的な呼称として「中年の女性」や「中年の男性」を表す場合もあれば、相対的な呼称として「親の姉妹」、「親の兄弟」を表す場合もある。

「インスタンス」も、こうした紛らわしい使い方をされがちな言葉だと思う。


「オブジェクト」という言葉

「オブジェクト」は、「そのソフトウェアにとって意味があり、明確な境界を伴う物理上・概念上の対象物 (エンティティ) のこと。属性 (固有の姿・形・性質) や操作 (固有の振る舞い)、関係 (他のオブジェクトとの関係)、アイデンティティ(識別性) を持つ」のように説明してあることが多い。


さて次に「オブジェクト」という言葉である。


私は、「オブジェクト」というのは、「インスタンス」という言葉とは本来全然別の概念を表した言葉だと思う。



オブジェクト指向の主役が、「オブジェクト」である。オブジェクト指向では、オブジェクトに用が有るときは、オブジェクトに対してメッセージを投げることになっている。そうすると、オブジェクトは、受けたメッセージに対して固有の振る舞いをする。


例.

   class Foo
   {
       public static void Do()
       {
           // ... 何かの振る舞い
       }

       public void DoAnyThing()
       {
           // ... 何かの振る舞い
       }
   }

   Foo.Do();
   Foo foo = new Foo();
   foo.DoAnyThing();


上記のコードのうち、先ずここの部分であるが、


   Foo foo = new Foo();


Foo はクラスである。Foo に new (自分の新しいインスタンスを作れ) というメッセージを送ると、Foo は自分の新しいインスタンスを作る。


つまり、Foo というオブジェクトに new というメッセージを送ったことで、Foo はそのメッセージに応じて何か固有の振る舞いをしたわけである。


   Foo.Do();


ここも同様。

Foo というオブジェクトに Do というメッセージを送ると、Foo はそのメッセージに応じて何か固有の振る舞いをする。


次にここ。


   foo.DoAnyThing();


Foo のインスタンスに DoAnyThing というメッセージを送ると、この Foo のインスタンスは何かの振る舞いをする。


つまり、「Foo のインスタンス」というオブジェクトにメッセージを送った場合も、「Foo のインスタンス」はそのメッセージに応じて何か固有の振る舞いをするわけである。


クラスもクラスのインスタンスもオブジェクトということになるだろう。

メタクラスだって同様である。


オブジェクト指向の解説書などでは、クラスやクラスのインスタンスよりもっと抽象的な概念として、これら「メッセージによって振舞う」主体のことをオブジェクトと呼んでいると思う。


上では個別の振る舞いについてのみ考察したが、他の「オブジェクトの特質」である、属性、関係、アイデンティティのそれぞれについても同様のことは言えるのではないかと思う。



最後に

以上、「オブジェクト」と「インスタンス」の違いについて考察を行ってみた。


唯、一つの問題点があって、これではクラスのインスタンスのことを表す言葉がないのである。


そこで一般的には、クラスのインスタンスは、「狭義のインスタンス」ということで単に「インスタンス」と呼ばれていたり、「狭義のオブジェクト」ということで単に「オブジェクト」と呼ばれてしまっているのではないだろうかと考える。

つまり、「クラスのインスタンス」という単一の概念を表す言葉として、「インスタンス」という言葉と「オブジェクト」という言葉が、それぞれ使われてしまっている。

私は、このそれぞれの用法は、確かに紛らわしくはあるが、それ自体は上記の理由から誤用とは言えないと思う。


但し、だからといって、

オブジェクト = インスタンス

としてしまうのは、危険だと思う。

これは、「非常に狭い意味でしか通用しない危うい等式」だと思うのである。


フィードバックのお願い

ご意見・ご感想などは、

fujiwo@shos.info または、 「Fujiwoの日記 ― 2004/10/02(Sat) 「オブジェクト」と「インスタンス」はどう違うのか

にお願い致します。

関連する議論が以下にあります。