ホーム - プログラミング - オブジェクト指向

オブジェクト指向

オブジェクト指向とは、アプリケーション設計における物事の捉え方の一つです。そしてC#.NETなどのオブジェクト指向言語はオブジェクト指向に基づいてプログラミングをするようにできています。ですので、C#.NETでの開発を行う際にはオブジェクト指向について少し知っておくことが必要です。

ここでは業務の簡単な1シーンを例に、オブジェクト指向について説明して行きたいと思います。まず、小さな事務所に数名の営業社員と経理事務員、そして現金が入っている金庫が一つと金庫の入出金を書き込んでいる帳簿があることを想像してください。そして窓口業務として「お客様より現金を預かる」「業者に現金を支払いする」という業務があるとしましょう。

「お客様より現金を預かる」という業務(入金処理)はお客様より現金を預かって領収書を発行し、金庫に現金を入れるという流れが発生します。また、「業者に現金を支払いする」という業務(出金処理)は業者より請求書をお預かりし、金庫より現金を出して業者に支払いするという流れが発生します。オブジェクト指向が使われる前はこの業務の流れ(手続き)をプログラムにしていました。

「入金処理」
(引数は現金、戻り値は領収書)
1.現金を確認する。
2.領収書を書く。
3.現金を金庫に入れる。
4.帳簿に付ける。
5.領収書を出す。
「出金処理」
(引数は請求書、戻り値は現金)
1.請求書を確認する。
2.金庫より現金を出す。
3.現金を確認する。
4.帳簿に付ける。
5.現金を出す。

オブジェクト指向以前のプログラミングでは上記のように「入金処理」や「出金処理」といった関数で手続きを記述しました。では、この記述を実際の業務に引き戻して見ましょう。もうお気付きの方もいるかもしれませんが、これでは大変なことが起こってしまいます。金庫に誰が現金を出し入れしているように見えますか?きっと上記の内容では営業社員が各自金庫を扱うことになるでしょう。それでは金庫の現金はすぐに帳簿と合わなくなってしまいます。

実際の業務では必ず、金庫や帳簿は経理事務員が取り扱い、お客様や業者とのやり取りは営業社員が行うようにできています。すなわち、「役割」というものが実社会に存在し、そうすることによって業務がうまく行くようにできています。ところが、手続きだけでは「役割」という大切な要素が欠落するため、作成するアプリケーションが複雑になればなるほどソースコードは非常に難解なものになります。

昨今の業務アプリケーションには様々な機能が求められ、一昔前とは比べ物にならないくらいプログラミングが複雑になりました。そしてこれまでの手続きを記述して関数をたくさん作るようなアプリケーション設計手法(構造化といいます)だけでは開発効率が悪く、プログラムミスも多発するようになりました。そこで、今現実に動いている実社会の仕組みをアプリケーション設計に取り込んだのがオブジェクト指向です。オブジェクト指向では実社会にある「物」や「役割」といった要素を手続きだけで作られてきたプログラミングに取り入れました。上記の手続きの例をオブジェクト指向で書くと下記のようになります。

<営業社員> <経理事務員>
「入金処理」
(引数は現金、戻り値は領収書)
「入金処理」
(引数は現金、戻り値は領収書)
1.お客様からの現金を確認する。
2.現金を経理事務員に渡す。
(経理事務員「入金処理」待ち)
(経理事務員「入金処理」待ち)
(経理事務員「入金処理」待ち)
(経理事務員「入金処理」待ち)
(経理事務員「入金処理」待ち)
3.お客様に領収書を出す。


1.営業社員からの現金を確認する。
2.領収書を書く。
3.現金を金庫に入れる。
4.帳簿に付ける。
5.営業社員に領収書を渡す。

「出金処理」
(引数は請求書、戻り値は現金)
「出金処理」
(引数は請求書、戻り値は現金)
1.業者からの請求書を確認する。
2.請求書を経理事務員に渡す。
(経理事務員「出金処理」待ち)
(経理事務員「出金処理」待ち)
(経理事務員「出金処理」待ち)
(経理事務員「出金処理」待ち)
(経理事務員「出金処理」待ち)
3.業者に現金を出す。


1.営業社員からの請求書を確認する。
2.金庫より現金を出す。
3.現金を確認する。
4.帳簿に付ける。
5.営業社員に現金を渡す。


これをオブジェクト指向プログラミングとして見てみると、「営業社員」「経理事務員」という「役割を担うもの」があり、「入金処理」「出金処理」という関数を持っています。「現金」や「領収書」、「請求書」といったやり取りに使われる変数とは別に、「経理事務員」は「金庫」と「帳簿」という経理状態を表す固有の変数を持ち、管理しているという風になります。このとき「営業社員」は「金庫」や「帳簿」のことは知る必要はありません。

ここに出てくる「営業社員」や「経理事務員」のことを「オブジェクト」と呼びます。そしてそれぞれのオブジェクトが持つ関数を「メソッド」と呼びます。また、オブジェクトが持つ状態を表すための固有の変数を「フィールド」と呼びます。

オブジェクト指向は上記のように実社会になぞらえて設計するため、設計が直感的で分かりやすくなります。また、構造化で設計したときに出てくるスコープの広い変数(グローバル変数)は 様々な関数で値が変更されるためプログラムミスの元になりますが、オブジェクト指向ではフィールドという形でオブジェクト固有の状態変数としてオブジェクト外部から隠蔽して記述するため(カプセル化といいます)、プログラムミスが防げたり、プログラム修正がしやすくなるというメリットもあります。

すなわち、構造化は関数を使用して手続き(流れ)を整理することしかできませんでしたが、オブジェクト指向では更に関数や変数も整理することができるようになったという風に考えるといいでしょう。オブジェクト指向では「継承」という概念もあり、更にスマートに整理することができるようになっています。当然、構造化だけの時よりも遥かに大きなプログラムを組み上げることが可能になりました。

オブジェクト指向プログラミングを行うためにはオブジェクト指向についてのいくつかの概念を知らなければいけませんので、以降で説明していきたいと思います。