MixJuice によるデザインパターン改善カタログ (α版)

[Single page version] [英語版]

デザインパターンはソフトウェアの拡張性・再利用性を高める構成法のカタログである。しかし、拡張性・再利用性を指向しているのはデザインパターンだけではなく、言語自身も拡張性・再利用性を意図して設計されることがあり、そのような言語で既存のデザインパターンを使うと、拡張性・再利用性にさまざまな(往々にして良い)影響が現れる。ここでは、Java をベースとして拡張性・再利用性を指向した差分ベースモジュールという機構を持つ言語である MixJuice について、そのデザインパターン(GoF パターン 23種)への影響を述べる。

MixJuice のデザインパターンへの影響

従来のオブジェクト指向言語で各パターンを使用する際に起きる問題点のうち、 MixJuice を用いることで改善できるものを表にまとめた。なお、 MixJuice による改善策の中にはトレードオフがあるものもある。 (表内のページ数は MixJuice が改善する問題点が、「デザインパターン」日本語版のどのページで述べられているかを示すものである。詳細については各パターンの説明のページを参照。)

MixJuice のデザインパターンへの影響
デザインパターン種別導入拡張情報隠蔽型安全性単純化使用するプログラミング技法
AbstractFactory改善p.98アブストラクトメソッド追加
別解p.98p.100実装モジュール選択
Builder改善p109メソッド追加メソッド拡張
別解メソッド拡張実装モジュール選択
FactoryMethod改善p.118名前空間分離
別解実装モジュール選択
Prototype改善p.131アブストラクトメソッド追加
Singleton別解p.138クラスメソッド拡張
Adapter別解p.153p.152スーパーインターフェース追加
Bridge改善アブストラクトメソッド追加メソッド追加
別解実装モジュール選択
Composite改善スーパーインターフェース追加
Decorator改善p.191メソッド追加アブストラクトメソッド追加
別解p.190クラス拡張
Facade改善p.201名前空間分離
別解クラスメソッド追加
Flyweightなし
Proxyなし
ChainOfResponsibility改善p.241スーパーインターフェース追加アブストラクトメソッド追加
Commandなし
Interpreter改善p.265アブストラクトメソッド追加
Iterator改善p.280名前空間分離
Mediatorなし
Memento改善p.307名前空間分離
Observer改善p.318クラス拡張
State改善アブストラクトメソッド追加
Strategy改善p.339アブストラクトメソッド追加
別解p.340実装モジュール選択
TemplateMethod改善p.351メソッド実装
Visitor改善1p.359仕様モジュールと実装モジュールの分離
改善2p.358アブストラクトメソッド追加
別解アブストラクトメソッド追加

また、個々のパターンに関する利点とは別に、ひとつのクラスが複数のパターンに参加する場合 MixJuice では各パターンを分離して情報隠蔽を行なうことが容易という利点がある。なお、パターンはコラボレーションをなすことが多く、その場合、コラボレーションを分離できることを意味する。

引用について

本カタログは Design Patterns (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Addison-Wesley, ISBN0-201-63361-2) およびその日本語版の「デザインパターン」(本位田真一、吉田和樹監訳、ソフトバンク株式会社、ISBN4-89052-797-4)からの引用をかなり含んでいる。各パターンの目的と、デザインパターンの問題点を述べている部分についてはパラグラフ単位でそのまま引用した。また、各パターンの構造を表すクラス図は、最新の UML の記法に描き直して用いた。

種別について

このカタログに載せたパターンの改善策のうちのいくつかは、 GoF パターンのクラス構造とは異なるクラス構造を使用しており、ここではそのようなものを別解と呼んでいる。

改善点の分類

MixJuice により、デザインパターンにはさまざまな影響が現れるが、ここでは影響を次の 5種に分類する。

導入可能性

既存のクラスをあるデザインパターンの新たな構成要素にするために、従来はソースコードの編集の必要があったものが、 MixJuice を用いることによって、編集の必要がなくなる。逆に言えば、1つのクラスが複数のデザインパターンに参加している場合でも、個々のデザインパターンごとに別のモジュールに分離して記述可能である。つまり、1つのデザインパターンに関するアスペクトを分離することが可能である。このことはプログラムのモジュラリティ向上に貢献する。

拡張性

パターンを用いたプログラムに新たな機能を追加するとき、従来はソースコードの編集の必要があったものが、 MixJuice を用いることによって、編集の必要がなくなる。このことは、パターンを用いたプログラムを機能単位で異なるモジュールに分離できることを意味する。

情報隠蔽

クラス単位の情報隠蔽機構しかない場合に比べて、 MixJuice を用いることによって情報隠蔽の精度が向上する。「情報隠蔽の精度が向上」とは2つのことを意味する。1つはある名前を参照することができるスコープのサイズが減少するということ、もう1つは、ソースコード中のある地点から参照可能な名前の数が減少する、ということである。前者は、ある名前の定義を変更した時に、その変更が影響を及ぼし得る範囲を小さくすることを意味する。後者は、名前の衝突の可能性を減らすことを意味し、それにより簡潔で分かりやすい名前を用いやすくなる。 Java のように package や nested class の機構があれば、 MixJuice でなくても改善できる項目も、このカタログに載せている。

型安全性

ダウンキャストの必要があったものが、不要になる。これは、 GoF パターンではない「別解」によって可能になる。

クラスモデルの単純化

クラスの数が減少し、クラスモデルが単純化する。これは、 GoF パターンではない「別解」によって可能になる。これにより、プログラムの実行時のイメージを理解やすくなる。1つのクラスの定義が複数のモジュールに分割される場合があるので、必ずしもソースコードが単純化するとは限らない。

MixJuice プログラミングの技法

デザインパターンの改善策において使用される、 MixJuice のプログラミング技法には次のようなものがある。

ここで、MixJuice 以外にも同様な技法を使える言語がある。たとえば、CLOS ではメソッド追加が可能である。そのような言語では MixJuice と同様なデザインパターンの改善が行なえることがある。

言語と技法
技法AspectJCLOSRuby
メソッド拡張around advicealias/def
スーパーインターフェース追加declare parentsdefmethodinclude
フィールド追加introduction代入
メソッド追加defmethodclass が実行文
アブストラクトメソッド追加不要/メソッド追加と同様
名前空間分離aspectpackage
仕様モジュールと実装モジュールの分離
実装モジュール選択aspect選択require 切替え

連絡先

不適切な点などがありましたら、mj-language ML または田中哲 <akr@m17n.org> まで連絡して下さい。


MixJuice によるデザインパターン改善カタログ


田中 哲 <akr@m17n.org>, 一杉 裕志 <y-ichisugi@aist.go.jp>