![]() |
|
![]() |
まずプログラムの目的に応じて、処理対象の「状態や内容を示すデータ(属性)」と、「処理手続き(アクション)」を整理します。次に示すのは、車両、社員、受注を取り扱う場合の例です。プログラミング言語によって呼び方が違いますが、ひとまず「属性」「アクション」としています。
先に述べたように、オブジェクトは属性とアクションをパッケージ化する仕組みなので、ひとまとめにすることに意味がないなら、効果的な使い方とはいえません。
ですから、プログラムで取り扱う車両が1台(社員が1人、受注が1件)だけなら、オブジェクトを使う必要がありませんし、車両のデータ項目が1つだけなら配列で済みます。また、属性とアクションが互いに影響しないならパッケージにする意味がありません。
つまり、オブジェクトが効果的なのは、
ような場合だといえます。
具体例として、高速道路上の車両の動きを観察する渋滞シミュレーションプログラムを示します。車両の動きを簡略表示するために JavaScriptで書きました。
プログラムを起動すると、道路上を移動する車両の位置が縦線で示されます。道路の色が違う部分は制限速度が異なります。LapTimeは最後に通過した車両の所要時間を示しています。渋滞が伸びるに従って所要時間が長くなります。
プログラムはオブジェクト版と非オブジェクト版を用意しました。当たり前ですが動きは同じです。先に試してみてください。
いずれの版も、プログラムは100行程度の小さなものです。興味があれば、マウスの右ボタンをクリックして「ソースの表示」でコードを参照できます。
オブジェクト版と非オブジェクト版の主な違いを説明します。
オブジェクト版では車両のオブジェクトを定義し、そのオブジェクトの配列で多数の車両を表しています。これに対して非オブジェクト版では、データ項目ごとの配列にまとめました。見比べてください。
非オブジェクト版の方が短く書けますが、手続きの中で変数を参照するのはオブジェクト版が安全です。次に示すのは、1秒後の位置を更新しているところです。
オブジェクト版では、自分の属性をthisで参照できますが、非オブジェクト版では配列要素番号で指定しています。大差がないように見えますか?
オブジェクト版ではthisで参照するので、他の車両のデータを参照したり更新したりする間違いを避けることができます。つまり、パッケージ化によってデータが保護されているのです。しかし、非オブジェクト版では、いわばトイレや風呂が共用部に並んでいるような状態にあり、どこかの処理で配列要素番号の取り扱いに誤りがあると、その処理とは無関係なデータが壊されてしまう危険があります。
また、オブジェクトの属性を外部から見えないようにした上で読み書きに手続きを用いることで、さらに安全性を高めることもできます。オブジェクトに関して継承やポリモーフィズムなど多くの機能が用意されています。それらはオブジェクトをもっと便利に使うためのものです。
プログラマにしても、Cars[i]はi番目の車両だと分かるので、spd[i]がi番目の車両の速さだと解釈するよりも、Cars[i].spdの方が確かな表現だといえます。これも、1つだけなら大した違いはないのですが、プログラムが大きくなるにつれてその違いが大きくなります。処理対象が10種類もあって、それぞれがいくつも属性を持っているプログラムを考えると想像できると思います。