まっつんです。今回の記事は Piece Framework の開発ブログ Piece Framework Development Inside の第 1 回です。このシリーズでは、Piece Framework の開発における設計・実装の判断、悩み、技術解説などを書いていきたいと思います。
今回は、間もなくリリース予定の新プロダクト MakeGood を題材に、PDT (PHP Development Tools) の問題についていくつか書いてみます。
MakeGood とは?
MakeGood は PDT を使った テスト駆動開発 (TDD: Test Driven Development) を快適に行うための Eclipse プラグインです。間もなくリリース予定の 0.1.0 (alpha) では、パッケージエクスプローラーおよび PHP エクスプローラーそしてエディター上からのテストの実行と結果の表示がサポートされています。
make good には「成し遂げる」「成功する」などの意味があり、MakeGood を使ってよりよいアプリケーションを作成し、プロジェクトを成功させてほしいという思いが込められています。
PDT の問題
Eclipse の PHP 開発環境として PDT はデファクトスタンダードとなっています。MakeGood は PHP の実行環境やエディター、PHP エクスプローラーなど多くの部分で PDT に依存しています。そのため、筆者は PDT のソースコードを見る機会が多いのですが、現在の PDT の設計・実装にはいくつか問題があると考えています。
プラグインの依存関係が循環している
PDT には、PHP の実行を担当する org.eclipse.php.debug.core プラグインと、PHP 実行時のユーザインターフェイスを担当する org.eclipse.php.debug.ui プラグインがあります。これらのプラグインはお互いに依存しています。これにより、2 つのプラグインは実質的に 1 つのプラグインとなり、PDT およびそれに依存するプラグインの保守性は低下します。プラグイン、パッケージ、クラスといったコンポーネントの粒度に関わらず、依存関係を循環させないことは大切です。
循環したプラグインの依存関係
今回のケースは、非循環依存関係の原則 (ADP: Acyclic Dependencies Principle) に違反していますので、依存関係逆転の原則 (DIP: The Dependency Inversion Principle) を適用することで依存関係の循環を断つことができます、具体的には、org.eclipse.php.debug.core プラグインで拡張ポイントを定義し、org.eclipse.php.debug.ui プラグインはその拡張ポイントを利用します。
依存関係逆転の原則を適用したプラグインの依存関係
ノート: 書籍 アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技には、これらの原則の詳細が記述されています。
インターナルパッケージが多い
Eclipse において、パッケージ名の一部に internal が付与されているものは インターナルパッケージ と呼ばれています。基本的に インターナルパッケージ はプラグインの内部でのみ使用されることが想定されていますが、エクスポートされている場合は他のプラグインから利用することもできます。インターナルパッケージ の使用には、将来のバージョンでサポートされなくなるリスクがあります。
PDT のほとんどのパッケージは、このようなエクスポートされたインターナルパッケージです。開発者の意志を尊重し、なるべくインターナルパッケージを使用しないというのが筆者の基本的な考えですが、それでは MakeGood の機能を実現することができないため、今回は必要に応じてインターナルパッケージを使用しています。
1 つのメソッドが複数の処理を行う
MakeGood は PDT の PHP 実行環境を利用します。PDT は選択されている PHP スクリプトを引数として PHP を実行しますが、MakeGood では選択されている PHP スクリプトを PHP の引数とせず、バックエンドである Stagehand_TestRunner のコマンドに渡す必要があります。
筆者は、必要な設定を組み立ててから PHP を実行している PHPExeLaunchShortcut クラスを継承することにしました。このクラスで組み立てられた設定に、MakeGood の設定を追加して PHP を実行すれば、目的を達成できると考えたからです。
しかし、この試みは上手くいきませんでした。これらの処理は searchAndLaunch という 1 つのメソッドに記述されているため、MakeGood の設定を追加するフックがないのです。また、searchAndLaunch はスタティックメソッドとして宣言されているため、オーバーライドすることもできません。
今回は、Eclipse が提供しているリスナーを利用して PHP が実行される前にフックを行い、そこに必要な処理を差し込むことで解決しました。
おわりに
PDT については拡張に関すること以外にも変更してほしい仕様などがいくつか出てきています。今後は、要望を出したり、パッチを作成することで、筆者も PDT に貢献していければと考えています。
使用したソフトウェアのバージョン
| Eclipse (Eclipse Modeling Tools) | 3.5 |
|---|---|
| PDT | 2.1.1 |
参考文献
トラックバック(0)
- このブログ記事のトラックバックURL:
