OOPの紹介

Python SELF JA
レベル 15 , レッスン 2
使用可能

2.1 OOPの基本コンセプト

オブジェクト指向プログラミングの基盤はOOPのパラダイム。これは プログラムの全てのエンティティがオブジェクトとみなされること。オブジェクト はデータ + そのデータに対して何らかの処理を行うメソッド/関数。

また、オブジェクトは状態と振る舞いを持っているとも言える。 オブジェクトの状態は、その内部変数に保存されているデータによって確保される。 オブジェクトの振る舞いは、そのメソッドが行う全てのアクションの集合。

中規模のプログラムではオブジェクトは数千、多大な規模では数百万にもなる。だから、オブジェクトをクラスに整理し、クラスをある種の階層にすることが決められた。

興味深いね!クラス階層のコンセプトは動物界から借りたもので、人間は霊長類で、霊長類は哺乳類で...という感じ。

各オブジェクトにはそれを作成するためのクラスがある。一方では、クラスはオブジェクトのテンプレートであり、他方では、それ自身の特徴を備えた独立したオブジェクト。

クラスの概念をよりよく理解するために、次の定義を見てみよう:

クラス:

クラスは、オブジェクトを作成するためのテンプレートやスキーマであり、このタイプのすべてのオブジェクトに共通する属性とメソッドを定義する。クラスはデータとそのデータを操作する関数を一体化させる。

オブジェクト:

オブジェクトはクラスのインスタンス。各オブジェクトは 状態(属性によって決まる)と 振る舞い(メソッドによって決まる)を持つ。

カプセル化:

カプセル化はクラスの内部実装を隠し、このクラスのオブジェクトとのインターフェースを提供することにある。データを保護し、それへのアクセスを管理するのに役立つ。

継承:

継承は、あるクラス(子)が他のクラス(親)の属性とメソッドを継承できることを許す。これにより、コードの再利用が可能になり、その保守が簡単になる。

ポリモーフィズム:

ポリモーフィズムは、異なるクラスのオブジェクトと一貫したインターフェースで作業することを可能にする。これは、親クラスから継承したメソッドを子クラスでオーバーライドすることで実現される。

抽象化:

抽象化は、オブジェクトの共通の特徴を抽出し、これらの共通の特徴を表すクラスを作成することにある。これにより、複雑なシステムを簡素化し、その理解を助ける。

半分ほどでも理解できたら素晴らしい。次に、これらの各項目を詳細に説明する。

2.2 抽象化

現実世界での抽象化の良い例は、会社や組織の職位の説明だ。職位名は一つのことだが、各特定の職位の責任は全く別のもの。

将来の会社の構造を設計することを想像して。秘書の役割を他のいくつかの職責に「分散」させることができる。最高経営責任者の役割を複数の独立した役職、例えば財務担当役員、技術担当役員、マーケティング担当役員、人事担当役員に分割することもできる。または、オフィスマネージャーとリクルーターの職位を一つにまとめることも可能。

プログラミングの観点から、抽象化はプログラムをオブジェクトに正しく分けること。通常、どんな大きなプログラムでも、相互作用するオブジェクトとして何十通りもの方法で表現することができる。 抽象化は主要な特徴を選び出し、二次的なものを省くことを可能にする

抽象化はまるで軍事戦略のようなもの。悪い戦略だと、どんなに優れた戦術でも状況を改善することはできない。

2.3 カプセル化

カプセル化の目的は、要素間の相互作用の質を改善し、その相互作用を簡素化すること。

物事を簡素化するための最も良い方法は、すべての複雑なものを他人の目から隠すこと。例えば、ボーイングの操縦席に座らされたら、すぐにはどう操作するか分からないだろう:

一方で、飛行機の乗客にとっては全てが簡単に見える:チケットを買って、飛行機に乗って、離陸して着陸する。君は「チケットを買う」と「飛行機に乗る」だけのスキルで大陸間を簡単に飛行できる。飛行機の準備、離陸、着陸、様々な非常事態の複雑さは私たちから隠されている。衛星ナビゲーション、自動操縦、空港の管制センターは言うまでもない。そしてそれが私たちの生活を簡単にしてくれる。

プログラミングの観点から、カプセル化は「実装の隠蔽」だ。こんな定義が好きだ。クラスは数百のメソッドを持ち、様々な状況で非常に複雑な動作を実現できる。しかし、他の人の目からそのすべてのメソッドを隠し(名前の両側を「__」で囲む)、他のクラスと相互作用するためにほんのいくつかのメソッドだけを残しておける。 その場合、プログラムの他の全てのクラスはそのクラスの中にたった三つのメソッドしか見えず、それらのメソッドを呼び出すことになる。そして、すべての複雑さはクラスの内部に隠されているんだ、幸せな乗客から隔離されたパイロットの操縦席のように。

2.4 継承

継承には二つの側面がある。プログラミングの側面と現実生活の側面。プログラミングの観点から継承は 特別な関係が二つのクラス間にあることだ。しかし、現実生活の観点から継承とは何なのかがさらに興味深い。

何かを現実世界で作り出す必要がある場合、二つの方法がある:

  1. 大量の時間と労力を費やしてゼロから必要なものを作る。
  2. 既存のものを基礎にして必要なものを作る。

最も最適な戦略はこうなる: 既存の良い解決策を取り、少し改良して自分のニーズに合わせて使う

人間の発展の歴史をたどると、地球上に生命が誕生してから何十億年も経っている。しかし、もし人間が猿から(猿を基に)生まれたと考えるなら、たった数百万年しか経っていない。 ゼロからの創造は時間がかかる。ずっと時間がかかる

プログラミングでも、一つのクラスを他のクラスを基にして作成することができる。 新しいクラスは既存のものの子孫となる(継承する)。これは非常に有利で、80%–90%必要なデータとメソッドを含んでいるクラスがある場合に特に便利。 親クラスを新しいクラスの親として宣言すると、新しいクラスには親クラスのすべてのデータとメソッドが自動的に現れる。便利でしょ?

2.5 ポリモーフィズム

ポリモーフィズムはプログラミングの領域からの概念。異なる実装が一つのインターフェースの背後に隠れる状況を説明する。現実生活でその類似のものを探すと、車の運転プロセスがその一例。

トラックを運転できる人なら、救急車やスポーツカーのハンドルを握ることもできる。 人は車を操作できる、マシンが何であるかに関わらず、なぜなら全て同じ操作インターフェースを持っているから:ハンドル、ペダル、ギアシフトレバー。内部構造は異なっても、全ての車は同じ操作インターフェースを持っている。

プログラミングに戻ると、ポリモーフィズムは異なるクラス(通常は共通の祖先を持つ)のオブジェクトに対して統一的に操作することを可能にする – これを過小評価するのは難しいこと。その価値はプログラムが巨大になるほど増す。

OOPは原則だ。内なる法則。 それぞれが何かしらの制約を与えるが、プログラムが大規模になるときには大きな利点をもたらす。OOPの四つの原則は椅子の四つの脚のようなもの。一つでも外れると、全システムが不安定になる。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION