Entry

機能を抽象化できなければ手法に何を使おうが無駄という話

2011年11月21日

随分昔の話なんですけれど,こちらを読ませていただいて。

んで、「Java/C++/C#はクラス設計が難しいから嫌われるよね」とする。 クラス設計が難しいのは色々考えると自明に思えるので、だから嫌われるんだとすると、Java/C++/C#のオブジェクト指向はそもそも解いている問題が不適切だった=設計が間違っていた、ということになるかなぁと思う。

*「ふっかつのじゅもんがちがいます。」 オブジェクト指向が嫌われるのは、オブジェクト指向そのものの設計が間違っているからだ

なんというか,設計手法についての一般論は,なんでも言えてなんにも言えないところがあるもんで,答えらしい答えがなかったりします。んなもんで,OO がダメとかホゲホゲがいいとかいった話は,基本的に不毛だと思っていたりする。

引用の話は,OO を集合論に解消しようとしているけれど,そういう説明をしてしまったら,自身でも書かれている通り,同語反復になってしまいます(難しいから難しい)。で,結局のところ,設計で最も重要で難しいのは以下のこと。つまり,機能を抽象化して定義することだったりする。

一方で、興味深い集合を定義するのはすごく難しい。

*「ふっかつのじゅもんがちがいます。」 オブジェクト指向が嫌われるのは、オブジェクト指向そのものの設計が間違っているからだ

この点,少なくとも OOP における OO は機能を抽象化するための手法ではなく,適切に抽象化された機能を表現する手法だったりする。つまり,表現する前段階として,あらかじめ適切に機能が定義されていることを前提としています。その意味で,オブジェクト指向を使えばどんな設計もうまくいくなんて話は,そもそも嘘っぱちだったりする。

一方,機能定義するための手法として OO を使おうじゃないかといった発想で一時期取り組まれていたのが,OOA(オブジェクト指向分析)なり OOD(同設計)なわけだけれども,これでうまくいっているという話は,あまり聞きません。

ぶっちゃけた話,適切に機能を定義できる人は,別に OO を使わなくてもちゃんと作れたりする。OO で全部オッケーみたいな話をする方もする方だし,横着してそんな話に乗っかる方も乗っかる方だと思うんだけれども,このような抽象化の過程こそ,それこそソフトウェアが頭を悩ませているアレコレの核にあることだったりします。

じゃ,どうすれば抽象化の過程を実践することができるのか。あたしも偉そうなことは言えないけれども,基本的には経験だと思うわけです。

抽象化と一言で表すと,ある物事に対してエッセンスというか核になるものがただひとつだけ定義できるかのように聞こえてしまいます。実際,高尚な思想の分野ではそういう話もある。しかし,俗世のしがない技術者にとって,そうした高尚な話は全く不要です。俗世では,「求める機能」に対して必要な範囲で機能が抽象化できていればいいわけです。

例えば,少し極端な話だけれども,これから製品の内部文字コードは UCS4 に統一する,と決めたところが,文字クラスの型を抽象化する(char 型や std::uint16_t 型などを切り替えて定義できるようにする)必要はありません。std::uint32_t だけを使えばいい。その意味で,ソフトウェアにおける抽象化は,目的的です。客観的にどんな視点から見ても完璧に抽象化されている設計なんてありえないわけで,目的に対して何をどの程度抽象化するのかが決まるということ。

じゃ,抽象化の材料になる目的はどこから出てくるのか。これが,先に「経験」と書いたことと結びつきます。通常,あたしも含む凡人が,何の経験もなく,将来的な拡張の可能性や目的自体の変更を予測することはできません。

反面,頭の悪いあたしは,「以前作ったら,似たような機能を持つクラスがたくさんできてしまった」とか「書いてみたら使い勝手の悪い機能になってしまった」とか「メモリの解放漏れで痛い目を見た」とかいった,失敗の経験をたくさん持っています。そうした経験から,機能を抽象化する方向性が立っていると考えています。ホゲホゲのクラスを書くときは,この機能を抽象化しておくと後々便利になる,と,学習していくわけです。

もちろん,チャート式的というか形式主義的というか,そういうもんで抽象化の方向性が立つなら便利なんですけどね。こうしたヒューリスティックな問題は,経験主義の方が手っ取り早いと考えています。設計論の真理なんかを探し求めていたら,何一つ作れないままジジイになってしまう(と思う)。

OO は銀の弾丸ではない。それは,OO 以外で提唱されている設計手法も同じこと。地道に失敗を繰り返し,どうすれば次に失敗しないかを考え続けること。そして,他人の経験に基づく手法にも謙虚に耳を傾けること。頭で分かった気にならないで,実践して実証すること。ヒューリスティックな問いに対する答えは,そゆもんの積み重ねだと,オッサン的には思う。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN