2011-01-20 24 views
5

私はDependency Injection、Inversion of Control、IoCコンテナについて多くのことを読んできました。私はまた、主に動的言語(仕事ではPHP、自宅ではPython)でプログラムします。ここで私が見つけてる事がありますが、これは私が一緒にそれをすべてのピースとして埋めるために私のためのギャップの多くを残し:IOCコンテナと動的言語

私が読んでいるのは、動的言語でDIを実行するのがずっと簡単なので、IoCコンテナは静的言語ではるかに大きな処理です。しかし、DIをはるかに上回る利点を提供します。たとえば、依存関係を管理したり、手作業で十数個のオブジェクトを組み合わせる必要がなくなります。そして、ちなみに、それらは複雑なので、自分でやろうとしないでください(しかし、PHPには良いものはありません)。

私はこの情報が私に一種の葉を残しているように感じます。私はそれをどうしますか?私は、非常に複雑な依存関係を持つ非常に大きなコードベースで作業します(そしておそらくリファクタリングの必要性は高いですが、それは別の並列問題です)。私たちは今までDIを実装することに非常に苦労しました。私は本当に正しい方向に向けるよう努めています。動的言語とIoC(または少なくともIoCコンテナ)に関しては、そこには何もないようです。

私は、「ハンドストリング」の依存関係を当面は一緒にして、後でコンテナで自動化することを心配しています。私自身の単純なIoCコンテナを実装する価値はありますか?それとも、PHPのコストに最終的には恩恵をもたらすのではないでしょうか?

+1

http://components.symfony-project.org/dependency-injection/ containerを試しましたか? – Mchl

+0

@mchl:それは実際にはかなりよく見えます。ありがとう! (もちろん、ドキュメントはIoCコンテナのより良い説明の1つですが、これはすべて私がこのようなことを考え出していたときに役に立ちました) – keithjgrant

+0

@mchl:あなたのリンクは私にとって最も役に立つものです。まだ見たことがない。それを答えに移してください。何も面白さがなければ、賞金はあなたのものです。 – keithjgrant

答えて

0

Martin Fowlerはこの記事を書いています。これは、制御と依存性注入の逆転のための聖書です。彼はIoCコンテナの実装方法を説明し、さまざまな注入メカニズムのメリットについて説明します。 http://martinfowler.com/articles/injection.html

"ハンドストリングの依存関係"を使用している言語は、スケーラブルではありません。他の開発者はおそらくすべての手編みがどこで行われるのかわからないかもしれないので、維持することは難しいでしょう。対照的に、これをすべて1か所にまとめることで、将来の変更をより簡単に実現できます。 IoCは、繰り返しコードを最小限に抑え、懸念と一貫したアプリケーションアーキテクチャの分離を確実にします。

一方、あなたの手にかなり大きな機能のアプリケーションがあるように聞こえます。また、時間がかかっていなければ、壊れていないと修正する必要はないかもしれません。

3

PHPの場合はSymfony Dependency Injectionを試してください。 Java Springの仕組みに基づいているが、PHPの多くの魔法を使っていることは(おそらく、それを検証する経験はあまりない)その結果、非常に軽量で使いやすく、非常に多くのことができるようになりました。

0

非常にコンパクトな方法で必要以上のものを提供するようなデザインのDICを使用したくない場合は、バケット(https://github.com/troelskn/bucket)を試してみてください。 DI容器にはそれ以上のものは必要ありません。 Symfonyのもののほかに、サービスロケータ(非常に良いエイリアスのグローバル状態)として、非常に危険な方法で使用されることがよくあります。

0

あなたのIoCが軽量であり、他のフレームワークがすでに持っているものがあると思ったら、それを開発するのに十分な時間があれば、独自のものを構築してください。私は個人的にMVCフレームワークでViewをControllerにリンクするためにIoCを使用します。私はビューを管理し、それはレジストリ(標準化構造連想配列)からのパラメータです。モデルは外部サービスとして扱われます。私はIoCとDIを初めてJavaで見つけたので、私は私のものを組み立てたときに、両方の言語(JavaとPHP)から最高のものを取ろうとしました。もちろん、何かにリンクするものではありませんが、あなたもそうではないかもしれません。

IoCは柔軟性を提供するために重要ですが、柔軟性はどれくらいですか?多くの外付け部品で作業しますか?標準のプラグインやオブジェクトで作業しますか? PHPはjavaではありません。ジャーとライブラリのサックを持っていないので、ロードして指示をXMLに置き換えていつでも実装できるようになりました。

Alfresco(文書管理システム)という優れたオープンソースソフトウェアで、優れたIoC実装を見つけました。 JSF、Spring、Hibernate、およびfreemarkerのテンプレートをまとめた製品ですが、何千ものビジネスモデルに適合するように作られた製品だというと、無限に変更されることになっている高度なプラットフォームに似ています。非常に柔軟である必要があります。

1つのビジネスモデルと数人の顧客にサービスを提供するための、IoCの花が咲き乱れば、より単純ではなく困難になります。

アインシュタインは、物事は単純でなくてはならず、単純ではないと述べました。

1

まず、依存関係の問題を修正します。あなたがあなたの依存関係を扱うバッグとしてIoCコンテナを使用している場合、それはあなたが本当に難しいことではないでしょうか?

IoCコンテナは、システムアーキテクチャについて話すためのAPI /ボキャブラリを提供する必要があります。

依存性注入を使用すると、サブシステムのビルディングブロックとして機能するより小さな分離クラスを使用できます。これは、ビルディングブロックを単独でテストし、より簡単にその理由を判断できるようにするための良い方法です。 (あなたはそれらを回路内の電子部品のように考えることができます)

IoCコンテナは、これらの構成要素の構成を明確に表現する方法を提供する必要があります。 (コンポーネント同士を結ぶ配線図)

このようにすることで、サブシステムの寿命について考えることができます。工場、レジストリ、カップリングなどを導入せずにシステムにメッセージを渡す方法など

IOCのポイントは、この論理をすべて明示的に述べる場所を与えることであり、魔法のようにあなたのために解決するのではありません。

こちらがお役に立てば幸いです。

関連する問題