2005-01-12(Wed) [長年日記]
■1 Matz meets ダイコン
今月で休刊になる『Linux magazine』の2005年2月号。やっと買った。まつもとさんがDependency Injectionコンテナを紹介している。「Java方面の人」としても嬉しいし、個人的にも嬉しい。と、いうのも本家記事から「Japanese」のリンクがなぜか消えてしまっている拙訳も「角谷さんによるその邦訳」と紹介されいるので。
Block InjectionはRuby Wayで趣ぶかい。Injectionのタイプのエッセンスを示すコンテナ実装のコードが20行ぐらいずつなのも頼もしい。
Setter Injectionのコンテナが「Yin/Yang問題」を解決できてなかったりするけど、それはPicoContainer1.1でも解決されてなかったりするし :-)本文を読み違えてました。(コードツッコミ!!*1)。PicoContainer1.1でも解決されてない「Yin/Yang問題」が解決されてます。
「Yin/Yang問題」
ツッコミにビビってしまうチキンなわけですが、「Yin/Yang問題」と私が勝手に呼んでるだけです……。
命名の由来は、PicoContainerのSetterInjectionAdapterTestCaseの一番下にある、「PICO-188」となっているテストケースから。
このテストケースは、Setter InjectionでYinからYangを、YangからYinを取り出そうにもCyclicDependencyExceptionで落ちてしまうという問題を再現するテストケース。そこでYin(陰)とYang(陽)というクラス名を使うセンスが面白いなあ、と思ったのが記憶に残っていたので、Setter Injectionつながりで書いたという話です。オチも何にも無いという。
*1 もうしわけないです。そしてありがとうございます
お買い上げどうも。残念ながらYin/Yan問題って知らないので、リンク教えてください。
えーと、つまり<br><br> class Yin<br> attr_accessor :yang<br> end<br> class Yang<br> attr_accessor :yin<br> end<br><br> d = DI::Container.new<br> d.register(:yin, Yin, :yang)<br> d.register(:yang, Yang, :yin)<br><br> yin = d.instance(:yin)<br> yang = d.instance(:yang)<br><br> p yin.yang == yang #(1)<br> p yang.yin == yin #(2)<br><br>が動くかって意味でしょうか > Yin/Yang問題。<br><br>Linux Magazineのサンプルコード(リスト4)はsetterを呼ぶ前に依存するオブジェクトを作っちゃうので、例外も出ず、(1)と(2)、両方ともtrue になります。つまり「解決できて」るんじゃないかと。<br><br>なんか違うのかな。
まつもとさんのコード通りです。最初の私の記述がグダグダなだけです……。