Thinkers'Studio
JavaとC言語の自習ツール
オブジェクトの使い方

オブジェクトの使い方

 オブジェクトは対象物という意味で、プログラムで取り扱う物事を指します。オブジェクトを使うと …
  • 処理対象に関するデータや処理手続きをひとまとめにできます。
  • ひとまとめにすることで、混乱を避け、誤りを少なくできます。
  • さらに、プログラマは処理対象をイメージしやすくなります。

他のデータ構造との違い

  • 配列は同じ型のデータをひとまとめにする仕組みです。
  • 構造体は型の異なるデータをひとまとめにできます。
  • オブジェクトは、それに加えて処理手続きもひとまとめにできるのです。

効果的な使い方

 まずプログラムの目的に応じて、処理対象の「状態や内容を示すデータ(属性)」と、「処理手続き(アクション)」を整理します。次に示すのは、車両、社員、受注を取り扱う場合の例です。プログラミング言語によって呼び方が違いますが、ひとまず「属性」「アクション」としています。

jam-up2

 先に述べたように、オブジェクトは属性とアクションをパッケージ化する仕組みなので、ひとまとめにすることに意味がないなら、効果的な使い方とはいえません。

 ですから、プログラムで取り扱う車両が1台(社員が1人、受注が1件)だけなら、オブジェクトを使う必要がありませんし、車両のデータ項目が1つだけなら配列で済みます。また、属性とアクションが互いに影響しないならパッケージにする意味がありません。

 つまり、オブジェクトが効果的なのは、

  • 同種または類似の処理対象が何件もあって、
  • それらがいくつかの属性とアクションを持ち、
  • 属性の値でアクションが変わったり、アクションが属性の値を変化させる

ような場合だといえます。

具体例

 具体例として、高速道路上の車両の動きを観察する渋滞シミュレーションプログラムを示します。車両の動きを簡略表示するために JavaScriptで書きました。

 プログラムを起動すると、道路上を移動する車両の位置が縦線で示されます。道路の色が違う部分は制限速度が異なります。LapTimeは最後に通過した車両の所要時間を示しています。渋滞が伸びるに従って所要時間が長くなります。

jam-up

 プログラムはオブジェクト版と非オブジェクト版を用意しました。当たり前ですが動きは同じです。先に試してみてください。

  • 渋滞シミュレーションを実行する
  • 渋滞シミュレーションを実行する

 いずれの版も、プログラムは100行程度の小さなものです。興味があれば、マウスの右ボタンをクリックして「ソースの表示」でコードを参照できます。

比較

 オブジェクト版と非オブジェクト版の主な違いを説明します。

 オブジェクト版では車両のオブジェクトを定義し、そのオブジェクトの配列で多数の車両を表しています。これに対して非オブジェクト版では、データ項目ごとの配列にまとめました。見比べてください。

jam-up3

 非オブジェクト版の方が短く書けますが、手続きの中で変数を参照するのはオブジェクト版が安全です。次に示すのは、1秒後の位置を更新しているところです。

jam-up4

 オブジェクト版では、自分の属性をthisで参照できますが、非オブジェクト版では配列要素番号で指定しています。大差がないように見えますか?

 オブジェクト版ではthisで参照するので、他の車両のデータを参照したり更新したりする間違いを避けることができます。つまり、パッケージ化によってデータが保護されているのです。しかし、非オブジェクト版では、いわばトイレや風呂が共用部に並んでいるような状態にあり、どこかの処理で配列要素番号の取り扱いに誤りがあると、その処理とは無関係なデータが壊されてしまう危険があります。

 また、オブジェクトの属性を外部から見えないようにした上で読み書きに手続きを用いることで、さらに安全性を高めることもできます。オブジェクトに関して継承やポリモーフィズムなど多くの機能が用意されています。それらはオブジェクトをもっと便利に使うためのものです。

 プログラマにしても、Cars[i]はi番目の車両だと分かるので、spd[i]がi番目の車両の速さだと解釈するよりも、Cars[i].spdの方が確かな表現だといえます。これも、1つだけなら大した違いはないのですが、プログラムが大きくなるにつれてその違いが大きくなります。処理対象が10種類もあって、それぞれがいくつも属性を持っているプログラムを考えると想像できると思います。