第十二回-03 オブジェクト指向プログラミングとは




オブジェクト指向プログラミングとは

手続き型プログラミングは関数を中心に考えるプログラミング手法であった。
つまり、行わせたい仕事からいくつかの機能を抽出し、それを関数として実装していく、というプログラミング手法である。
それに対し、オブジェクト指向プログラミングは「クラス」を中心にしたプログラミングを行うプログラミング手法である。
クラスとは以下の2通りの考え方で理解することができる。 と書いてもピンとこないかもしれないが、とにかく、これまでの関数ベースの考え方とは違う、ということをまず頭にいれて欲しい。

次に、クラスには の2つの要素が必要である。

以上の知識をもとに、どういうものがクラスになり得るか、その例をいくつか紹介しよう。

[複素数クラス]

まずは「クラスとは新たな型のことである」という考え方に近い例として、「複素数クラス」というものを考えてみよう。
複素数 c とは実部 x と虚部 y と虚数単位 i を用いて、

c = x + i y

と書けるのだった。 複素数は数学的な概念であるから、「新しい型とする」という考え方に馴染みやすいであろう。

そこで、この複素数クラスの属性には実部 x と虚部 y が考えられる
また、複素数クラスの処理としては、複素数の和、積、絶対値の計算などが挙げられる

以上の考察を元に、以下のようなクラス図を描いてみよう。
一つ目のセルにはクラス名、 二つ目のセルにはクラスの属性や状態 (データメンバ)、
三つ目のセルにはクラスの処理 (メンバ関数) を書く。


複素数クラス
実部 x
虚部 y
与えられた複素数との和を計算
与えられた複素数との積を計算
絶対値を計算
(などなど)


[テレビクラス]

次に、「クラスとは「もの」である」という考え方に対応するものとして、「テレビクラス」というものを考えてみよう。

テレビの「属性や状態」としては が挙げられる。テレビの処理としては が挙げられる。これらをクラス図としてまとめると以下の通り。

テレビクラス
電源の状態
現在のチャンネル
現在の音量
電源ON/OFF
チャンネル変更
音量調節


[Cart-Pole Balancing (振り子の振り上げ)クラス]

このように、考えている課題から「クラス」になり得るものを抽出し、 そのクラス自体をプログラミングしてゆくのが
オブジェクト指向プログラミングである。

ただ、「複素数クラス」と「テレビクラス」では例としてわざとらしすぎて
プログラミングに対するイメージが湧かないかも知れないので、
第十二回-02で紹介した台車と振り子による「Cart-Pole Balancing (振り子の振り上げ) クラス」を考えてみよう。

この例の場合のクラス図を描くと以下のようになる。

Cart-Pole Balancing クラス
台車の位置 x
台車の速度 v
振り子の角度 θ
振り子の角角度 ω
台車にかかる力 F
現在の時刻 t
数値積分の時間刻み Δt
運動方程式を数値的に解いて、時刻を Δt だけ進める
台車が壁にぶつかっていないか判定する
振り子が鉛直上方向を向いているか判定する
(など)


[学生クラスと学生グループクラス]

さて、これまでは「クラス1つのみ」の例を提示してきたが、
実際のプログラミングではクラスは複数になることは日常的に起こる。

そのような例として、ここでは「学生クラス」と「学生グループクラス」を考えてみよう。

「学生クラス」は学籍番号を持った学生を想定している。
そして、そのような学生が複数集めてできるグループ (サークルだったり、研究グループだったり) を考えるのが「学生グループクラス」である。

学生クラス
学籍番号
氏名
学籍番号変更 (休学→復学した際に変わる)
氏名変更 (結婚したり、などの理由で)


学生グループクラス
グループ名
学生のリスト (ここに上記の学生クラスが使われる)
新規メンバー登録
メンバー削除
学籍番号をもとに学生名を検索
学生名をもとに学籍番号を検索






←第十二回-02 コンソールアプリケーションってどう使われているの?第十二回課題→

非情報系学生のための C/C++ 入門に戻る