« 2005年12月8日

2005年12月10日の投稿

2005年12月14日 »

ぼくがオブジェクト指向言語を勉強しはじめた90年ころは、「継承」という概念がとても流行っていて、継承によって「差分プログラミング」ができることがオブジェクト指向設計の再利用性の典型例のように言われていた。もちろん、こういう誤解は95年くらいには、みんなウソだと分かってきていた。

しかし、それでもときどき、

すべてのクラスの頂点のような「神様クラス」を作ってしまうことがある。

例えば、90年代の多くのC++オブジェクト指向データベースは、Persistenceのようなクラスを継承することで永続オブジェクトとなるクラスをマーキングしたり、あるベンダーのコレションクラスは、Objectというクラスを継承したクラスのオブジェクトのみがコレクションの要素となることができたり、という具合に。また、EJBも最近まではEntityBeanを継承することでEntityBeanの資格が得られるし、ServeletもHttpServletを継承することで、リクエストを拾うことができる。このように継承を使うと、サブクラスが「必ず実装すべきメソッド」をコンパイラを使って強制することができるので都合がよい。

しかし、こういう、「神様クラス」には弊害が多い。特にテスト容易性(EoT=Ease of Testing)をそいでしまうことが多い。神様クラスがないとテストができない(Cactusを使ってテストをするのはあまり気持ちがよくない)。

97年にぼくがJUDEの開発を始めたとき、UNDO/REDOをコマンド実装者に負担をかけないで(Command/Mementoパターンを使わずに)行える、メモリ上のデータベースを設計した。この実装は、ぼくが最も得意とするもので、過去に2回、同様の実装をC言語、C++言語で成功した経験があった。今回はJavaで実装した。このときも、このデータベースに保存できUNDO/REDOの編集対象となるエンティティの「神様クラス」を導入しようとした。実は、過去の実装ではそうしてきた。しかし、その時は、その考えをやめた。それは、そのデータベースのライブラリがなくても、エンティティをテストできるようにしたかったからだ。今風にいえば、POJOを使ったDIコンテナだ。JavaはReflectionを持っているから、こういうことができる。(ちなみに、Martin Fowlerが使ったPOJO=Plain-Old-Java-Objectという言葉は、C++がC言語のstructとの互換性を保ちながらclassを設計した経緯で使われたPOCO=Plain-Old-C-Objectから来ている)

C++を設計したStroustrupも、抽象クラスを多用する弊害について言及し、「具体的でシンプルなクラスが最もよい」と言っていた(The C++ Programming Language, 2nd/3rd)。そして、

クラスライブラリは森にならず林にすべきだ

と言った。すべての頂点クラスは必要なく、複数の頂点があってよい。

そして、C++はtemplateを導入した。templateのパラメータ型は、特定の演算子やメソッドを実装していることが求められるが、それは「継承」という形では強制されない(ここはEiffelやJava Genericsと異なる)。templateがインスタンス化されてクラスになるときに、例えば、find 関数は、イテレータが operator++()を実装していることを期待するが、メソッドを持っていないクラスをイテレータに入れるとコンパイルエラーとなる(そして、配列に対するイテレータである「ポインタ」は、この++を持っているために、クラスでなくともfind関数の引数となれる!)。つまり、「継承」を使わずに、「決め事」として実装しなければならないメソッドを強制する(しかもコンパイルエラーを出す)。

もう1つの例。JUnit という、今では多くの人が使っているツールも、当初はテストクラスはすべてTestCase というクラスを継承することが求められた。しかし、JUnit4 ではこの継承が不必要となった。(以前書いた、振る舞い定義スイートである、jBehave はもともと継承を必要としないコンセプトで開発されている)

このようにして、今では1つの常識ができた。利用者に強制的に継承を迫るのは、は嫌がらせだ。

神様ルートクラスを嫌い、POJOを好め

平鍋

« 2005年12月8日

2005年12月10日の投稿

2005年12月14日 »

» このブログのTOP

» オルタナティブ・ブログTOP



プロフィール

平鍋 健児

平鍋 健児

株式会社チェンジビジョン代表取締役社長、永和システムマネジメント副社長。
オブジェクト指向開発、UMLの勘所、アジャイルな開発手法の未来、マインドマップのソフトウェア開発での利用方法、プロジェクトファシリテーション(見える化)を語ります。現在、マインドマップとUMLの融合エディタ、astah*(アスター、旧JUDE)を開発中。

詳しいプロフィール

Special

- PR -
最近のトラックバック
カレンダー
2013年4月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
hiranabe
Special オルタナトーク

仕事が嫌になった時、どう立ち直ったのですか?

カテゴリー
エンタープライズ・ピックアップ

news094.gif 顧客に“ワォ!”という体験を提供――ザッポスに学ぶ企業文化の確立
単に商品を届けるだけでなく、サービスを通じて“ワォ!”という驚きの体験を届けることを目指している。ザッポスのWebサイトには、顧客からの感謝と賞賛があふれており、きわめて高い顧客満足を実現している。(12/17)

news094.gif ちょっとした対話が成長を助ける――上司と部下が話すとき互いに学び合う
上司や先輩の背中を見て、仕事を学べ――。このように言う人がいるが、実際どのようにして学べばいいのだろうか。よく分からない人に、3つの事例を紹介しよう。(12/11)

news094.gif 悩んだときの、自己啓発書の触れ方
「自己啓発書は説教臭いから嫌い」という人もいるだろう。でも読めば元気になる本もあるので、一方的に否定するのはもったいない。今回は、悩んだときの自己啓発書の読み方を紹介しよう。(12/5)

news094.gif 考えるべきは得意なものは何かではなく、お客さまが高く評価するものは何か
自社製品と競合製品を比べた場合、自社製品が選ばれるのは価格や機能が主ではない。いかに顧客の価値を向上させることができるかが重要なポイントになる。(11/21)

news094.gif なんて素敵にフェイスブック
夏から秋にかけて行った「誠 ビジネスショートショート大賞」。吉岡編集長賞を受賞した作品が、山口陽平(応募時ペンネーム:修治)さんの「なんて素敵にフェイスブック」です。平安時代、塀に文章を書くことで交流していた貴族。「塀(へい)に嘯(うそぶ)く」ところから、それを「フェイスブック」と呼んだとか。(11/16)

news094.gif 部下を叱る2つのポイント
叱るのは難しい。上司だって人間だ、言いづらいことを言うのには勇気がいるもの。役割だと割り切り、叱ってはみたものの、部下がむっとしたら自分も嫌な気分になる。そんな時に気をつけたいポイントが2つある。(11/14)

news094.gif 第6回 幸せの創造こそ、ビジネスの使命
会社は何のために存在するのでしょうか。私の考えはシンプルです。人間のすべての営みは、幸せになるためのものです――。2012年11月発売予定の斉藤徹氏の新著「BE ソーシャル!」から、「はじめに」および、第1章「そして世界は透明になった」を6回に分けてお送りする。(11/8)

オルタナティブ・ブログは、専門スタッフにより、企画・構成されています。入力頂いた内容は、アイティメディアの他、オルタナティブ・ブログ、及び本記事執筆会社に提供されます。


サイトマップ | 利用規約 | プライバシーポリシー | 広告案内 | お問い合わせ