何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 36016
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

タイトルのままだと某氏に怒られるのでww、「オブジェクト志向プログラミングってなんじゃらほい?」ってことで。なお、タイトルは「指向」を使いましたが、前回のエントリで「志向」の方が正しいような気がしたので、このエントリでは、以後「志向」を使います。


「オブジェクト志向プログラミング」は、1970年代の終わり頃から、新しいプログラミング手法として広まり始めました。ここで注目したいのは、「新しい」というところです。

「新しい」というのは、2種類、あるいはそれ以上の考え方があります。1つは、「今現在」において、発展中であるということ。もうひとつは、ある時点において、何かの代わりとして登場したということです。ここで「新しいプログラミング手法」というのは、それまであったプログラミング手法に変わる手法として登場した、ということです。

「代わり」なのですから、「それまであった」があるわけです。この2つを比較することで、「オブジェクト志向プログラミング」というものがどういうものか、見えてくるのではないでしょうか。


では、「それまであった」ものとは、どんなものでしょうか?私はこれを、「プロセス志向プログラミング」と呼んでいます。この2つを比較します。

その前に、「プログラミング」とは、どのような作業でしょうか。コードを書く。コンピュータにわかるコードを書く。コードを書いてコンパイラに通す。など、返ってきそうです。ところで、「書く」のでしょうか?私も「書く」という言葉を使いますが、気持ち的には「コードを組み立てる」つもりでいます。

私は、「プログラミング」を、「ブロック遊び」にたとえることがあります。レゴとか、積み木でもいいでしょう。ブロックは、すでに形を持っています。その形を組み合わせて、何かを作ります。プログラミングも同じではないでしょうか。我々が使用するコードの大部分は、すでに誰かによって作られたコードの断片です。その断片の組み合わせ方によって、様々な動作を行うアプリケーション プログラムができあがります。

さて、この、「断片を組み合わせる」という作業。この作業の進め方について、「プロセス志向」と「オブジェクト志向」を比較します。しかし、具体的に比較するものがあった方が比較しやすいですから、具体的な例題を考えます。

「ローカル ディスク上の任意の場所にあるファイルを、ローカル ディスク上の任意の場所に移動する」を考えます。「rename や mv で一発じゃない」とは、いわないでください。その中身を考えます。

まず、プロセス志向です。プロセス志向ナントカでは、処理を行う手順を中心に考えます。すると、こんなふうになるかと思います。

  1. 移動させるファイルを開く。

  2. 移動先にファイルを作る。

  3. 移動元から、用意したバッファがいっぱいになるまで読み取る。

  4. 移動先に書き込む。

  5. 移動元のファイル ポインタが、最後を指すまで繰り返す。

  6. 移動元のファイルを閉じる。

  7. 移動先のファイルを閉じる。

  8. 移動元のファイルを削除する。

これによって、「ファイルの移動をどうやって実現するか」ということが、よくわかると思います。

次に、オブジェクト志向です。オブジェクト志向ナントカでは、処理の手順ではなく、処理を行う何かに注目します。それを「オブジェクト」と呼び、クラスで表します。では、この例題の「何か」とは、なんでしょうか?それを探すところからスタートです。

「オブジェクト志向ナントカ」の本を見ると、たいてい「名詞を探せ」とあります。では、名詞を探してみましょう。次のものが名詞です。

  • ローカル ディスク
  • ファイル
  • 場所

これら全てがクラスになるかというと、違います。これらは「クラス候補」であって、ここからクラスにする必要があるか、選別します。

「ローカル ディスク」は、「ローカル」が「ディスク」を制限するために修飾しているので、「ディスク」だけで良さそうです。しかし、例題には「ローカル ディスク上の任意の場所」と書かれていました。ディスクもまた、「場所」を制限するために修飾しています。よって、「ローカル ディスク」はクラスとはなりません。

「ファイル」は、クラスになるでしょうか。これは、例題で操作される対象です。ですから、クラスとなります。

「場所」は、どうでしょうか。場所は、ファイルがあるところを示すものですから、ファイルの属性と言えるでしょう。しかし、「ローカル ディスク上の」と、制約があります。この制約が守られているかどうかのチェックが必要です。このために、クラスとすることにします。


では、オブジェクト志向プログラミングにおける、「ローカル ディスク上の任意の場所にあるファイルを、ローカル ディスク上の任意の場所に移動する」は、どう表現されるでしょうか。

  1. ファイルのインスタンスを作成する。

  2. ファイルの属性「場所」を、新しい場所に設定する。

これだけです。ただし、ファイル クラスは、属性「場所」が変更されたらどう振る舞わなければならないか、定義されていなければなりません。その定義の中身は、上のプロセス志向ナントカの時と同じです。


あるいは、こういう考え方も出来ます。

このふたつを比べると、「オブジェクト志向プログラミング」の所以がわかるのではないでしょうか。先のものが「どうするか」だけを考えていることに対し、後のものは「何が、どうするか」を考えています。この「何が」が「オブジェクト」であり、「どうするか」よりも「何が」に志向する(意識を向ける)から「オブジェクト志向」なわけです。


こうして、「従来の方法」と、「新しい方法」の違いを比較すると、不便な点も便利な点も、いろいろ見えてくるのではないでしょうか。



と、従来の方法との違いを見る方法を提示したところで、今回はここまで。

続けられるのか?

投稿日時 : 2008年12月26日 22:33
コメント
タイトル
名前
Url
コメント