2007年07月03日

オブジェクト指向になじめない

 プログラミング経験者の方で、オブジェクト指向をはじめて間もない方や、オブジェクト指向をはじめなきゃとは思ってるんだけど、なかなか踏み出せない方から、よくこんな声を聞きます。
  • それってほんとに書く量減るの?
  • 結局オブジェクト指向ってなんのためにあるの?

どちらも微妙な問題です。

 私の場合、もともと新物好きですので「オブジェクト指向」という言葉が聞かれはじめるとすぐ飛びついて、仕事で使うようになった頃には基本概念は出来上がっていました。
だから、実はこういう疑問ってあまり真剣に感じたことがないんですね。
運がよかったというかなんというか。

 だからって、そんなん知るかとか言って放り出してしまうのはよくありませんので、今回はこのへんの疑問について、私なりの回答をしてみたいと思います。

コンテンツ

  1. 銀の弾丸はない
  2. それってほんとに書く量減るの?
  3. 結局オブジェクト指向ってなんのためにあるの?
  4. もうオブジェクト指向でなきゃダメ?
  5. オブジェクト指向は馴染みにくい?
  6. オススメ

銀の弾丸はない

という言葉をご存知ですか?

 ブルックス(Frederick P. Brooks)という人が1986年に発表した論文「No Silver Bullet」からきた言葉です。
この論文の日本語訳は、「人月の神話―狼人間を撃つ銀の弾はない」という本の16章に再録されています。
この本自体が、ソフトウェア開発論の古典といわれるほど有名なものです。
ぜひ一度読んでみてください。

 で、銀の弾丸とは、これさえあれば狼男を一撃で倒せるというヨーロッパの伝説からきた言葉で、たったひとつの解決策で全ての問題を解決してしまうような、魔法の解決策のことを指します。
たいていの新しいパラダイムや製品が、まるで銀の弾丸であるかのように喧伝されて登場します。
オブジェクト指向も、登場したときにはそういう扱われ方をしました。
でも、そんなのはおとぎ話の世界の話です。
銀の弾丸などないし、オブジェクト指向もしかりです。

 それに、もし銀の弾丸がもしあったとしたら、そいつはただ銃に装填するだけで使えるのでしょう。
現実の解決策は違います。
使うためには、相応の能力を要求されます。
オブジェクト指向の場合、それは知識と洞察です。
それらは、勉強と経験によってのみ得られるものです。
すでに「オブジェクト指向になじめない」と感じていらっしゃる方なら実感されていること思いますが、オブジェクト指向言語をちょっとかじってみても、いきなりオブジェクト指向の恩恵を得ることはできません。

まずは、そこのところをご理解いただきたいと思います。

それってほんとに書く量減るの?

 えーと、とくに減らないと思います。はい。
書く量というのは、オブジェクト指向であるかどうかよりも、使っている言語に左右されるところが大きいですので、なんとも言えません。
あともちろん、作るアプリケーション自体の性質(求められる機能や堅牢性など)が最も大きく影響しますよね。
それと、規模にもよりますね。

 極端な話、文字列連結するだけのコマンドみたいな極小規模の場合、オブジェクトの再利用で省力化できる余地なんて、たかが知れてます。
そういう場合、単に命令文書けばOKなほうが、短くて済むに決まってます。
つまり、オブジェクト指向の方がかえって書く量がふえることもあるわけです。

 再利用性で省力化というのは、オブジェクト指向がはやり始めたときに格好の宣伝文句だったようで、当時は「オブジェクト指向」=「書く量減る」みたいな紹介のされ方がけっこうありました。
でも、これは偏った紹介です。
再利用のメリットは、今この場で書くコードが数行減るようなことではないのです。

 再利用することで、既にテスト済みのコードがそのまま使える。
そのことによる品質の向上と、テスト工数の削減のほうが大きいのです。

 また、オブジェクト指向ではプログラムコードだけでなく、設計や分析も再利用することができます。
業務分析の結果も、設計も、プログラムコードも再利用できる。
そういう、開発全体を通してトータルに「再利用」を考えていくことができるのです。

 ただ、「テスト済みのコードがそのまま使える」とさらっと書きましたが、これはうまく設計、実装されていればの話です。
なんとなくクラスを作ってみたからといって、いきなりその設計やコードが変更なしに使いまわせるわけではありません。
関数型プログラミングだって構造化プログラミングだって、うまく設計実装されていなければひどいコードになるのと同じですね。
銀の弾丸はないんですから。

 オブジェクト指向の利点を生かす目的でうまく設計実装するためには、再利用を前提とした知識と洞察が必要です。
ですので、「今この場で書くコード」についてだけ見ると、逆にオブジェクト指向を利用しない場合よりも時間がかかってしまうことさえあります。

結局オブジェクト指向ってなんのためにあるの?

 誤解をおそれず大胆に言ってしまえば、今までに出現したソフトウェア開発のためのあらゆるパラダイムは、結局はより高度な抽象化と再利用性を得ることが目的です。
そのためのさまざまなアプローチとして、いろいろなパラダイムが出現してきたわけです。
オブジェクト指向も、そのためのものです。

 オブジェクト指向は、ばらばらの手続きとそれに関連するデータを「クラス」という形で抽象化します。
抽象化といっても、ヒトが理解しにくい概念に抽象化してしまっては扱いにくいですよね。
クラスは、現実に存在する物事や概念にあてはめることができるので、人間が把握しやすい単位です。

 再利用は、なにもオブジェクト指向にしかできないことではありません。
共通関数くらい誰でも作るでしょうし、モジュールや実行ファイル単位での再利用など、いくらでも再利用の例はあります。
オブジェクト指向は、このようなさまざまな再利用テクニックを否定するように登場した新テクニックではありません。
オブジェクト指向は、これらのテクニックを体系的にまとめたものなのです。

 オブジェクト指向は、プログラムを町工場にある金型やベルトコンベアのようにわかりやすいものにします。
オブジェクト指向は、プログラムを町工場にある統一規格のネジのように再利用しやすくします。

ただし、もう一度言いますが、それもこれもうまく設計実装してはじめてできることなのです。

もうオブジェクト指向でなきゃダメ?

 ここまでオブジェクト指向の利点を力説してきたわけですが、これからはオブジェクト指向でないものは否定されるのか?というと、そんなことは決してありません。

 その昔、オブジェクト指向を否定する理由の一つは、「リソースを食いすぎる」ということでした。
Java=オブジェクト指向の申し子みたいに言われてた頃なんかは、JavaがアプリケーションのほかにVMを必要とするという事実が、さらにその印象を強めていたのかもしれません。
現在では、パソコンのメモリもハードディスクも格段に安くなり、この問題はほとんど無視できるほど圧縮されました。
Java以外にも、VMやそれに類するものを必要とする言語がいくつかありますが、どれもそれほどリソースを食わず、高パフォーマンスを発揮するように最適化されています。
でも、いくら圧縮されてもリソースを食うという事実はなくなったわけではないのです。

 それほど潤沢なリソースを使用できないような環境では、これが理由でオブジェクト指向言語を採用できないケースがあるのです。

 他にも、オブジェクト指向を採用しない理由は世の中にはいろいろあります。
結局言えるのは、適材適所だということです。
オブジェクト指向も、「材」の一つに過ぎないということを、頭の片隅に置いておいてください。

オブジェクト指向は馴染みにくい?

 馴染みにくいですよね。
オブジェクト指向にどうやったら馴染めるのか、ふたつの原因と対策を考えてみました。
原因1
あなたの話す言葉は、あなたのオツムを制限している
対策1
 私たちは、モノを考えるときには自分の言葉で考えています。
つまり、日本人は普通、日本語でモノを考えてるんです。
同じように、プログラミングするときにはJavaが得意な人はJavaで、CならCで、DelphiならDelphiで考えているのです。
だから、たとえばCが得意な人が、いきなり何かのオブジェクト指向言語を学ぼうとしたとき、つまづくのは自然なことなのです。
Cにはオブジェクト指向の考え方を示すボキャブラリーがないのですから。

 反面、よく「この本は犬と人は動物だとか、実際のプログラムに結びつかない例えが多すぎる」みたいな批判をよく聞きます。
しかし、その本はそれでいいのです。
プログラムの話から入ると、Cが得意な人は反射的にCで考えてしまいます。
でも、日本語で話している間はその人も日本語で考えるでしょう。
だから、プログラムとは切り離した話をしたほうが、実は理解しやすいはずです。
そこで考え方をおさえておいてから、はじめてプログラムに置き換えればいいのです。
原因2
即効性を期待している
対策2
 人間というのは、「これこれに効果がある」と聞くと、なぜか無意識に「これこれにすぐ効果がある」と思ってしまいがちです。
上にも書きましたが、オブジェクト指向の効果は、うまく設計実装されてはじめて現れるものです。
関数型プログラミングだって構造化プログラミングだって、苦労してはじめていい設計ができ、いいコードが書けるようになる。
まったく同じです。

 オブジェクト指向の知識を深めていくにつれて、オブジェクト指向の恩恵を享受するにはどうしたらいいのかがわかってきます。
そしてそれらを効果的に実践できるようになってはじめて、恩恵を享受することができるのです。
焦らず、じっくりです。
原因3
オブジェクト指向言語とオブジェクト指向を混同している
対策3
 これ、けっこう多いのではないでしょうか。
オブジェクト指向は特定のプログラミング言語と関係なく、独自に発展を遂げてきた考え方です。
それをそれぞれの解釈でプログラミングに取り込んだものが、オブジェクト指向言語です。
ですので、オブジェクト指向言語だけを学習していても、オブジェクト指向の理解を深めるには限界があります。
逆に言うと、オブジェクト指向をしらなければ、その言語の設計者が何を意図して言語をデザインしたのかを理解することができません。

 ですので、オブジェクト指向は言語とは別に習得しなければなりません。
でも、逆にそれをやらないと、お使いのプログラミング言語のパワーを充分に引き出すことはできないのです。

オブジェクト指向とプログラミング言語は別モノです。分けて考えてください。

オススメ

 オブジェクト指向でないプログラミングの経験者の方がオブジェクト指向を習得するには、一旦プログラミングを頭から追い出して、まず考え方をつかんだ方がいい。
ということは、既にお話ししました。
このあたり、非常にためになるのが「オブジェクト脳のつくり方」という本です。

 この本でも、最初は一切プログラミングに触れずにオブジェクト指向を解説してくれます。
ある程度理解が進んだところで、実際のプログラミングの話に入っていくようになっています。

オススメカテゴリの記事オブジェクト指向の本でも紹介していますが、この本はほんとうにオススメです。
posted by craftsman at 17:18 | 東京 🌁 | Comment(0) | TrackBack(0) | 雑草の雑想
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。