메시지를 전송하거나 수신 할 수있는 매우 잘 정의 된 인터페이스 세트가 있어야합니다. EventScheduler에 대한 참조를 제공하는 것은 쉽지 않습니다. 그렇지 않은 경우 또는 이벤트 스케줄러를 "너무 많은"고유 한 유형으로 전달하는 것과 관련이 있다고 생각되면 손에 더 큰 설계 문제 (단독이 악화되는 경향이있는 무차별 종속성)가있을 수 있습니다. ).
스케줄러를 필요로하는 인터페이스로 스케줄러를 전달하는 기술은 " 종속성 주입 "의 한 형태 이지만이 경우에는 새로운 종속성을 주입하지 않습니다 . 이것은 시스템에 이미 가지고있는 종속성이지만, 이제는 명시적인 것으로 만듭니다 (단일 톤의 암시 적 종속성과 비교). 일반적으로 명시 적 종속성은 자체 문서화가 많을수록 바람직합니다.
또한 이벤트 예약 소비자를 서로 동일한 스케줄러에 연결하지 않아도되므로 이벤트 소비자를 서로 분리하여 유연성을 높일 수 있습니다. 로컬 클라이언트 / 서버 설정 또는 기타 여러 옵션을 테스트하거나 시뮬레이션하는 데 유용 할 수 있습니다. -다른 옵션이 필요하지 않을 수도 있지만 인위적으로 자신을 제한하려는 노력을 기울이지 않았습니다.
편집 : 스케줄러를 전달할 때 말하는 것은 이것입니다. 충돌에 반응하는 게임 구성 요소가 있으면 물리 계층의 일부인 충돌 응답기 팩토리를 통해 생성 될 수 있습니다. 스케줄러 인스턴스를 사용하여 팩토리를 구성하면 해당 인스턴스를 작성하는 응답자에게 전달한 다음이를 사용하여 이벤트를 발생 시키거나 다른 이벤트를 구독 할 수 있습니다.
class CollisionResponderFactory {
public CollisionResponderFactory (EventScheduler scheduler) {
this.scheduler = scheduler;
}
CollisionResponder CreateResponder() {
return new CollisionResponder(scheduler);
}
EventScheduler scheduler;
}
class CollisionResponder {
public CollisionResponder (EventScheduler scheduler) {
this.scheduler = scheduler;
}
public void OnCollision(GameObject a, GameObject b) {
if(a.IsBullet) {
scheduler.RaiseEvent(E_BIG_EXPLOSION);
}
}
EventScheduler scheduler;
}
게임 오브젝트 모델이 무엇인지 알 수 없기 때문에 이것은 분명히 끔찍하게 고 안되고 단순화 된 예입니다. 그러나 이벤트 스케줄러에 대한 종속성을 명시 적으로 설명하고 추가 캡슐화 가능성을 보여줍니다 (스케줄러와 동일한 개념 레벨에서 상위 레벨 충돌 응답 시스템과 통신하는 경우 응답자에게 스케줄러를 전달할 필요는 없음). 스케줄러를 통해 이벤트 발생의 기본 요소를 처리하는 팩토리 이것은 충돌시 발생할 특정 이벤트와 같이 이벤트 디스패치 시스템의 구현 세부 사항에서 각 개별 응답기 구현을 분리합니다. -아닙니다).