2014-11-20 3 views
1

Totaly 디자인 지향 질문.이벤트 처리기 디자인

namespace 
{ 
    public delegate void NewClientEvent(object sender, EventArgs e); 

    class ClientListner 
    { 
     public event NewClientEvent ClientConnected; 
    } 

} 

을하지만이처럼해야합니까 :

난 사용자 정의 이벤트 같은 수의 예를 많이 볼 수있다? 내가 뭘도, 그것을 포함하는 몇 가지 이유는 다음이, 또는 그냥 할 totaly 합법적 whould 보낸 사람 중 하나에 대한 ENY 사용을 해달라고하면 방법 관련 데이터 만 전송 얻을

namespace 
{ 
    public delegate void NewClientEvent(Socket newclient); 

    class ClientListner 
    { 
     public event NewClientEvent ClientConnected; 
    } 

} 

? intelisence는 어쨌든 inplimentation에 도움이되므로 더 어려워 질 것 같지 않습니다.

+0

어쨌든'object sender' 매개 변수를 사용하는 것이 잘못된 이유는 무엇입니까? – Hayden

+1

자신 만의 이벤트를 만들면 자신의 어플리케이션에 적합한 모든 것을 할 수 있습니다. '(객체 발신자, EventArgs e) 패턴은 UI 이벤트에서 정말 잘 작동하지만, 다른 것이 잘 작동하면 그 패턴을 따를 필요가 없습니다. – gcarvelli

+1

정적 이벤트의 경우에는 필요하지 않지만 예를 들어 이벤트는 좋은 일입니다. 그렇지 않은 경우 이벤트를 제기 한 사람을 찾을 수 없습니다 (지금이 아니라면 나중에 필요할 수 있음). –

답변

2

이벤트의 경우 object sender, EventArgs e을 사용하고 콜백의 경우 MyRelevantClass data을 사용하십시오.

내 정의는이 컨텍스트에서 이와 같을 것입니다. 이벤트는 여러 위치에서 비롯 될 수 있으며 많은 엔터티는 각 데이터 (하위 집합)를 필요로합니다. 콜백은 시스템 고유의 문맥에 따라 다르며, 느슨하게 결합 된 메시징보다 강력하게 결합 된 상속/다형성에 훨씬 가깝습니다.

왜 발신자 및 이벤트입니까?

시스템의 어느 부분에서 새 클라이언트가 연결되었는지 갑자기 알고 싶다면 어떻게해야합니까? 특정 연결에 메타 데이터를 추가하려면 어떻게해야합니까? (재 시도가 있었습니까?이 IP를 알고 있습니까? 로컬 네트워크에 있습니까? TTL을 덮어 쓰시겠습니까? 등). 기존 object sender, EventArgs e 서명을 사용하면 추가 데이터가 필요한 경우를 제외하고 코드를 다시 작성하지 않고도이 기능으로 코드를 완전히 확장 할 수 있습니다.

이벤트의 경우 데이터를 추가해야하는 상황을 대비해야하며 Open-Closed Principle에 머물러 야합니다. 전통적인 서명을 사용하면이 작업이 더 쉬워지고 모범 사례로 간주됩니다.

+0

Thx 알렉산더는 실제로 그것을 멋지게 설명 :) 아픈 좀 더, 아슬 아슬하게 그것을 간신히 긁어 설명. –