2015-01-07 5 views
0

모듈 (스크립트)이 완전히 독립적이며 서로 분리되어 있고 Mediator에만 의존하는 이벤트 중심 아키텍처를 구축하는 우아한 방법을 찾고 있습니다. 통신. 의 전형적인 예를 살펴 보자 : 사전 라우팅에서 콜백을 실행하는 콜백 배열을 따라에 이벤트 이름에서 전화로JavaScript (V8)에서 동적 이벤트로 'Mediator'패턴 최적화

var SomeModule = function() {...}; 

SomeModule.init = function() 
{ 
    Mediator.register ('SomeEvent', this.onSomeEvent, this); 
    Mediator.register ('OtherEvent', this.onOtherEvent, this); 
}; 

SomeModule.onSomeEvent = function (data) 
{ 
    var x = data.x; 
    var y = data.y; 
    // ........ 
    Mediator.dispatch ('ThirdEvent', {name: 'Liza', gender: 1}); 
    // now all modules registered for 'ThirdEvent' will get their callbacks executed 
}; 

일반적인 중재자가 운영하고 있습니다. 이제 Mediator.dispatch (...)는 동적 객체를 도입하여 V8에서 실행될 때 느리고 최적화되지 않은 상태로 유지되는 다형성 코드를 도입합니다. 일부 이벤트는 초당 60 회의 해고가 발생하며 여러 콜백이 있으므로 최적화를 통해 확실한 이점을 얻을 수 있습니다.

모든 새로운 이벤트에 대해 큰 상용구 코드를 도입하지 않고이 코드를 단일체로 만드는 가장 우아한 방법은 무엇입니까?

EDIT :이. 비유 (this)를 주석에 제안 된대로 컨텍스트 매개 변수로 제공하여 대체하십시오.

+1

개체 리터럴이 최적화되지 않았습니까? 내가 생각할 수있는 한 가지는 모듈에'// @ event ThirdEvent (name, gender)'와 같은 주석을다는 것입니다. 그런 다음 이러한 주석은 자동으로 생성자 코드를 생성하는 코드 전처리 기가 읽습니다. 그런 다음 코드에서 Mediator.dispatch (새 ThirdEvent ('Liza', 'gender')); '를 사용할 수 있습니다. 당신이해야 할 일이있을 때 이벤트 디스패치 나 콜백 처리를 취소하는 것이 좋습니다. – plalx

+0

@plalx Mediator.dispatch()는 매번 다른 params 객체로 호출되므로 V8이이 케이스에 대해 최적화 된 숨겨진 클래스를 생성 할 수없는 것처럼 보입니다. mediator.dispatch ("FirstEvent", {x : 1, y : 2, z : 3}), 또 다른 시간 - Mediator.dispatch ("SecondEvent", {name : "Liza", 성별 : 1}). –

+1

@VincentPride 중재자가 실제로 객체를 사용하려고 시도하지 않는 한 숨겨진 하나의 클래스가 될 필요는 없지만 객체를 사용하는 이유는 무엇입니까? 그냥 통과하고 사용하지 않으므로 숨겨진 클래스가 무엇인지는 중요하지 않습니다. – Esailija

답변

1

초당 60 회 이러한 종류의 작업은 아무 것도 아닙니다.

당신이 그것을 최적화하고 싶다면 여기에서 가장 명백한 병목 현상은 네이티브 .bind 함수를 사용하여 생성 된 함수를 확실히 호출 할 것입니다. 최적화 할 때 당신은 항상 (I am not joking about always)는 먼저로 만든 바인딩을 사용해야합니다

function bind(fn, ctx) { 
    return function() { 
     return fn.apply(ctx, arguments); 
    }; 
} 

이는 점이다, 모든 Function.prototype.bind 같은 일을하지 않습니다 당신이 바인딩을 원하는 것이 정확히 수행 해야 할 일.

+0

그건 실제로 꽤 유용한 말입니다. 고마워요. –