何となく Blog by Jitta
Microsoft .NET 考

目次

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

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

オブジェクトを指向してみる/何故インスタンスを作るの?」の続き、ってことで。


元ネタのみながわさんのコラムでは、次のように書かれています。これを考察してみましょう。

実はオブジェクト指向ってしっくりこないんです!(システムエンジニア 生き残りの極意)より:

オブジェクト指向は、結局のところホントにモノ(オブジェクト)に使われている記法、例えばGUI コンポーネント、データベース、ファイルなどであって、プログラムのアルゴリズムとは無関係のものである。

ふむ。確かに、「オブジェクト」って、なんでしょう?

引用したところには、「例えば GUI コンポーネント、データベース、ファイルなどであって、プログラムのアルゴリズムとは無関係」と書かれています。これ、「プログラムのアルゴリズムとは無関係」に、強く、興味を持ちました。はたして、無関係なのでしょうか。

とりあえず、この時点では、無関係ではないと思います。

では、“アルゴリズム”って、なんでしょうか。ここから始めましょう。「アルゴリズム:プログラムを作るときに用いる、問題を解決するための手順・計算方法。◇アラビアの数学者アル=フワリズミにちなむ。もと、算用数字を用いた筆算の意。(明鏡国語辞典)」だそうです。さて、オブジェクト志向は「プログラムの手順」とは関係がないのでしょうか。関係がないとすると、どの様に関係がないのでしょう。

その為にはまず、「オブジェクト志向言語」において、「オブジェクト」とされる物は、いったいなんでしょうか。

私は、「データと、それを扱うための手続きを組み合わせたもの」だと思います。


我々は、現実に発生している問題を解決するために、コンピューターの中に問題を投影し、プログラミング言語等を用いて問題を解決する方法を組み立てます。つまり、「会員名簿の管理」であったり、「勤怠情報の管理」であったり、「写真に写っている人を判別する」であったり、「宇宙船の姿勢を制御する」であったりという問題を解決するためにコンピューターを使います。そこには、「処理するべき情報」が存在しています。そしてその情報には、「処理されるべき手順」が存在しています。この、「処理すべき情報」に対して「処理すべき手順」を見つけ出し、ひとまとまり(パッケージ)にして扱うことが、「オブジェクト指向処理」(勝手用語)だと考えます。

「オブジェクト志向プログラミング」と、「プロセス志向プログラミング」の違いは、何に志向するか、意識や思考を向ける対象にあるのではないでしょうか。プロセス志向では、「為すべきこと」を為す手順に志向します。オブジェクト志向では、「為すべきこと」に関係するオブジェクトに志向します。従って、プロセスに志向しながら、オブジェクトを使うことはできないのではないでしょうか。ただし、オブジェクト志向では、「情報と、その操作手順」がオブジェクトですから、最終的には、プロセスにも志向しなければなりません。

では、なぜ、オブジェクトに志向する、すなわち、情報と、その操作手順をパッケージするのでしょうか。

私が最初にオブジェクト志向言語に触れたのは、当時在籍していた課でオブジェクト志向言語を扱う最初、または2番目の事案でした。そして課長が、こう尋ねました。「オブジェクト志向って、どんなもん?」。まだ触って間もないので、「どう?」と聞かれて困ったのですが、こう返答しました。「メンテナンスがし易いようにするためのものだと思います。最初に時間をかけて設計して、後のメンテナンスが楽になるようにするものだと思います」。この感想は、今でも変わっていません。オブジェクト志向が、情報と情報を扱う手順をパッケージするのは、プログラム(あるいはシステム)のメンテナンスをし易くするためと考えます。

プログラム(あるいはシステム)の「メンテナンス期間」とは、なんでしょうか。ここでは、「最初のリリースが終わってから、プログラム(あるいはシステム)が破棄されるまで」とします。あるいは、「最初のビルドが終わってから…」でも良いかもしれません。

つまり、オブジェクト志向ナントカとは、一度動くようになってから後の仕様変更に対して、如何に対応し易くするかを考えたナントカである、と考えます。

では、どうして、パッケージ化すると、仕様変更に対して対応しやすくなるのでしょうか。

たいていの場合、仕様変更は、扱う情報の変更を伴います。オブジェクト志向分析がなされ、オブジェクト志向設計がなされているなら、変更が起こった情報を特定しやすくなります。また、その情報を扱う方法は、他の情報からは独立しているはずですから、情報処理手順の変更による影響を、他の情報へ伝播させにくくなります。他の情報や、情報処理方法が、他の情報を変更したことによる影響を受けないのなら、修正の範囲は小さくなり、テストの範囲も小さくて済みます。これらの範囲が小さいと言うことは、工数の減少にも繋がります。

実際に、このような設計を行うには、かなりの経験が必要だと思います。しかし、特に Java や .NET Framework では、用意されているフレームワークにあるクラスが、高度に抽象化されています。これによって、使う人がオブジェクトに志向しなくても、オブジェクト志向言語を使ったプログラミングができてしまいます。

「オブジェクト志向言語を使ったプロセス志向プログラミング」と、「オブジェクト志向プログラミング」。この二つは、混同してはいけないと思います。

投稿日時 : 2010年6月19日 22:29
コメント
  • # re: オブジェクトを指向してみる/そもそも「オブジェクト」って、何?
    やじゅ
    Posted @ 2010/06/20 20:05
    最初の方で「志向」と「指向」の違いを明記しないと、単なるミスと思われせんかね。
  • # re: オブジェクトを指向してみる/そもそも「オブジェクト」って、何?
    まりも
    Posted @ 2010/06/20 20:59
    「無関係」の定義にもよると思いますが、そこは合っているんじゃないですかね。

    アルゴリズムはオブジェクト指向よりはるか昔からあるものですし、
    オブジェクト指向が発明されて今まで実装不可能だったアルゴリズムが実装出来るようになったという話も聞きません。
    無関係と言っているのはそういう意味じゃないでしょうか。

    たぶん元の文の文脈からして、
    「アルゴリズム」というのはアルゴリズムの内容の話であり、アルゴリズムの保守という概念は入ってないと思います。
    いや、入ってはいるのかもしれませんね。ただ、「自分がこれまでやってきた、オブジェクト指向を使わない方法での保守」、に限定されているということなのかな。

    新しい技術を勉強しなくても、今までのやり方でもできると言う話はよく聞きますが。
    まあ言っていること自体は間違って無いので、それは間違っている、という方向で反論すると不毛なことになるんじゃないでしょうか。

    そもそも、現在「できる」ことが一番多い言語はマシン語ですし。
    マシン語でできないことを他の言語で書いたとしたら、
    コンパイラかインタプリタがエラーをはいて止まることになりますね。

    問題は、人間の有限な脳味噌を使って「できる」ことがどれだけあるか、ということですね。反論するなら、論点がそっちであることをはっきりさせて進める必要があると思います。
  • # re: オブジェクトを指向してみる/そもそも「オブジェクト」って、何?
    えムナウ
    Posted @ 2010/06/21 2:18
    最近、関数プログラミングや関数型ということも注目されているから、古いんだけれども逆に新しいのかも。
  • # re: オブジェクトを指向してみる/そもそも「オブジェクト」って、何?
    Jitta
    Posted @ 2010/06/23 18:33
    コメント入れたつもりになっていました。失礼しました。


    コメントありがとうございます。

    > 最初の方で「志向」と「指向」の違いを明記しないと、単なるミスと思われせんかね。
    その説明を入れたのが最初の方過ぎました…ごめんなさい、「オブジェクト指向」カテゴリの古いエントリに入っています。ここにも、原稿段階では入っていたのですが、いつの間にか消えていました。


    > 「アルゴリズム」というのはアルゴリズムの内容の話であり、アルゴリズムの保守という概念は入ってないと思います。

    私の記憶が曖昧ですが、「アルゴリズムを変換すればすむ」という記述があったと思います。
    んーと。「データ構造とアルゴリズム」というタイトルの書籍があったと思いますが、様々な問題において、解決のためには、このふたつを押さえることが重要ではないでしょうか。そして、私の理解では、オブジェクトに志向するとは、このふたつをパッケージ化することです。なので、このふたつを切り離す時点で、オブジェクト志向に失敗していると考えます。



    > 最近、関数プログラミングや関数型ということも注目されているから

    え?あ、はい、それも、そうですね。
  • # re: オブジェクトを指向してみる/そもそも「オブジェクト」って、何?
    Jitta
    Posted @ 2010/06/23 18:38
    ×「アルゴリズムを変換すればすむ」
    ○「アルゴリズムを変更すればすむ」
  • # re: オブジェクトを指向してみる/そもそも「オブジェクト」って、何?
    えムナウ
    Posted @ 2010/06/23 22:43
    言葉足らずでしたね。

    関数プログラミングや関数型ということも注目されているから、static クラスの static メソッド って 古いんだけれども逆に新しいのかも。
タイトル  
名前  
Url
コメント