문제

방금 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스온스 프로세서, 그리고 아마도 그들의 메타 데이터 중재 queue. 네임 스페이스가 올바른 클래스에서 가져 오는 한 메소드를 동적으로 언급하는 것이 작동합니다.

그래서 setUpMetadataTag MediateProcessor (또는 클래스 상단)의 메소드 :

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] 태그를 사용하는 경우 이벤트 핸들러는 일반적으로 애플리케이션에서 완전히 별도의 위치에 있습니다(예:발표자 -> 컨트롤러) 어떤 경우에도 실질적으로 비공개일 수 없습니다.

조금 다를 수도 있지만 이것이 나에게 나타나는 방식입니다.스위츠는 할 수 있다 장려하다 어떤 상황에서는 캡슐화가 약하지만 나에게는 전체적으로 더 나은 모듈화를 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top