Eclipseプラグイン開発に良くある10の過ち

Planet Eclipse経由で流れていた良記事を翻訳してみた。Eclipse Tipsの記事です。

翻訳の元記事
http://blog.eclipse-tips.com/2009/01/top-10-mistakes-in-eclipse-plug-in.html
元のタイトルは「Top 10 mistakes in Eclipse Plug-in Development」なので、「Eclipseプラグイン開発の間違いトップ10」の方が正しいんだろう。10位から順番に上がっていきます。また、画像は引用していません。

引用ここから

私はEclipseプラグイン開発をし始めた方をトレーニングしてきました。そしていつも同じように間違えてしまう点を見つけました。そこで今回、そうやって見つけてきた10の良くある過ちを一覧にしました。もしあなたがこれらの間違いをしていたとしても、それはあなただけのことではないのです。

(10) JavaDocを読まない


これは特にEclipseプラグイン開発に限った話ではありません。Javaプログラマーにとって共通の話題だし、もっと言えば全てのプログラマーにとって同じことでしょう。そう、ドキュメントを読まないことです。どれだけ多くの、継承してはいけないクラスや実装をプラグイン開発者であるあなたからされることが考えられていないインターフェースがあるか知っていますか?もちろんAPIツールはあなたを助けてくれますが、JavaDocを読むのとは違った角度からの助けでしょう。私はいつも間違いを犯します。正直に言えば長い間、Commandのhandlerはnullを返されることが仮定されていることを知りませんでした。(これは実行結果です。)あなたはいつこれを知りましたか?
念のために言うと、JDTが提供しているJavaDocビューを使うとJavaDocが整形されて表示されます。

(9) デフォルトコンストラクタを追加することを忘れる

あなたがナイスなウィザードクラスを作りました。そしてウィザードダイアログの中に入れて動かしてみるとちゃんと動きます。でもINewWizardと一緒に動かそうとすると動きません。その後「ちょっと」デバッグしてみると、ウィザードクラスの中でデフォルトコンストラクタが定義されていないことを見つけました!そう、これはウィザードクラスに限った話ではなく、plugin.xmlに記述する、"class"属性で書くクラス全てにデフォルトコンストラクタが必要です。これらのクラスはリフレクションを使ってインスタンスが作成されるためです。

(8) 異なったプラグインに分割していない

新規開発者の間で共通して良くみられます。かれらは全てのものを一つのプラグインにしてしまう傾向があるのです。幾つかのプラグインに分けることでコードを分けることはモジュール性や保守性を上げるでしょう。あなたは少なくともUI部分とコア部分に分けるべきです。そうすることでコア部分のテストを行うことを簡単に行えるでしょう。

(7) "internal"なコードを使う(internalとは隠蔽されたクラスのこと。パッケージがinternal以下のクラスであることが多いため、そのままにしておく)

私は"internal"なコードを使うのを避けられないケースをたくさん見てきました。あなたにとって必要な機能が"internal"なコードとなっていたので、それを使ってきました。"internal"なクラスは数千以上ありますが、信じてほしいのですが、それらのクラスは次回のリリースでリファクタされ、変更されているでしょう。するとあなたは新しいリリースに対応するために大変な思いをするでしょう。私は何回もこれがおきたけど、なんで"internal"なクラス全部におこるんだ?はぁ。
もし"internal"なコードが一般的でとても使えるように見えたなら、APIのバグとしてbugzillaへ登録しよう。"internal"なクラスを使うためのもう一つあります。それはあなたのコードベースへクラスをコピーし、それを使うようにすることです。

(6) クラスパスを直接指定している。

全てのプラグインプロジェクトはJavaプロジェクトでもあります。しかしそれはあなたが必要とするJarファイルをJavanoクラスパスに追加すればいい、というものではありません。なぜならプラグインの実行時のクラスパスはそれとは異なるからです。もしJarをクラスパスに追加したいのであれば、RuntimeタブにあるClasspathセクションでAddボタンを押してください。

(5) build.propertiesを無視する

新規開発者の中で最も多い間違いです。icon/resourceなど、新しく作成したフォルダを追加してください。プラグインをテストするときは完璧に動作しますが、エクスポートし、Eclipseへ配置すると何かがおかしいことはないですか?理由ですか?あなたが追加したフォルダやファイルがbuild.properitesのエントリに追加されていないからです。だからエクスポートされたプラグインはそのリソースがなかったのです。覚えていてほしいのは、フォルダーや個別のリソースを追加したときはbuild.properitesを追加することを忘れないでください。

(4) 空のdisposeメソッド

この黄金律は忘れないでください。「何かを作ったら、捨てる(dispose)」。SWTのリソース、例えば画像やフォントはいつも使い終わったらdisposeメソッドを呼ぶこと。私はたくさんの人たちがこれをするのを忘れているのをみてきました。他にもdisposeメソッドをオーバーライドしたときにsuper.dispose()を呼んで親クラスで作られたプロパティのdisposeを確保してください。また、IPartListenerやIResourceChageListenerなど、あなたのクラスがライフサイクルを終えたらこれらのリスナーを確実に削除するよう、disposeメソッドで削除してください。

(3) monitor.isCanceled()を無視している

あなたのJobは非常に長期に渡る仕事をしていて、ユーザーがキャンセルをしたいとしますよね。そういう時はProgressMonitorダイアログやウィザード、またはProgressViewからキャンセルを押すことで終了できます。キャンセルボタンを押すと、IProgressMonitorはキャンセルフラグをtrueにするだけです。あなたは一定の期間でisCancelled()をチェックし、操作を終了させるようにする責任があります。ユーザーが"キャンセル"を押した後に何も起きなかったら、信じてほしいんですが、それはとても悪いユーザーエクスペリエンスでしょう。

(2) やみくもにいろんなところにコントリビュートしている。

プラグイン開発者は自分のプラグインを追加できる場所全て、と言っていいくらいの場所に追加しがちです。しかしユーザーからしてみるとそれはイライラさせる大きな原因となってしまいます。だから

  • あなたのビューをあなたが知っている全てのパースペクティブに追加するのを止めてください。
  • 本当に、本当に必要なとき以外org.eclipse.ui.startupを使わないでください。
  • 全てのパースペクティブであなたの作ったアクションが使えないようにしてください。
  • モーダルダイアログを作らないようにしてください。
  • objectContributionsを使ってメニューにアイテムを追加するときは、シンプルなObjectを使うのではなく、特定のクラスを使うようにしてくだし。

(1) ディスプレイスレッドで長い処理を行っている

これについて言う必要があるかい?新規開発者達だけではなく、多くのプラグイン開発者たちがこうした間違いを犯す傾向がある。私は前の仕事で、内製RCPアプリケーションを普段使わなければなりませんでしが、ほとんど全ての操作でこの間違いが犯されていました。最後に結果が得られるまで全くUIに反応がないUIはユーザーにとってフラストレーションがたまります。私は一度コードの一部を指し、開発者になぜこんな長くて大きい計算をディスプレイスレッドで行っているのか尋ねたことがあります。彼はとても驚き、Display.asyncExec()でもUIJobでもないと言っていました。だからこのコードはディスプレイスレッドで動作していないと言っていました。これには経験則があります。SWTのリスナーから実行される操作はディスプレイスレッドで動作するのです。ほとんどの開発者はこのことを認識していません。またDisplay.asyncExec()もしくはDisplay.syncExec()の中でしかUIスレッドで実行されないと思っています。だからSWTのリスナーから長い計算や、サーバーへネットワークを渡って接続しないようにしてください。もしあなたがこういった長い操作をすることになったらジョブを分けて、速く処理を返すようにしてください。するとUIからの反応が残るでしょう。

このほか、どんな良くある間違いと遭遇しますか?

引用ここまで