簡體   English   中英

Swiz要求弱封裝

[英]Swiz mandates weak encapsulation

我剛剛開始使用Swiz,而且看來Swiz會迫使您創建封裝性較弱的類。 Swiz要求所有事件處理程序都是公開的,以調解事件。

假設組件“ A”調度了一些事件,我想在組件“ B”中偵聽。 傳統上,我只會在“ B”中的“ A”上添加事件偵聽器,並且可以將“ B”中的所有事件處理程序設為私有。 但是,如果我使用的是Swiz,則需要將所有處理程序,中介事件公開。

我在這里錯過了什么嗎,有沒有辦法繞過這個問題。 我真的不想污染我班的公共接口。

謝謝。

就像我在郵件列表中提到的那樣,不幸的是沒有辦法解決。 由於無法訪問類的私有成員,因此B可以對來自A的事件使用私有事件處理程序的唯一方法是從B內部調用addEventListener()。由於Swiz顯然不在您的類內運行,因此沒有辦法訪問這些成員。

Swiz旨在使您的應用程序代碼盡可能不受對Swiz類的引用(包括繼承)。 因此,您可以將其視為“從外部”配置應用程序。 與JVM不同,Flash Player完全不允許訪問私有成員,因此,為了使Swiz與您的代碼進行交互,它必須是公共的。

您還可以創建一個自定義名稱空間,使它們不一定是公共的,但也不是私有的。 我使用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處理器中 ,可能還要添加到其元數據MediateQueue中 只要將命名空間導入正確的類中,動態引用方法的對象就可以工作:

因此,在MediateProcessor(或類的頂部)的setUpMetadataTag方法中:

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

使代碼整潔,並保持公共狀態。 但是有些人認為這是太多的工作:)。

最好,蘭斯

對於在類之外並與類分離以調用處理程序的內容,該方法不能是私有的。 因此,您有兩種選擇:將它們公開,然后讓Swiz對其進行調解(並獲得所有松散的耦合),或者將它們保密,並且不使用事件調解。 如果您認為這是值得的(並且大多數這樣做),請使用它。 如果您不這樣做,請不要。

“ Swiz要求所有事件處理程序都是公開的,以調解事件。”

沒錯,但是Swiz的優勢在於它不會對您施加任何(或多或少)設計選擇,它只是提供了強大的工具(依賴注入,事件中介等),您可以選擇將其應用到您認為合適的地方。

使用Swiz根本不需要使用[Mediate]標記-您仍然可以像往常一樣使用addEventListener()並從私有方法偵聽(我敢肯定,您已經知道)。 據我所知,Swiz事件中介主要用於系統/應用程序級事件。 如果要在單個組件中或在接近的家族組件中調用事件偵聽器,則通常會使用標准事件偵聽器。 要在各個其他組件之間進行通信,可以使用Swiz的中介程序處理該消息。

簡而言之,在任何情況下,只要您有權訪問私有事件偵聽器(即在緊密的組件內),您就可能不會使用[Mediate]捕獲事件,因此偵聽器可以保持私有狀態。 當您使用[Mediate]標簽時,事件處理程序通常位於應用程序中一個完全獨立的位置(例如Presenter-> controller),在任何情況下它實際上都不是私有的。

我可能會有點不舒服,但這就是我的樣子。 Swiz在某些情況下可能會鼓勵弱封裝,但對我而言,它總體上提供了更大的模塊化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM