OOPの紹介

Frontend SELF JA
レベル 39 , レッスン 1
使用可能

2.1 OOPの基本概念

プログラミングのオブジェクト指向アプローチの基盤はOOPのパラダイムだよ。これはプログラムの全てのエンティティがオブジェクトと見なされるってこと。オブジェクトはデータと、それに対して何かを行うメソッド/関数を含むんだ。

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

中くらいのプログラムには何千ものオブジェクト、大きなものには何百万ものオブジェクトがあるんだ。それで、混乱を少しでも減らそうと、オブジェクトをクラスに整理し、オブジェクトのクラスをある種の階層に整理することが決定されたんだ。

これは面白い!
クラスの階層の概念は動物界から取られたもので、人間は霊長類であり、それは哺乳類である、って感じだよ。

各オブジェクトにはそれを生成するためのクラスがあるんだ。一方でクラスはオブジェクトのひな型であり、他方では独立したオブジェクトとしての特徴を持っている(これについては後で話すよ)。

クラスの概念をより良く理解するには、以下の定義をよく見てみよう:

クラスは、オブジェクトを作成するためのテンプレートやスキームであり、このタイプのすべてのオブジェクトに特徴的な属性とメソッドを定義するんだ。クラスはデータとそのデータを操作する関数を一体化することを許可するよ。

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

カプセル化は、クラスの内部実装を隠蔽し、オブジェクトと対話するためのインターフェースを提供することにあるんだ。これにより、データを保護し、そのアクセスを管理することができるんだよ。

継承は、あるクラス(子クラス)が別のクラス(親クラス)の属性とメソッドを継承することを可能にする。これはコードの再利用を促進し、そのメンテナンスを簡素化するんだ。

ポリモーフィズムは、異なるクラスのオブジェクトを扱う際に統一されたインターフェースを使用できるようにするんだ。これは、親クラスから継承したメソッドを子クラスでオーバーライドすることで達成されるんだ。

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

もしこれの半分でも理解できたら、すごいよ。これから、これらの各ポイントについて詳しく解説していくよ。

2.2 抽象化

現実世界での良い抽象化の例は、会社や組織における職務記述のことだよ。職の名前は一つだけど、各職務の任務はまったく別のものだね。

君が自分の未来の会社の構造を設計していると想像してみて。秘書の任務を他のいくつかの職務に「分ける」ことができるよ。最高経営責任者の職務を、財務担当役員、技術担当役員、マーケティング担当役員、人事担当役員などのいくつかの独立した役職に分割することもできる。または、例えば、オフィスマネージャーとリクルーターの職務を1つにまとめることもできるんだ。

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

抽象化

抽象化は戦闘における戦略のようなもの。悪い戦略では、どんな天才的な戦術でも状況を改善することはできないんだ。

2.3 カプセル化

カプセル化の目的は、物事の相互作用の質を改善することで、それらを単純化することなんだ。

カプセル化

そして、何かを簡素化するための最良の方法は、それを外部から隠すことなんだ。例えば、もし君がボーイングのコックピットに座らされたら、すぐには操作方法が分からないだろうね:

ボーイングのコックピット

一方、飛行機の乗客にとっては全てがシンプルに見える: チケットを買って、飛行機に乗って、離陸して着陸するだけでいいんだ。「チケットを買う」と「飛行機に乗る」スキルだけで簡単に大陸間を飛行できるんだよ。離陸や着陸、様々な緊急事態を含む飛行機の準備を含む全てのことが、私たちには隠されているんだ。衛星ナビゲーションやオートパイロット、空港での管制センターについては言うまでもないね。それが私たちの生活を簡単にしてくれるんだ。

プログラミングの観点から見ると、カプセル化は「実装の隠蔽」なんだ。私はこの定義が好きなんだ。私たちのクラスは何百ものメソッドを含んでいるかもしれないし、様々な状況で非常に複雑な動作を実装しているかもしれない。でも、外部からは全てのメソッドを隠すことができるんだ(名前を「__」で囲むことで)。そして、他のクラスとやり取りするために、たった2、3のメソッドだけを公開するんだ。そうすれば、他の全てのクラスはこのクラスの中にたったの三つのメソッドだけを見ることができ、それらのメソッドを呼び出すことになるんだ。そして、全ての複雑さはクラス内部で隠されるんだ。まるでパイロットのコックピットが幸せな乗客から隠されているみたいにね。

2.4 継承

継承にはプログラミング側と現実世界側の2つの側面がある。プログラミングの観点から見ると、継承は2つのクラス間の特別な関係なんだ。でも、現実世界の視点から見たら、継承ってもっと面白いんだよ。

もし現実の世界で何かを作る必要があったとしたら、2つの解決策が考えられる:

  1. 必要なものをゼロから作り上げること。たくさんの時間と労力がかかるけどね;
  2. 既存のものを基にして必要なものを作ること。

最も効果的な戦略はこうだよ:既存の良い解決策を取り、それを少し改良して、自分の必要に合わせて使う

人間の起源をたどってみると、生命がこの星に誕生してから何十億年もが過去に流れている。もし人間が猿から(猿を基にして)進化したものと考えれば、わずか数百万年で済んでいるんだ。ゼロから作るのはもっと時間がかかる。ずっと長いんだ

プログラミングでは、あるクラスをもう一つのクラスを基にして作成することもできるんだ。新しいクラスは既存のクラスの子クラス(継承クラス)になるんだ。これは、クラスが必要なデータとメソッドの80〜90%が含まれている場合にとても有利なんだよ。私たちは単に適切なクラスを私たちの新しいクラスの親として宣言するだけで、すると新しいクラスには親クラスの全てのデータとメソッドが自動的に生成されるんだよ。便利だよね?

2.5 ポリモーフィズム

ポリモーフィズムはプログラミングの分野の概念で、一つのインターフェースで異なる実装を隠す状況を説明するんだ。現実世界でそのアナログを探そうとすると、車の運転プロセスがその一つだね。

もし人がトラックを運転できるならば、それは救急車のハンドルを握ることもできるし、スポーツカーのハンドルを握ることもできる。人はそれがどんな車であれ運転することができる、なぜなら全て同じ運転インターフェースを持っているから:ハンドル、ペダル、そしてギアボックスレバーね。車の内部構造は違っても、全て同じ運転インターフェースを持っているんだよ。

プログラミングに戻ると、ポリモーフィズムは異なるクラスのオブジェクトに対して一貫性を持った操作をサポートする(通常は共通の祖先を持つ)—この重要さは過小評価できないんだ。プログラムが大きくなるほど、その価値は増すんだ。

OOPは原則だよ。内部の法律なんだ。それぞれが何らかの点で私たちを制限し、プログラムが大きくなった時に大きな利点を与えてくれるんだ。OOPの4つの原則は、まるで椅子の4本の脚のようだ。一つでも欠ければ、全体のシステムは不安定になるんだよ。

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