オブジェクト指向プログラミング
OOP|Object-Oriented Programming
オブジェクト指向プログラミングはプログラミング手法一つで、データと処理をひとまとめにしたオブジェクト同士の相互作用としてプログラム全体を記述するものです。プログラムの中で操作の対象となる大半のモノ・コトはオブジェクトとして扱われます。
はじめに
プログラミング言語のパラダイム
初期のコンピュータプログラミングは、入力>処理>出力という計算手順を逐次的に書くだけ・・というシンプルなものでしたが、扱う対象の変化に伴い、その書き方の発想も変化してきました。特にGUI(グラフィカルユーザーインターフェイス)の登場で、マウスクリックなどの「イベント」への対応が中心になるとともに、データと処理(関数)をパック化した「オブジェクト」を中心としたプログラミングへと変化してきました。現在のプログラミング言語の多くはオブジェクト指向型のパラダイムを採用しています。
- 構造化プログラミング|Structured programming
- 手続き型プログラミング|Procedural programming
- 関数型プログラミング|Functional programming
- イベント駆動型プログラミング|Event-driven programming
- オブジェクト指向プログラミング|Object-oriented programming
オブジェクト指向のプログラミング言語
現在では、多くのプログラミング言語が「オブジェクト指向」のパラダイム(考え方の枠組み)を取り入れています。
- C++
- C#
- Java
- JavaScript サイト内記事
- Objective-C
- PHP サイト内記事
- Python サイト内記事
- Ruby
オブジェクト指向が社会を更新する
人間と道具は「共進化」するものです。今日の社会は、オブジェクト指向でプログラミングされたアプリケーションがその情報基盤を支えていることから、私たち自身、日常の様々な手続きや情報交換を通して、無意識のうちに、その思考的枠組の影響を受けていると言えます。逆に言えば、それを意識化することができれば、我々をとりまく社会システムをクリアに捉えることができます。
コンピュータの設計と人間の活動は、共に進化しなければならない
Apple Computer, 1987, Human Interface Guidelines
道具の使い方を学ぶことが私たち自身を変える・・ という点に人間と道具の関係の本質がある。
アラン・ケイ, 1994, 人間のためのコンピュータ, Addison Wesley Publisher JP
Keywords
クラスとインスタンス
オブジェクト指向プログラミングには、クラス(class)*1と呼ばれる「設計図(雛形)」と、それを「製品」として実体化させたインスタンス(instance)という2つの概念があって、クラスから複数のインスタンスを生成したり、クラスを「継承」した新たなクラスからそのインスタンスを生成したりすることで、プログラム全体が構築されます。
- クラス(設計図)→ インスタンス(製品)
- クラス(設計図)→ 継承 → 応用的なクラス → インスタンス(製品)
オブジェクトという言葉との関係で言うと「クラスを元に作り出したオブジェクトがインスタンス」です。プログラムの中で扱われるオブジェクトのすべてがクラスから生成されるわけではなく、オブジェクトの方が広い概念なので、以下のような関係になります。
- ×:オブジェクトはインスタンスである
- ◯:インスタンスはオブジェクトである
プロパティとメソッド
クラスには、オブジェクトに内包されるデータ を意味する プロパティ(property)と、処理 を意味する メソッド(method)が含まれます。
オブジェクトに内包されるもの全体をメンバというので、言語によっては、プロパティをメンバ変数、メソッドをメンバ関数と呼ぶこともあります。
- プロパティ:オブジェクトの「状態」を表す「データ」
- メソッド:オブジェクトの「操作」を表す「処理」
オブジェクトを具体的な「モノ・コト」に例えみましょう。例えば「車」は以下のようなデータと処理機能を持ったオブジェクトであると言えます。
- プロパティ:車の名前、型式、重量、色、現在位置、スピード・・・
- メソッド:エンジン始動、エンジン停止、走る、止まる、点灯する・・
我々が使っている自然言語で例えると・・・
- プロパティ:名詞・形容詞(title, place, time, size, color・・)
- メソッド:自動詞・他動詞(Start(), Stop(), EditText(), PutImage(… ), ・・ )
ただ、実際にプログラミングをはじめると、具体的な「モノ・コト」としてはイメージしにくいようなオブジェクトも出てきます。で、私自身は「オブジェクトはプロパティとメソッドを持つ」という言い方を反転して、「プロパティとメソッドを持ったかたまりをオブジェクトと言う」という感じで、それを逆向きに理解するようにしています。
プログラムの中でのオブジェクトの記述
プログラムの中でオブジェクトを扱う記法はどの言語でも基本的には同じで、オブジェクト名とプロパティ名・メソッド名を [ . ](ドット)で接続します。
インスタンス(オブジェクト)の生成
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の集合体として社会が構成されることが、生物としての人類の道理にかなう方法ではないかと思います。
社会は中央集権(ツリー構造・トップダウン)ではうまくいかない・・というのは現実を見れば明らかです。生物の世界と同様に「うまく動く小さなもの」が「自律分散的に協調する」というしくみ(セミラティス)をデザインする必要があります。
インターネットの登場は、この「自律分散協調システム」を飛躍的に拡張する契機となりました。オブジェクト指向の考え方、インターネットを支えている思想と技術、そしてソーシャルデザイン、いずれも「自律分散協調」というキーワードで繋がっています。是非、これらの「哲学」を学んで欲しいと思います。
APPENDIX
身近な物事をオブジェクト指向(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 ) : # デストラクタ(削除) # 記事を削除するコード # メインプログラム post01 = article( "卒展20XX" ) # 初期化 post01.edit( ) # 記事の詳細執筆 post01.release( ) # 記事の公開 post02 = article( "Pythonワークショップのご案内" ) # 初期化 post02.edit( ) # 記事の詳細執筆 post02.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 はコマンド指向(プロセス指向)である・・という違いがあります。
- GUI:操作対象を選択 > (右クリック)操作を選択
文法的には、目的語>動詞 の順になります。 - CUI:コマンドに続けて、操作対象を記述
文法的には、動詞>目的語 の順になります。
例:$ cat file1.txt ・・・・ 表示しなさい・file1.txt を
世の中にあるあらゆる「モノ」は、基本的には、目に見える対象(オブジェクト)として存在しているので、ユーザの立場からするとオブジェクト指向の方がわかりやすいものになります。例えば・・
- 新式の自動販売機:オブジェクト指向(買い手の視点)
商品を選択 > スマホ(ICカード)をあてる、あるいは現金を入金
- 旧式の自動販売機:プロセス指向(機械の作り手の視点)
お金を入れる > システム起動 > 商品選択
このパターンだと、キャンセルしたい場合、返却ボタン>返金という無駄な作業が発生