1

Swizを使い始めたばかりですが、Swizではカプセル化が弱いクラスを作成する必要があるようです。Swizでは、イベントを仲介するために、すべてのイベントハンドラーをパブリックにする必要があります。

コンポーネント「A」が、コンポーネント「B」でリッスンしたいいくつかのイベントをディスパッチするとします。従来は、「B」の「A」にイベントリスナーを追加するだけで、「B」のすべてのイベントハンドラーを非公開にすることができます。ただし、Swizを使用している場合は、すべてのハンドラー、仲介イベントを公開する必要があります。

私はここで何かが欠けていますか、この問題を回避する方法はありますか?私は本当に、クラスのパブリックインターフェイスを汚染したくありません。

ありがとう。

4

4 に答える 4

5

メーリング リストで述べたように、残念ながらそれを回避する方法はありません。クラスのプライベート メンバーにアクセスする方法がないため、B が A からのイベントにプライベート イベント ハンドラを使用できる唯一の方法は、addEventListener() が B 内から呼び出される場合です。Swiz は明らかにクラス内で動作していないため、方法がありません。それらのメンバーにアクセスします。

Swiz は、アプリケーション コードを Swiz クラスへの参照 (継承を含む) から可能な限り解放することを目指しています。したがって、「外部から」アプリを構成することと考えることができます。JVM とは異なり、Flash Player は単純にプライベート メンバーへのアクセスを許可しないため、Swiz がコードとやり取りするには、パブリック メンバーである必要があります。

于 2010-02-04T20:46:05.967 に答える
4

必ずしもパブリックではなく、プライベートでもないカスタム名前空間を作成することもできます。Openflux が最初に行ったものを使用します。

[Mediate(event="UserEvent.LOGIN")]
metadata function loginHandler(user:User):void
{
    ... with namespace
}

[Mediate(event="UserEvent.LOGOUT")]
public function logoutHandler(user:User):void
{
    ... without namespace
}

use namespace metadata次に、Swiz Processorsに追加する必要があり、おそらくそれらのメタデータ MediateQueueに追加する必要があります。名前空間が正しいクラスにインポートされている限り、メソッドを動的に参照するものは機能します。

そのため、setUpMetadataTagMediateProcessor (またはクラスの上部) のメソッドで:

use namespace metadata;
// bean.source[mediateTag.host.name]
// service["loginHandler"] and service["logoutHandler"] both work
addMediatorByEventType( mediateTag, bean.source[ mediateTag.host.name ], eventType );

コードをきれいにし、物事が公開されないようにします。しかし、それは大変な作業だと考える人もいます :)。

ベスト、ランス

于 2010-02-05T10:51:52.493 に答える
0

クラスの外部にあり、クラスから切り離されてハンドラーを呼び出すために、メソッドをプライベートにすることはできません。したがって、2つの選択肢があります。公開してSwizに仲介させる(そしてすべての緩い結合を刈り取る)か、非公開にしてイベント仲介を使用しないかです。それが価値があると思うなら(そしてほとんどの場合)、それを使ってください。そうでない場合は、しないでください。

于 2010-02-05T03:50:30.583 に答える
0

「Swiz では、イベントを仲介するために、すべてのイベント ハンドラーを公開する必要があります。」

それは本当ですが、Swiz の強みは、(多かれ少なかれ) 設計上の選択を強制するものではなく、適切と思われる場所に適用することを選択できる強力なツール (依存性注入、イベント仲介など) を提供することです。

Swiz を使用するのに [Mediate] タグを使用する必要はまったくありません。 addEventListener() を使用して、通常どおりプライベート メソッドからリッスンすることができます (ご承知のとおり)。私の知る限り、Swiz イベント メディエーションは、主にシステム/アプリケーション レベルのイベントで使用することを目的としています。単一のコンポーネント内または類似のコンポーネント内でイベント リスナーを呼び出す場合は、通常、標準のイベント リスナーを使用します。個々の、そうでなければ関連のないコンポーネント間で通信するには、Swiz のメディエーターを使用してメッセージを処理できます。

要するに、プライベート イベント リスナーにアクセスできる場合 (つまり、近いコンポーネント内) では、[Mediate] を使用してイベントをキャプチャすることはなく、リスナーをプライベートのままにすることができます。[Mediate] タグを使用している場合、イベント ハンドラーは通常、アプリケーション内の完全に別の場所 (例: プレゼンター -> コントローラー) にあり、どのような場合でも実質的に非公開にすることはできません。

少しずれているかもしれませんが、私にはこんな感じです。Swiz は状況によっては弱いカプセル化を助長するかもしれませんが、私にとっては、全体的により優れたモジュール化を提供します。

于 2010-06-11T05:22:15.600 に答える