2011-03-26

オブジェクト指向・ディバイド(2)

世の中(といっても僕の周辺のことですが)がオブジェクト指向ブームになり、C言語からC++言語にシフトするとき、自分なりに苦しみました。C言語を学ぶようにC++言語は簡単には学べなかったからです。

C言語に比べ、C++言語は遙かに複雑です。
同じ機能を実現するための方法、選択肢が圧倒的に多く、オブジェクト指向そのものにしっかりとした必然性を感じていなければ大海原で迷子になってしまい、設計の手がかりさえ得られません。

C言語はポインタというハードルはあるかも知れませんが、文法書を読んで理解さえすればさほど難しいものではありませんし、構造化プログラミングなんてmain()関数をルートにサブルーチンである関数をツリー状に構築していくという、シンプルで誰にでも理解できる概念でした。
理解できるだけではなく、それを応用するのにさほどの学習期間も要りませんでした。

しかしC++言語はそうはいきませんでした。当然ながらそれはオブジェクト指向の考え方を理解しなければならないという大きなハードルがあったのです(後に判ったことですが、オブジェクト指向を全く理解しないままVisual C++ by MFCを使っている技術者もいます。これにはびっくりですが、案外そういう人は多いようです)。

たとえば、外国語の会話力が文法を学んだだけでは身につかないのと同様、オブジェクト指向は本を読んで理解しただけでは全く現場で通用しません。暗記でも、ただの思考でも、論理でもありません。重要なのは広い視野とセンスと経験だと思います。
この学習法は日本人が最も苦手なジャンルかもしれません。なぜなら、日本では暗記型の学習方法が主流で、自分で考えようとする人が少ないように思われるからです。

特に経験が必要なのはオブジェクト指向設計の要であるクラス設計です。
クラス設計にパターンがあるとすれば、それは無数に考えられます。完全な正解はありません。
何をどこまでクラスにするのか、クラス分けせずに単なるインスタンスが持つプロパティとするのか、それだけでも判断に迷うことがあります。
(たとえば「人」という基底クラスがあって、男女を区別したいとする。クラスのプロパティに男女を分ける値を持つのか、人クラスを派生させて男クラスと女クラスを作るのか)

無数の選択肢からオブジェクト指向という宗教に照らして最も正しいものを選ぶのではありません。そんなアプローチは全く役には立たちません。もちろん美しさなんて全くどうでもいい話しです。
そうではなく、開発効率とか、保守性とか、実行効率とか、様々な条件に照らして合理的に判断されるべきなのです。右脳的思考、直感的思考も大切です。これは訓練によってのみ得られる能力なのです。

“オブジェクト指向設計は訓練でしか身につかない”

このことを知らない人、理解せずに諦めてしまったり、知ったかぶりをして失敗する人が実はけっこう多いように思います。。
そしてそれがオブジェクト指向ディバイドを助長しているようにも思えるのです。

0 件のコメント:

コメントを投稿