PerlがIoC、DI、魔法の錠剤Kaitenをほとんど使用しないのはなぜですか:Container

多くの人が、Inversion of Control(Ioc)およびDependency Injection(DI)bazvordsの重要性を理解していると思います。 それほどではないにしても、興味深いことに、このテーマに関するHabréの記事がいくつかありました。

技術は優れていますが、どういうわけか実際の生活に適用できませんでした。



カットシーンの下で-Perlの情勢の嘆かわしい状態の小さな概要と独立した「見た目」ソリューション。



それで、なぜ実際のコードに何かを適用することが出てこなかったのですか。

実際、すべてが非常に理解しやすい-DI実装を宣言する利用可能なモジュールは理解するのが難しく、使用するのが非常に難しく、コードはますます少なくなっています。 そして非常に奇妙です。

$c->add_service( Bread::Board::BlockInjection->new( name => 'authenticator', block => sub { my $service = shift; Authenticator->new( db_conn => $service->param('db_conn'), logger => $service->param('logger') ); }, dependencies => { db_conn => Bread::Board::Dependency->new( service_path => 'db_conn' ), logger => Bread::Board::Dependency->new( service_path => 'logger' ), } ) );
      
      





パンからの例:ボードマニュアル(マニュアル)は4ページにわたっています!



 $c = IOC::Slinky::Container->new( config => { container => { # constructor injection dbh => { _class => "DBI", _constructor => "connect", _constructor_args => [ "DBD:SQLite:dbname=/tmp/my.db", "user", "pass", { RaiseError => 1 }, ], }, # setter injection y2k => { _singleton => 0, _class => "DateTime", year => 2000, month => 1, day => 1, }, } } );
      
      





例IOC :: Slinky :: Container、すでに優れていますが、考えてみると同じスズです。



 my $c = Peco::Container->new; $c->register('log_mode', O_APPEND); $c->register('log_file', '/var/log/my-app.log'); $c->register('log_fh', 'IO::File', ['log_file', 'log_mode']); $c->register('my_logger', 'My::Logger', ['log_fh']);
      
      





例Peco :: Container-「Light Inversion of Control(IoC)コンテナー」として位置付けられます。 最後の行を取り、逆の順序で何が起こっているのかを追跡してみてください。 まだ何が起こっているのか理解していますか?



私見全体の問題は、これらの実装が複雑であり、いくつかの機能でオーバーロードされ、その結果、目に見えず、使用するのが不便であり、サポートを地獄に変えることができるということです。



DIcに必要なのは、そこにコードを配置し、後で実行結果を取得する機能だけです。 dbhを空白にします-出力に動作するハンドラがあります。 構成ファイルやその他のアカデミックなものからコードを作成する魔法はありません。



 my $kaiten_config = { examplep_config => { handler => sub { { RaiseError => 1 } }, probe => sub { 1 }, settings => { reusable => 1 }, }, ExampleP => { handler => sub { my $c = shift; my $conf = $c->get_by_name('examplep_config'); return DBI->connect( "dbi:ExampleP:", "", "", $conf ) or die $DBI::errstr; }, probe => sub { shift->ping() }, settings => { reusable => 1 } } }; my $container = Kaiten::Container->new( init => $kaiten_config ); my $dbh = $container->get_by_name('ExampleP');
      
      





Kaiten :: Containerの例は、シンプルで明確で効率的です。



キットの例とドキュメントは、 CPANgithubで取得できます。



質問、感謝、呪い、憎悪の光線は、ここで公開するか、他の便利な方法で公開できます。



PS。 モジュールをインストールしたくない場合は、次のように報告します



 # Failed test 'use Kaiten::Container;' # at t/00-load.t line 6. # Tried to use 'Kaiten::Container'. # Error: Argument "1.12_03" isn't numeric in numeric gt (>)...
      
      





渇望するMooのパッチに参加してください



PPS そして今、3Dで! 依存関係の解決がサポートされています。



All Articles