質問

.NetおよびJava用の多くのIoCフレームワークがあります。 Smalltalkに同等のフレームワークがない理由を誰もが知っていますか。これは何よりも哲学的な質問です。 Smalltalkのやり方で、IoCフレームワークの必要性を排除するものがあるかどうか疑問に思っています。

役に立ちましたか?

解決

MVC はSmalltalkで発明されたもので、おそらく元の Inversion of Control フレームワーク。 Javaの同等品よりもいくらか軽量ですが、データを保持するモデル、コントローラーから伝播されたイベントに応じてデータをレンダリングするビューの基本的な概念があります。

控えめに言っても、Javaには、大量の定型コードなしでWebアプリケーションを実行するために、多くのフレームワークサポートが実際に必要です。 Smalltalkは、 continuations などのプログラミングイディオムをサポートしています。これにより、著者はイベントを実際に書いていないふりをすることができます駆動コード。 Seaside はこのように機能し、IoCの利点を多少柔軟な開発パラダイムで提供します。

EDIT:MVCはSmalltalkのUIのフレームワークです(おそらくそれ自体はフレームワークではありませんが、クラスライブラリにはサポートが組み込まれています)。ビューとモデルがコントローラーによってディスパッチされたイベントに応答するという点で、コントロールプロパティの反転があります-私たちを呼び出さないでください、私たちはあなたをプロパティと呼びます。 Inversion of Controlはフレームワーク内の設計パターンであり、Javaアプリケーションでの広範なボイラープレートの必要性を減らすために使用されます。アプリケーションフレームワークの一部の定義では、Inversion of Controlは、フレームワークとライブラリを区別するものとして見られる主要なプロパティです。

他のヒント

関数はsmalltalkのファーストクラスの市民なので、フレームワークなしでIoCを使用するのは簡単です。

IOCまたはDependency Injectionパターンは、Smalltalk環境には実際には存在しない問題を解決すると思います。 Smalltalkは型付けされていない動的言語であり、メッセージの受け渡しを使用して通信します。これにより、言語レベルで本質的に疎結合のオブジェクトが作成されます。オブジェクトは、メッセージを処理できる限り、タイプに関係なく別のオブジェクトにメッセージを送信できます。したがって、特定の時点で依存関係を変更することは比較的容易で自然なことです。依存関係をどこで、いつ、どのように変更するかを決める必要があります。

この理由はいくつか考えられます。 1つは、「IoC」を使用することに悩まされていないことです。本質的に冗長な修飾子-何かをフレームワークと呼ぶことは、制御フローの反転を意味するためです。

もう1つは、Smalltalk言語が「IoC」を直接サポートしていることです。フロー-クロージャの形で。クロージャを使用したプログラミングの結果の1つは、フレームワークで見られるような制御の流れが、「反転した」という感覚を呼び起こすほど大きく異なるようには見えないことです。 「通常」から流れの感覚;むしろ、クロージャーを使用すると、制御の流れは、これらの2つの視点の間を常に、どこでも行き来します。単一のステートメント内でも。

第3の理由は、おそらく、閉鎖がなくても、「制御の反転」記述されていることはフレームワークに一意に関連付けられていません-I / Oを含むコードのほとんどの形式で同じフローが見つかります。

第4に、Smalltalkerはおそらくこの種のフローを他のものよりもさらに使用します。構造の概念やメンバー関数の呼び出しよりもオブジェクトの概念とそれらの間で送信されるメッセージに強く依存するからです。クロージャーがない場合、これら2つのビューは同等であり、交換可能ですが、クロージャーを追加すると結果が変わります-使用中の制御フローの感覚は効果の1つです。

最後に、REPLスタイルの制御フローを「単純な」ものとして説明することも考えられますが、「反転した」ものです。 「正常」の感覚他のほぼすべての場所で使用されるという意味で通常のフロー。

要約すると、Smalltalkには同じ種類のフレームワークが存在します。 それらについて少しだけ説明します。 違いは、少なくとも部分的には、存在と使用率によるものです 他の多くの環境ではまだ提供されていないSmalltalkのクロージャの例- -特にC ++、C#、およびJava。

Javaでは、書き込み時に依存関係が作成されます のようなもの

MyClass32 temp = this.theThing();

コードはクラスMyClass32に依存します 周りにいる。コードは機能しません それなしで。そのクラスの変更は コードをコンパイルできないようにし、 コードの多くの余分な変更、 クラスでさらにコードを変更する必要がある場合があります それはあなた次第です。余分な作業がたくさん。

Smalltalkでは次のように記述します   temp:= self theThing;

何が返されてもコードは機能します #getTheThing。あなたのコードは依存していません クラスMyClass32上にあります。あなただけ 依存関係は、「temp」が何でも理解する必要があるということです あなたがそれに送るメッセージ。

つまり、ある意味で依存性注入の目的は フレームワークは、静的に型付けされた言語を作成することです Javaのようなものは、動的に型付けされたもののようなものです。

そうは言っても、よくデザインパターンがあります Smalltalk:のようなクラスメソッドを作成する SOMEクラスを返すMyClass。持っている必要はありません NAME「MyCLass」。いくつかあるかもしれません クラス、夜に別のクラスを返します。 このパターンはSmalltalk MVCに存在し、 ビュークラスには#defaultControllerClassメソッドがあり、 通常、サブクラスによって再定義されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top