Tociyuki::Diary RSSフィード

tociyuki による Perl・Ruby・C++・C で書き散らしたコードを中心に、日常雑記も混在 : B  F  twitter  GitHub  CPAN  本館  公開鍵
 | 

2005年06月24日

[][]DIContainerへの注釈

PerlによるDependency Injection (DI)のとってもシンプルなデモを読む上でのポイントを書いておきます。

http://tociyuki.flop.jp/archive/didemo.pl

ポイント1. バインド記述の末端要素は文字列です

コードリファレンスなど使っていません。これでVMの内部リソースからバインド記述を分離することができます。

ポイント2. バインド記述は外部リソースに分離可

デモを一つにまとめるためにバインド記述をソースコードに含めましたが、無名ハッシュ部分を外部ファイルに移し、それを読み込んでevalするように変更すると外部リソースに分離できます。

ポイント3. コンストラクタ

Perl5ではコンストラクタは必ずしも必要ではありませんが、それではDIコンテナが書けませんので、名前をnewに固定しパラメータなしで呼び出し可能と仮定しました。

ポイント4. プロパティ・セッタ

DIコンテナのためにクラスのプロパティ・セッタの名前にルール付けが必要になります。このデモではClass::Accessorモジュールの流儀、つまりプロパティ名とメソッド名が等しく、引数ありで呼び出すとセッタとしてふるまうのに合わせました。

ポイント5. 文字列によるメソッド呼び出し

Perl5のメソッド呼び出しは、メソッド名を文字列で与えることができます。他にコードリファレンスを与える方法も可能です。リフレクションを使わないで済むのでラクチンです。

DIContainer->component

コンポーネントをバインド記述から生成するメソッドからエラー処理を取り除くと、次のように簡単なコードになります。#1で、idとコンポーネント名からコンポーネント記述を決めます。#2でクラス名を用いてオブジェクトを生成します。#3でプロパティがvalueのとき、そのままバインド記述の内容をセットします。#4でプロパティがコンポーネントのとき、再帰呼び出しをおこなって作成したコンポーネントをセットします。

たったこれだけで、セッタ・インジェクションのDIコンテナが動作してしまいます。Perlだから簡単になっている面はありますが、DIの本質はシンプルなものです。

sub component {
  my $self = shift;
  my( $id, $name ) = @_;
  my $component = $self->{ $id }{ $name }; #1
  my $obj = $component->{class}->new; #2
  while ( my( $prop, $v ) = each %{ $component->{prop} } ) {
    if ( $v->[0] eq 'value' ) {
      $obj->$prop( $v->[1] ); #3
    } elsif ( $v->[0] eq 'component' ) {
      $obj->$prop( $self->component( $id, $v->[1] ) ); #4 
    }
  }
  $obj;
}

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/tociyuki/20050624/1119631599
 |