Eclipseプラグイン開発(Contributing to eclipse)
デザインパターン × テスト駆動開発



Erich Gamma、Kent Beck著 小林健一郎訳
ソフトバンクパブリッシング発行 398ページ 3,800円+税

 

原著サポートページ: http://www.awprofessional.com/titles/0321205758
訂正・補足はこのページの一番下です。

最近注目されている開発環境であるEclipseに関する本を翻訳しました。使用言語はJavaです。まあ、その、よろしくお願いしますね。(^^)


 この本は以下のような人を対象にしています。 

  1.Eclipseで本格的なプラグインを作りたい。  
  2.デザインパターンの実例を見たい。  
  3.テスト駆動開発の実例を見たい。

 プラグインとは、Eclipseに付け加える「拡張機能」のことです。実は、Eclipse自身が、プラグインの集合体として設計されています。そのため、プラグインの重要性は、他のプログラミング開発環境における「拡張機能」とはかなり異なります。「プラグインを作る」ということは、極論すれば「Eclipseを作る」ということです。

 ・この本を読めば、自分でEclipseを拡張できるようになります。
 ・ただし、簡単なサンプルを紹介して雰囲気を知ってもらう本ではありません。
 ・最初の例
の後には、ゆっくりとですが、本格的なサンプルを作っていきます。
 ・これは、完成すればそのまま実用可能なレベルのものです。

 ・Eclipseの設計・実装には、デザインパターンがふんだんに使われていて、最後のパートはその解説になります。
 ・ただし、最後のパートを除けば、デザインパターンを知らなくても問題なく読めるはずです。
 ・逆に、デザインパターンが本当のシステムでどう使われているかを知りたいという人にもお勧めです。

 ・この本では、「JUnitテストを実行するプラグイン」を作っていきます。
 ・その過程でも、
JUnitの機能を使い、テスト駆動型開発を行います。
 ・ただし、はじめはテスト駆動型開発ではなく、「コードを少しずつ書いていく」という普通のスタイルです。
 ・その後にテスト駆動型開発の説明があります。(JUjnitの説明もあります。)
 ・いずれにしても、この本は、「テスト」についての実践的なよい参考書になっていると思います。

 原著者に関しては言うまでもないと思いますが、E.Gamma氏、K.Beck氏それぞれ有名な研究者/開発者で、特に、Gamma氏はデザインパターンの専門家、Beck氏はテスト駆動型開発を含むXPプログラミングの専門家としてもよく知られています。また、二人はJUnitの開発者でもあります。

  なかなか読みごたえのある本ですが、上記に興味がある人は、きっと楽しめると思います。


 原著は、Eclipse 2.1に基づいて書かれていますが、翻訳にあたって3.0.1ベースに改めました。もし、誤りがあれば、それは訳者のものです。やさしくご指摘ください。(^^;)

サンプルコード:
 第3章までのhelloプロジェクト
 第7章までのjunitプロジェクト
 第11章までのjunitプロジェクトとテスト
 第10章のフィーチャーと更新サイト
 第28章までのjunitプロジェクトとテスト
  (コード内文字列の外部化をする前のもの)


 ソフトバンクさんの本書のページ:http://store.sbpnet.jp/bm_detail.asp?sku=4797324899


訂正・補足

●p47のコラム・下から3行目にSpiderの入手先が、

http://www.javaspider.org/

とありますが、これはリンク切れになっており、現在は

http://eclipse-plugins.2y.net/eclipse/plugin_details.jsp?id=202

からダウンロードできるようです。

●p66でIObjectActionDelegateの定義が

public interface IObjectActionDelegate extends IActionDelegate {
    public void run(IAction action);
    public void selectionChanged(IAction action, ISelection selection);
    public void setActivePart(IAction action, IWorkbenchPart targetPart);
}

となっていますが、実際の定義は次のようになっています。(v.3.0.1で確認)
もちろん、本質的な意味は変わりません。

public interface IActionDelegate {
    public void run(IAction action);
    public void selectionChanged(IAction action, ISelection selection);
}

public interface IObjectActionDelegate extends IActionDelegate {
    public void setActivePart(IAction action, IWorkbenchPart targetPart);
}

●p66に「AddFromHistoryActionはIObjectActionDelegateを実装している」ということが書いてありますが、実際には、AddFromHistoryActionはIActionDelegateしか実装していません。(訳書は原著通りなのですが、訳者の私もこの事実に気がつきませんでした。)
 ヘルプには、「ポップアップメニューで(選択された)オブジェクトを扱うアクションのクラスはIObjectActionDelegateを実装する。ただし、下位互換性のために、IActionDelegateでもよい」という意味のことが書いてあります。
 つまり、「普通なら、選択されたオブジェクトを扱うAddFromHistoryActionは、IObjectActionDelegateを実装しているはずだが、下位互換性のためIActionDelegateのみを実装している」ということになります。
 IObjectActionDelegateを紹介している項で、AddFromHistoryActionは、やや「不適当な例」であったのでは、と思います。が、いずれにしても、ヘルプに従えば、本来、「選択されたオブジェクトを扱うアクション」を表すクラスはIObjectActionDelegateを実装すべきであり、本書で紹介されるサンプルコードではIObjectActionDelegateを使っています。

●p381の訳注でSocketUtil.findUnusedLoaclPort()は推奨されていないメソッドと書きました。これを現在推奨されているSocketUtil.findFreePort()と入れ替えると、テスト結果が不安定になるようです。理由ははっきりしませんが、ポートの確保とその使用の間に何か問題が起こってしまうのではないかと思います。

ご指摘くださった方々に感謝致します。m(__)m