タイトル(OO-Style)
タイトル(オブジェクト指向りゅう)

▲このページのTOPへ

オブジェクトの発想

オブジェクト指向の理解には、まず物(オブジェクト)を中心で物事を考えるようにするよう頭を切り替える必要があります。 この発想の切り替えが思いのほか難しいところではありますが、オブジェクトってこんなものなんだというイメージが持てて、 自然にオブジェクトを抽出できるようになってくれば、考え方作り方がガラッと変わってしまうほどの変化がでてきます。

オブジェクト指向では、 全てをオブジェクト(物)として扱います。そしてオブジェクトの中に処理とデータを持ちます。
(処理はメソッド、データはプロパティと呼びます)

まずは難しいことは考えず、身の回りの何でもよいので、実在する物をオブジェクトとみなし、次に例をあげるようにプロパティとメソッドを抜き出してみて下さい。 それを繰り返す中で、実際のシステムやプログラムで考えてみるようにすると、徐々に慣れてくるかと思います。

オブジェクトは、その枠組みとなるクラスと、クラスがもつメソッドとプロパティしか存在しません。 イベントというものもありますが、イベントもプロパティと考えられます。 そこに、継承、Interfaceなど機能的なものが付いてきますが、あとはそれらの組み合わせでしかありません。

▲このページのTOPへ

車オブジェクトの例

車を例として、構造化プログラミングの方法とオブジェクト指向を比較します。
オブジェクトは車であり、名前をcarとします。このcarを動かしてみましょう。 ちなみにこの車は、進む(Go)・止まる(Stop)の2つの動きができるとします。また、Goは「前」か「後」を指定できるとします。 構造化プログラミングとオブジェクト指向、それぞれで記述すると次のようになります。

構造化プログラミング Go(car, 前へ)
Go(car, 後へ)
Stop(car)
オブジェクト指向 car.Go(前へ)
car.Go(後へ)
car.Stop()

いかかでしょう?
構造化プログラミングの方は、Goという処理に、車と向きを指定することで動かしています。Stopも同様です。 オブジェクト指向の方は、車に対して車ができる動作を指示しています。とても自然に見えませんか?(誘導尋問・・?)

他にも効能があります。構造化プログラミングの場合、まず処理としてGo, Stopが存在しています。 車以外に対しての操作となる処理があった場合、名前の衝突も考えられます。その場合は、Go_Car と Go_Train など、処理の名前の付け方も意識しないといけません。 オブジェクト指向の場合は、車オブジェクトのGo処理ですので、電車オブジェクトのGoという名の処理があっても問題ありません。

  car.Go(前へ)
  train.Go(前へ)

そして、carは他に何ができるのか?いろんな発想も浮かんでくるのではないでしょうか?
車なんだから、

  ガゾリンタンクの容量 car.ガソリンタンク容量()
  今のガソリンの残量 car.ガソリン残量()
  エンジン始動 car.エンジン始動()
  ウィンカー点灯 car.ウィンカー点灯(右側)

などなど、いろいろ思いつくと思いますし、それは実際にcarのプロパティであり、メソッドです。

このように、機能に対して何かを与えるのではなく、何か(物)を先に考えます。 物をオブジェクトと呼びますが、オブジェクトはどのような値を持っているのか、何ができるのか。 オブジェクト指向では、このオブジェクトが多数存在することで、目的であるシステムの仕様を完成させていきます。

 

▲このページのTOPへ

VB6 と .NET の文字列の違い

VB6のString型と.NETのSystem.Stringクラスを例にあげて、構造化プログラミングとオブジェクト指向の違いをみてみます。 それぞれの場合で、文字列strの大文字の取得と、文字数の取得のイメージとプログラム記述を示します。

構造化プログラミング イメージ
 「大文字化する」という機能に、文字列を渡す  「文字数を取得する」という機能に、文字列を渡す
プログラム(VB6)
 Dim newStr As String
 Dim length As Integer
 newStr = UCase(str)
 length = Len(str)
オブジェクト指向 イメージ
 文字列オブジェクトに、大文字化を要求する  文字列オブジェクトの文字数情報を取得する
プログラム(C#.NET)
 string newStr = str.ToUpper();
 int length = str.Length;

このように、プログラムの記述的には大して差は感じませんが、発想としてのアプローチは全く異なります。
オブジェクト指向では、基本はすべてこのアプローチになります。いつでも、インスタンスに何かをするという形をとるように意識してください。

このようにオブジェクト指向では文字列はただのデータではなく、内部に処理とデータを持つ自立したオブジェクトです。 自分の事(自分がするべき事だけ)は自分でします。 このように、データと操作をひとまとまりにしてオブジェクトとして扱うことで、オブジェクトは実在する物を扱うかのように使うことができるのです。