オブジェクト指向ってなんだ?

オブジェクト指向がよくわからない。。。

ので、いままで見聞きした情報を整理してみたい。

歴史

  • 大規模化したプログラムを効率よく記述しプログラム設計上のミスが起こりづらいようにするための方法論 として、「順次・反復・分岐」の3つの基本的な論理構造で構成される「構造化プログラミング」が1967年にエドガー・ダイクストラにより提唱される。構造化プログラミング - Wikipedia
  • コンピュータの高速化およびソフトウェアの複雑化に伴い、ソフトウェアの需要に供給が追いつかない危機的状況=「ソフトウェア危機」が1968年にNATOの会議にて議題に上る。
  • 1967年にシミュレーション用の言語として「Simula」が開発される。

開発の動機は、ある制限下におかれたモデル群の全体の挙動をどう記述するか、というものである。気体の分子運動を例にとると、システム全体を考えてその中の項として分子を扱うよりも、一つの一つの気体分子をモデル化し、それぞれの相互作用の結果をシステムとして捉える方が自然で取り扱いやすい。その為には小さなモデル、関連する法則、それらを一度に複数取り扱う能力が必要となる。こうして属性を備えたオブジェクト概念と、それに従属するメソッド概念が生まれたのである。

http://ja.wikipedia.org/wiki/Simula
  • オブジェクト指向」という用語を作ったのは1972年に「Smalltalk」を作ったアラン・ケイ
  • 1980年代前半、C言語オブジェクト指向をサポートする為に拡張した C++ がビャーネ・ストロヴストルップにより開発される
    • C++の開発当初の名前は「C with Classes」
    • C言語の拡張的な立ち位置なので従来の手続き型プログラミングも可能なマルチパラダイム言語である。
  • 1990年代前半、オブジェクト指向プログラミングの考え方に基づいて設計された言語 Java が開発される。
    • Javaはプラットフォームに依存しない実行環境上で動作する言語である
    • Javaは自動ガベージコレクション機能を有し、メモリの管理を自動化している
    • 現在サーバから組み込み機器まで幅広く使用されている
歴史に関する私見
  • 今まで家内制手工業的だったプログラム開発が、需要の高まりに合わせて生産性を求められ工業化する必要に迫られた。
  • その解決方法の一つが、元々は研究目的のシミュレーション用に開発されたオブジェクト指向プログラミング。
    • その他の解決方法として、構造化プログラミング、モジュール化などがあり、オブジェクト指向プログラミングはそれらの特徴を取り入れた上で継承やポリモーフィズムなどの機能を付け加えた
  • C++ の登場で、オブジェクト指向プログラミングが商用で本格的に使用され始めた
  • マルチプラットフォームで動作可能で、C++ よりメモリの管理を厳重にした Java が現在でのオブジェクト指向プログラミングの主流となっている

オブジェクト指向プログラミングの三大特徴

カプセル化(隠蔽)
  • 関連したデータと処理をオブジェクトにまとめる
  • 外部からアクセスできるデータと処理を制限することで、外部からの不必要な干渉を除外することでプログラムの崩壊を防ぎよりシンプルな構造にすることができる
  • オブジェクトの利用者は使用方法のみ知っていれば良く、再利用性に優れている
継承
  • オブジェクトの内部をいじることなく、オブジェクトの拡張をすることができる

ポリモーフィズム(多相性、多態性

要調査

三大特徴に対する私見
  • 優れた部品は「使いやすく」「壊れない」という特徴を持つ
  • オブジェクト指向プログラミングの三大特徴は「使いやすく」「壊れない」を保証するためのもの
  • よってオブジェクト指向プログラミングは優れたソフトウェア部品を提供することを容易にしている

オブジェクト指向言語の分類

オブジェクト指向言語は大きく「クラスベース」と「プロトタイプベース」に分かれる

クラスベース
  • クラスと呼ばれるオブジェクトの設計図をもとに実際に利用されるオブジェクト(インスタンス)を生成するタイプ
  • クラスを継承する事により機能を拡張することができる
  • クラスにメソッドが集約される為、メモリの節約になる
プロトタイプベース
  • クラスを持たないオブジェクト指向言語
  • すべてのオブジェクトは既存のオブジェクトをコピーすることにより生成される
  • クラスを持たないため、クラスによる複雑性が排除されている