Flex、AIR、Java、Androidなど

Archive for 1月 13th, 2009

13 1月, 2009

Bridgeパターンの理解

Posted by: tachibana In: プログラミング

※この記事は私が本を読み、頭で考えたことを将来完全に理解してから見直して笑ったりするためにそのまま羅列したものです。故に間違った理解や意味不明なこともたくさん出てくると思います。プログラミングを教えるような立場の方には有益かも(笑)?
Bridgeパターンの理解
一つのパッケージの中に機能のクラス階層と実装のクラス階層が混在することは当然考えられる。
ただ、この分け方がよく分からん。もともと再利用したいパーツが機能のクラス階層と実装のクラス階層に分かれていた場合、機能のクラス階層には実装のクラス階層のクラスはまだ登場しない。まあ継承されるメソッドや変数が定義されているだけだろう。
そこに新たにクラス階層との結びつきを定義するのがBridgeパターンか?
ここでは、機能のクラス階層のトップがそのクラス型の変数をもち、コンストラクタで初期化している。しかしこれだと既にこのクラスのコンストラクタを引数無しで使っているクラスがあったらそれは実装を大幅に変更する必要があるんでないかい??
まあそれは置いといて、初期化したクラスの抽象メソッドの定義はその初期化したオブジェクト自身の抽象メソッドに結び付けている。このままでは何の処理も行われないよね?
ここでのに機能のクラス階層と実装のクラス階層の各役割が重要なのか?
機能のクラス階層は渡されたオブジェクトを格納し、それのメソッドを利用し働く。メインクラス上には機能のクラス階層のクラスが置かれ、それのメソッドにアクセスがそのメソッド内で既に初期化さえている実装のクラス階層のクラスのメソッドを呼ぶ。サブクラスはインスタンスもsuperで、単に新たなメソッドを付け加えただけ。
利点がよく分からん。
クラス図を見ると例えば既に実装のクラス階層があり、そこに新たにそれとは別な機能(それを利用するが)をもった階層を展開したような時にはその階層と既にある実装のクラス階層を結びつける際、スーパークラスのコンストラクタないで実装を行えばサブクラスはスーパークラスのコンストラクタを呼ぶ実装をすればそれだけでその実装のクラス階層と結び付けられる、ということがBridgeパターンなのか?
書いてあった。こうやってクラスが綺麗に分かれていたら拡張はかなり楽になる。結びついているのは機能のクラス階層のトップのコンストラクタだけだから。その他は意識する必要がない。こりゃええわ。ここがポイントだ。
自分なりの結論:

プロジェクト内には具体的に仕事をするクラス(基本的にあるクラスを継承し、少なくとも抽象クラスではないクラス)の階層と、手続きの内容を定義した抽象クラスと、それを実装するクラス階層が存在する。また、これらは意図的に分けるようにしなければならない。この際は機能のサブクラスのサブクラスが実装のクラスのサブクラスのサブクラスの・・・を実装しうんぬんというようなことはやってはいけない。実装を行うのは継承のトップにあるクラスが、トップにあるインターフェースを実装するようにする。また、この際は実装のクラスを継承するのではなくコンストラクタ内でインスタンス化し処理を実装のクラスに委譲する。

コメントは受け付けていません。

13 1月, 2009

Abstract Factoryパターンの理解

Posted by: tachibana In: プログラミング

※この記事は私が本を読み、頭で考えたことを将来完全に理解してから見直して笑ったりするためにそのまま羅列したものです。故に間違った理解や意味不明なこともたくさん出てくると思います。プログラミングを教えるような立場の方には有益かも(笑)?
Abstract Factoryパターンの理解
これまではパッケージ内のクラスはメインクラス、又はその他のクラスに継承されたりimplementsされたりしていた。Abstract Factoryパターンではfactoryパッケージ
内のクラスを更に細かく分割。細かいアイテムを作るクラスも抽象メソッドだが、それもさらにスーパークラスをもつ。←抽象メソッドをextendした抽象メソッド。
また、このサブクラスではスーパークラスの抽象メソッドが定義されていないので、サブクラスを継承したクラスが大元の抽象メソッドを実装する必要がある。
それらの部品を管理するクラスが実装するのは、新たなオブジェクトをコンストラクタで生成、それに新しいアイテムを追加するメソッド(渡されるのは上記大元の抽象メソッド型)。そして出来上がったものをtraceするメソッド。最後に上記大元クラスによって定義され、そのサブ抽象クラスで実装されなかったメソッドがここで定義されている。※このクラスは大元クラスを継承もimplemetもしていない。。
それら全てを管理するのがFactoryクラス(抽象クラス)。抽象メソッドは渡された文字列をもとにクラスを探し、それを自身にキャストしインスタンス化したオブジェクトを返す。
さらに部品のサブクラスやそれらを管理するクラスを返すメソッドも抽象メソッドとして定義。
なぜFactoryはnewじゃなくgetGactory()?←抽象メソッドなのでnewできない。
実際に使うクラス。Factoryクラスが継承され、オブジェクトを返すメソッド(スーパークラス上で抽象メソッドでない)とFactoryクラスの抽象メソッドを定義したクラス。部品を返すのは引数を渡しnewされた部品のサブクラスを継承し、大元のクラスの抽象メソッドを定義したクラス。
実際に使われるクラスはインスタンス化された時にスーパークラスも初期化される。それにより渡されたオブジェクトのIteratorも作成されるのであとはwhile(it.hasNext)・・・でまわす。これがメインクラスに存在することぬいなる。尚、このクラス内では部品をつくるクラスは大元のクラスの型に代入され、それのメソッドにより動く。
やはりこれもメインクラスをいじらずに実装を変えられるのと、既にあるAbstractFactoryパターンを用いた部品郡を新たに実装する際には時間の短縮ができ、管理もしやすくなる。

コメントは受け付けていません。

Categories

 

2009年1月
« 1月   2月 »
 1234
567891011
12131415161718
19202122232425
262728293031  

About

Author: tachibana

  • ちょっとしたことはTwitterに書いています。こっちはアプリの公開等の時に更新されます。
  • 最近はもっぱらJavaとObjective Cです。AS3は飽きました。
  • スクリプト言語ではPerlが好きでしたが最近はGAE/Jで何でもやってます。
  • Linuxは自宅サーバー建てるのがやっとのレベルです。前の会社で何日も徹夜してやったのはいい思い出です。
  • アプリへのご要望などご意見等ありましたらお気軽にご連絡下さい。

Alternative content here