OOP|Object-Oriented Programming
オブジェクト指向プログラミングはプログラミング手法一つで、データと処理をひとまとめにしたオブジェクト同士の相互作用として、プログラム全体を記述するものです。プログラムの中で、操作の対象となる大半のモノ・コトはオブジェクトとして扱われます。
オブジェクト指向プログラミングには、クラス(class)*1と呼ばれる「設計図(雛形)」と、それを「製品」として実体化させたインスタンス(instance)という2つの概念があって、クラスから複数のインスタンスを生成したり、クラスを「継承」した新たなクラスからそのインスタンスを生成したりして、プログラム全体を構築していきます。
オブジェクトという言葉との関係で言うと「クラスを元に作り出したオブジェクトがインスタンス」です。プログラムの中で扱われるオブジェクトのすべてがクラスから生成されるわけではなく、オブジェクトの方が広い概念なので、以下のような関係になります。
クラスには、オブジェクトに内包されるデータ を意味する プロパティ(property)と、処理 を意味する メソッド(method)が含まれます。
オブジェクトに内包されるもの全体をメンバというので、言語によっては、プロパティをメンバ変数、メソッドをメンバ関数と呼ぶこともあります。
オブジェクトを具体的な「モノ・コト」に例えみましょう。例えば「車」は以下のようなデータと処理機能を持ったオブジェクトであると言えます。
ただ、実際にプログラミングをはじめると、具体的な「モノ・コト」としてはイメージしにくいようなオブジェクトも出てきます。で、私自身は「オブジェクトはプロパティとメソッドを持つ」という言い方を反転して、「プロパティとメソッドを持ったかたまりをオブジェクトと言う」という感じで、それを逆向きに理解するようにしています。
現在では、多くのプログラミング言語が「オブジェクト指向」のパラダイム(考え方の枠組み)を取り入れています。
プログラムの中でオブジェクトを扱う記法はどの言語でも基本的には同じで、オブジェクト名とプロパティ名・メソッド名を [ . ](ドット)で接続します。
Car というクラスから、car というインスタンスを生成するコードは以下のような感じです(言語によって書き方は異なります)。
car = new Car( 'Fiat', '500', 850 , 'white' );
プロパティは、オブジェクトが持つ様々な「属性データ」です。
オブジェクト名.プロパティ名
car.name // Fiat car.mode // 500 car.weight // 850(kg) car.color // white
メソッドは、クラスの中では関数として定義されるので、一般には何らかの引数を持ちます。したがってメソッドには ( ) がつく と理解すると、プロパティとの見分けがつくでしょう。
オブジェクト名.メソッド名(引数)
car.start( ) car.drive( ) car.brake( ) car.stop( )
参考:https://www.w3schools.com/js/js_objects.asp
従来の「手続き型プログラミング」では、「データ(変数またはプロパティ)」と「処理(関数またはメソッド)」はバラバラに捉えられていて、プログラマーは、処理を担う「関数(引数>処理>戻り値)」を、いかに独立性の高いものに仕立てるか・・ということに関心を集中させていましたが、機能、手続きを中心に構成されたプログラムには、以下のような問題がありました。
オブジェクト指向プログラミングでは、「データ」と「処理」をセットにした「オブジェクト」を構成単位と見なすとともに「オブジェクトのデータは、オブジェクトが持つメソッドによって処理される」と考えることで、プログラマーは、それがいかに単品としてうまく動くかということに専念できるようになりました。これは、画期的な意識改革です。
実は、私たち「生き物」も、またそれを構成する単位である「細胞」も、すべて同様に内部に「データ」と「処理システム」を持つオブジェクトです。データはデータ、処理は処理と、バラバラなものを寄せ集めても、大きなシステムがうまく動く保証はありません。しかし「きちんと動く小さなモノを集めて少し大きなモノを作り、それらを集めてさらに大きなモノを作る」という発想で仕事をすれば、物事はうまくいきます。実際に「車」というオブジェクトは、ネジのようなサイズの小さな部品から、少しづつ大きなパーツの塊ができ、最終的には、いくつかの大きなパーツの組み合わせとして出来上がります。個々のパーツは、それぞれの段階で、きちんと動くようにできているので、最後の組み立てもシンプルな作業になります。
社会をオブジェクト指向の視点で眺めると、個々の人間や、人間が集まった組織や地域社会もオブジェクトと考えることができます。
個々の人はそれぞれが自分の特性(プロパティ)とスキル(メソッド)を持っていて、他者とのコミュニケーションを通して、協働的に問題を解決しています。同様に、組織や地域社会も、それぞれが他の組織や地域社会と連携することで、その秩序を維持しています。
個々のオブジェクトは独立した存在として機能するとともに、他のオブジェクトとメッセージを交換しつつ協調動作を行いながら、全体としてひとつの世界を作っているのです。
BAND(結束・絆)は、音楽のバンドを意味すると同時に、かつて人類が狩猟採集生活を行なっていたときの基礎集団を意味する言葉ですが、まさにこのBANDの集合体として社会が構成されることが、生物としての人類の道理にかなう方法ではないかと思います。
社会は中央集権(ツリー構造・トップダウン)ではうまくいかない・・というのは現実を見れば明らかです。生物の世界と同様に「うまく動く小さなもの」が「自律分散的に協調する」というしくみ(セミラティス)をデザインする必要があります。
インターネットの登場は、この「自律分散協調システム」を飛躍的に拡張する契機となりました。オブジェクト指向の考え方、インターネットを支えている思想と技術、そしてソーシャルデザイン、いずれも「自律分散協調」というキーワードで繋がっています。是非、これらの「哲学」を学んで欲しいと思います。
初期のコンピュータプログラミングは、入力>処理>出力という計算手順を逐次的に書くだけ・・というシンプルなものでしたが、扱う対象の変化に伴い、その書き方の発想も変化してきました。特にGUI(グラフィカルユーザーインターフェイス)の登場で、マウスクリックなどの「イベント」への対応が中心になるとともに、データと処理(関数)をパック化した「オブジェクト」を中心としたプログラミングへと変化してきました。現在のプログラミング言語の多くはオブジェクト指向型のパラダイムを採用しています。