📌

オブジェクト指向と中枢概念(3大要素)について①

2023/04/28に公開

初めに:
オブジェクト指向とは何かという問いの答えは1つではないです。
オブジェクト指向自体が、何かの決まりやルールではなくて、
作る上での考え方や概念のことだから抽象的でもあり、難しい感じがします。
(私はそうでした。あまりわからないままに使っていました。)

いかに効率よく柔軟に開発を行うか、を突き詰めた考え方が"オブジェクト指向" 
であり、ソフトウェアを楽についくるために必要な概念(考え方)だ。

人により問いに対する答えは変わってくるかと思うが、
今回は大枠について(概念について)を書いていきたいと思います。

先日までまとめてきたMVCモデルのアーキテクチャも、
オブジェクト指向プログラミングで設計を行うときに、ベースとなる設計モデルです。

オブジェクト指向: object-oriented programming(OOP)

  • 英語で表記すると"object-oriented programming"というが、直訳は、"モノ中心"だ。
  • 直訳の通り、データと処理を一つの「オブジェクト」として扱い、
    オブジェクトの特性や振る舞いを定義することで、保守や再利用性をしやすくすること
    を重視する技術をオブジェクト指向と言えるだろう。
  • "オブジェクト"という概念に基づいたプログラミングパラダイムの一つです。

プログラミングパラダイム: プログラムを設計するための基本的なアプローチや方法論のこと

少し補足を加えると...

オブジェクト指向は、
データと処理を一つの「オブジェクト」として扱い、オブジェクトの特性や振る舞いを定義することで、保守や再利用性をしやすくすることを重視するプログラミング技術

オブジェクト指向プログラミングでは、オブジェクトという単位でプログラムを構成する。
データを保持する「プロパティ」や、そのオブジェクトが行う「メソッド」という処理がある。
オブジェクト同士は、メッセージのやり取りをすることで相互作用し、関係性は、継承やポリモーフィズムなどの機能を使って表現することができる。

オブジェクト指向プログラミングは、保守性や再利用性を重視する技術として広く利用されている。
なぜなら、オブジェクト指向プログラミングにおいて、オブジェクトは独立しているため、
1つのオブジェクトの変更が他のオブジェクトに影響を与えることはなく、
部分的に修正することができる。また、オブジェクト指向プログラミングでは、
オブジェクト同士の関係性が明確になるため、再利用性も高くなるのだ。
同じオブジェクトを複数回使いまわすことができるため、プログラムの開発効率を上げることができる。
よって、保守性、拡張性(再利用性)が高いのだ。

オブジェクト指向の起源を辿ろう

今では(2000年以降)オブジェクト指向を利用した言語が多くありますが,
(Java,python,Ruby,php..etc)
元々はオブジェクト指向は最初はプログラミング言語として発生しました。

Simula67というプログラミング言語が起源だ。
この言語はクラス、ポリモーフィズム、継承などの今までにない技術を備えており、最初のOOPとなった。

そこからOOPを利用することで、
"クラス、ライブラリ、フレームワーク"などの再利用部品群を使用することで、大規模開発が可能になった。

そして、その再利用部品群を作る際の決まり設計アイデアとして"デザインパターン"が発生。

また、OOPを利用したソフトウェア構造の図式表現方法として"UML"としてまとめられた.
加えて上流工程にも応用され"モデリング" やシステム開発全体を柔軟に進めるための"アジャイル開発"も弘安された。

ほお...

どのように進んでいったかはわかった。

ではなぜ生まれたのか???

プログラミングに限らずだが、何事も、現状を改善するために新しいものを作るだろう。
OOP発生以前は何に限界が来たから発生したのか

オブジェクト思考以前の歴史を知る

  • 機械語は、コンピュータが理解できる唯一の言語でした。しかし、機械語は0と1で構成されているため、非常に扱いにくく、読みやすくないという問題があった。

  • そこで、アセンブリ語が開発された。
    アセンブリ語は、機械語よりも読みやすく、扱いやすい言語でした。
    アセンブリ語は、人間が理解しやすいニーモニックを使用し、それを機械語に変換することができます。

  • 次に、高級言語が登場。
    高級言語は、プログラマーがより高度な抽象化を実現するための言語です。
    高級言語には、FORTRAN、COBOL、BASICなどがありました。
    これらの言語は、より複雑なアルゴリズムを扱うことができ、開発の生産性を向上させました。

  • さらに、構造化言語が登場。
    構造化言語は、高級言語の中でもより構造化されたプログラムを書くことができるようになった言語です。代表的な構造化言語には、C言語がある。
    C言語は、構造体や関数ポインタなどの機能を提供し、より複雑なプログラムを書くことができました。

ここまでは、主流なプログラミングパラダイムは手続き型プログラミングだった。

手続き型プログラミングは、手続きや関数などの手続きを中心にプログラムを設計し、
手続き間でデータを共有することでプログラムを実行するものでした。

手続き型プログラミングの限界は、
大規模で複雑なソフトウェアの設計・開発・保守において、可読性や保守性が低下することだった。

手続き型プログラミングでは、
データと手続きが分離されているため、プログラムの修正や機能追加が容易ではなかった
また、プログラムの設計において抽象化やカプセル化の考え方が十分に採用されていなかったため、
プログラムの複雑性が増すとともに、保守性が低下していく傾向がありました。

ここから保守性が重要視されるようになっていきました。

そこで生まれたのが、オブジェクト指向プログラミングというわけだ。
オブジェクト指向プログラミングは、プログラムの構造をクラスとオブジェクトの集合体として表現する方法であり、データと処理をまとめて扱うことができる。
代表的なオブジェクト指向言語には、Smalltalk、C++、Javaなどがある。
オブジェクト指向プログラミングの登場により、プログラムの再利用性や保守性が向上し、
より高度なソフトウェアを開発することができるようになった

オブジェクト指向の3大要素:クラス(カプセル化)、継承、ポリモーフィズム

ここで紹介する"クラス(カプセル化)、継承、ポリモーフィズム"は、
ソフトウェアの保守性や再利用性を向上させるための仕組み(プログラミングのための仕組み) です。

オブジェクト指向はものをどのように扱っていくかを考えていかなければならないが、
ものとものの関係性をどのように扱うかを考えていくプロセスを設計といい、
ここを効率よく無駄なくできるように、重要になってくる概念が、

  1. クラス(カプセル化)
  2. 継承
  3. ポリモーフィズム
    になります。 今回はこれを理解できるように簡単に大枠概念を記述します。

※良い設計

  • 物の定義が明確になっているか
  • 利用する人がわかりやすい形になっているか
  • 拡張性の高いものになっているか、
  • 依存度が高くなっていなくてバラバラに考えられているか...など。

クラス(カプセル化)

  • 他のプログラムから干渉されないように作る考え方
    オブジェクトの情報(メソッドなど)を隠蔽することによって、直接アクセスを防ぎ、
    不整合を引き起こすような操作をできなくさせる仕組みです。

  • "直接アクセスを防ぎ"と記述したが、具体的には以下のように、
    アクセス修飾子を利用して、オブジェクトの情報を、公開するのか非公開にするのか明確にし
    オブジェクトへの外部(他のクラスや関数)からのアクセスを制限していきます。

=> カプセル化したオブジェクトをどのレベルまで後悔するのか
明確に記述することで、外部(他のクラスや関数)から想定外の使い方をしたり無駄な障害を防げる。

アクセス修飾子 説明
public どのクラスからでもアクセス可能なメンバを定義するための修飾子。
protected 同じクラスまたはサブクラスからのみアクセス可能なメンバを定義するための修飾子。
private 同じクラス内からのみアクセス可能なメンバを定義するための修飾子。
外部からのアクセスを制限

※クラス:簡単にいうとデータと処理をまとめたもの。
ここはまた別の会で詳しく説明したいと思います。

継承

  • 同じようなプログラムは共通化して使おうという考え方。

例えるならば...

  • Aというクラスと、Bというクラスがあったとして、
    Aが持っている機能(変数やメソッド)を他のクラスに引き継がせること.

この継承元になったクラス(この喩えならA)を、親クラス(スーパークラス)
継承先のクラス(この喩えならB)を子クラス(サブクラス)という。

ポリモーフィズム (多態性)

- 汎用的な形にできるようにしようという考え方。

  • ある一つの呼び出しに対してオブジェクト毎に異なる動作をすること。

ここの三つについては、まだまだ深められますが、今日は概念としてここまで。

また詳しくまとめていきたいと思います。

Discussion