何となく Blog by Jitta
Microsoft .NET 考

目次

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

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

前回は、オブジェクト志向プログラミングだと変更がしやすいと、書きました。本当でしょうか?検証してみましょう。

では、元のお題「ローカル ディスク上の任意の場所にあるファイルを、ローカル ディスク上の任意の場所に移動する。」を変更します。
「ローカル ディスク上の任意の場所にあるファイルを、ローカル ディスク上の任意の場所、または FTP サーバー上の任意の場所に移動する。」


移動先に、FTP サーバーを追加しました。さて、プロセス志向ナントカ、オブジェクト志向ナントカは、それぞれどのように変わるでしょうか。

プロセス志向設計では、処理の途中で「移動先が FTP サーバーなら、…」と、分岐が必要です。しかし、オブジェクト志向設計は、「ファイルの属性「場所」を、新しい場所に設定する。」のまま変わりません。その「新しい場所」がローカル ディスクなのか、FTP サーバーなのかは、この設計では揺らがないのです。

ただし、プログラミングのレベルにまで落とせば、どこかで「ファイルを移動させる」という処理をしなければなりません。プロセス志向プログラミングでは、プロセス(手続き)の中に「移動させる」を書きました。オブジェクト志向プログラミングでは、いくつかの方法があります。


ひとつは、ファイル オブジェクトのメソッドの中に、プロセス志向プログラミングと同じように書き込む方法です。「オブジェクト志向」といっても、どこかでプロセスにも目を向けなければなりません。そこに実装するのがひとつ。

しかし、そんなことをしていては、本当に「変更が容易」とは言い難いです。新しい「移動先」を追加するごとに、ファイル クラスを修正しなければなりません。それではプロセス志向プログラミングとかわりありません。


そこで、やはりオブジェクトに志向することにします。

「ファイルを移動する」ということは、「どこかにあるファイルを、どこかへ持って行く」ということです。「持って行く」です。誰が?はい、ここに「オブジェクト」が潜んでいました。「ファイルの移動を行うオブジェクト」です。

この、「ファイルの移動を行うオブジェクト」が、「ローカル ディスクからローカル ディスクへ移動させる」ことや、「ローカル ディスクから FTP サーバー上のディレクトリへ移動させる」ことが出来ればいいのです。つまり、「移動」というメソッドに、「ファイル」オブジェクトと「新しい場所」をパラメータとして引き渡せるようにします。

とはいえ、これでもやはり、新しい場所について新しい概念が追加されると、「ファイルの移動を行うオブジェクト」の中を変更しなければなりません。先ほどと変わりがないだけでなく、クラスが増えた分、管理が面倒になるだけです。

ここで、オブジェクト志向ナントカにあって、プロセス志向ナントカにはないものを使います。汎化と特化です。

今、「ファイルの移動を行うオブジェクト」に対して、「ローカル ディスクからローカル ディスクへ移動させる」「ローカル ディスクから FTP サーバー上のディレクトリへ移動させる」を考えました。「ファイルを移動させる」という動作について、移動先を「ローカル ディスク」「FTP サーバー上のディレクトリ」という場合に分けました。これが特化です。「移動させる」という汎用的な機能を、移動先を特定し、絞り込んだわけです。反対に、「ローカル ディスク上の」という特定された機能から、「いや、FTP とか、HTTP サーバーとかもあるかもしれない」と考え、場所を特定しない、汎用的な「移動する」へと考えを広げることが汎化です。もっとも、ここでは「機能」ですが、オブジェクトに志向するのですから、機能だけでなく、情報も対象になります。


もうひとつ、オブジェクトに指向した例です。先ほどは、「オブジェクトを移動させるもの」を作りました。しかし、ファイルというオブジェクトが「移動してくる場所」も、オブジェクトです。ですから、「場所オブジェクト」に「指定されたファイルを作る」メソッドと、「指定されたファイルを消す」メソッドを用意することもできます。この方法でも、「場所」は汎化、特化で表されます。


では、この汎化と特化によって、何がどうなるのでしょう?こんなふうになります。

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

  2. 「ファイルを移動させる」オブジェクト(「場所」オブジェクト)を作成する。

  3. 「ファイルを移動させる」オブジェクト(「場所」オブジェクト)によって、ファイルを移動させる。

これによって、ファイルの場所に関する新しい概念が出来たとき、その概念に特化した「ファイルを移動させるクラス」を作成することになります。クラスが分かれているので、「移動させる」部分については、ファイルの場所が増えることによる変更の影響を受けません。新しい「ファイルを移動させる」オブジェクトが作成できていることを確認すれば、すでにあったクラスについて、変更の影響を受けていないことを確認する必要はありません。

しかし、大きな欠点というか、面倒な点があります。前回は「移動させる」ことをファイル クラスにさせていましたが、今回で移動させるクラスに切り出しました。最初に行った分析が十分ではなかったということです。このように、オブジェクト志向開発による変更が容易であるためには、「最初の分析・設計が十分に行えていれば」という条件がつくのです。この条件こそ、オブジェクト志向開発を難しいものにしているのではないかと思います。

投稿日時 : 2009年1月20日 23:30
コメント
  • # re: 「オブジェクト指向」ってなんじゃらほい?(その3)
    ちゃっぴ
    Posted @ 2009/01/20 23:35
    すんごいことになっているぅ!
  • # re: 「オブジェクト指向」ってなんじゃらほい?(その3)
    Jitta
    Posted @ 2009/01/20 23:42
    見つかってた(^-^;
  • # re: 「オブジェクト指向」ってなんじゃらほい?(その3)
    インドリ
    Posted @ 2009/01/22 10:28
    そうそう♪オブジェクト指向は柔軟だけど、無図過信だよね♪
    やっぱ、オブジェクト指向は分析・設計・実装が三位一体だね♪
タイトル
名前
Url
コメント