OOP|Object-Oriented Programming
オブジェクト指向プログラミングはプログラミング手法一つで、データと処理をひとまとめにしたオブジェクト同士の相互作用としてプログラム全体を記述するものです。プログラムの中で操作の対象となる大半のモノ・コトはオブジェクトとして扱われます。
初期のコンピュータプログラミングは、入力>処理>出力という計算手順を逐次的に書くだけ・・というシンプルなものでしたが、扱う対象の変化に伴い、その書き方の発想も変化してきました。特にGUI(グラフィカルユーザーインターフェイス)の登場で、マウスクリックなどの「イベント」への対応が中心になるとともに、データと処理(関数)をパック化した「オブジェクト」を中心としたプログラミングへと変化してきました。現在のプログラミング言語の多くはオブジェクト指向型のパラダイムを採用しています。
現在では、多くのプログラミング言語が「オブジェクト指向」のパラダイム(考え方の枠組み)を取り入れています。
人間と道具は「共進化」するものです。今日の社会は、オブジェクト指向でプログラミングされたアプリケーションがその情報基盤を支えていることから、私たち自身、日常の様々な手続きや情報交換を通して、無意識のうちに、その思考的枠組の影響を受けていると言えます。逆に言えば、それを意識化することができれば、我々をとりまく社会システムをクリアに捉えることができます。
コンピュータの設計と人間の活動は、共に進化しなければならない
Apple Computer, 1987, Human Interface Guidelines
道具の使い方を学ぶことが私たち自身を変える・・ という点に人間と道具の関係の本質がある。
アラン・ケイ, 1994, 人間のためのコンピュータ, Addison Wesley Publisher JP
オブジェクト指向プログラミングには、クラス(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の集合体として社会が構成されることが、生物としての人類の道理にかなう方法ではないかと思います。
社会は中央集権(ツリー構造・トップダウン)ではうまくいかない・・というのは現実を見れば明らかです。生物の世界と同様に「うまく動く小さなもの」が「自律分散的に協調する」というしくみ(セミラティス)をデザインする必要があります。
インターネットの登場は、この「自律分散協調システム」を飛躍的に拡張する契機となりました。オブジェクト指向の考え方、インターネットを支えている思想と技術、そしてソーシャルデザイン、いずれも「自律分散協調」というキーワードで繋がっています。是非、これらの「哲学」を学んで欲しいと思います。
身近な物事をオブジェクト指向(Python風)で記述すると・・・
# クラスの定義 class article : def __init__( self, what ) : # コンストラクタ(新規作成) self.what = what self.when = "" self.where = "" self.who = "" self.how = "" def edit( self, ・・・ ) : # メソッド # 記事の編集するコード def release( self ) : # 記事を公開するコード def __del__( self ) : # デストラクタ(削除) # 記事を削除するコード # メインプログラム event = article( "卒展20XX" ) # 初期化 event.edit( ) # 記事の詳細執筆 event.release( ) # 記事の公開
# クラスの定義 class project : def __init__( self, title ) : # コンストラクタ(新規作成) self.title = title self.sub_title = "" self.purpose = "" self.member = "" self.period = "" : def empathize( self, ・・・ ) : # 共感のプロセス def define( self, ・・・ ) : # 課題の定義 def ideate( self, ・・・ ) : # アイデア創出 def prototype( self, ・・・ ) : # プロトタイピング def test( self, ・・・ ) : # テスト def meeting( self, ・・・ ) : # 会議の開催 def task( self ) : # タスクの実行 def __del__( self ) : # デストラクタ(削除) # プロジェクトの解散 # メインプログラム project01 = project( ''20XX春期商品開発'') #初期化 project01.meeting(・・・・) #目的、メンバー、期間等の確認会議 project01.empathize(・・・・) project01.define(・・・・) :
コンピュータには GUI(Graphical User Interface)と CUI(Character User Interface)とがありますが、GUI がオブジェクト指向であるのに対して、CUI はコマンド指向(プロセス指向)になります。
世の中にあるあらゆる「モノ」は、基本的には、目に見える対象(オブジェクト)として存在しているので、ユーザの立場からするとオブジェクト指向の方がわかりやすいものになります。例えば・・
商品を選択 > カードあるいは現金を入金
お金を入れる > システム起動 > 商品選択このパターンだと、キャンセルしたい場合、返却ボタン>返金という無駄な作業が発生