2014-11-20 3 views
1

Totaly дизайн предназначенный вопрос.Eventhandlers design

я видел много примеров, что делает пользовательские события, как это:

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

    class ClientListner 
    { 
     public event NewClientEvent ClientConnected; 
    } 

} 

но это должно быть, как это? что, если я не имею использовать Eny для любого отправителя, ни, есть то какая-то причина, чтобы включить его, или whould это будет суммарно легально вобще

namespace 
{ 
    public delegate void NewClientEvent(Socket newclient); 

    class ClientListner 
    { 
     public event NewClientEvent ClientConnected; 
    } 

} 

что путь только соответствующие данные получает отправить? В любом случае, vs intelisence помогает с добавлением, так что это не похоже на то, что он будет усложняться.

+0

Что случилось с параметром 'object sender'? – Hayden

+1

Если вы делаете свои собственные мероприятия, вы можете делать все, что имеет смысл для вашего приложения. Шаблон '(object sender, EventArgs e) работает очень хорошо для событий пользовательского интерфейса, но вам не нужно следовать этому шаблону, если что-то еще работает лучше. – gcarvelli

+1

Для статических событий это необязательно, но, например, события да, это хорошо. В противном случае вы не сможете найти, кто поднимает событие (если не сейчас, вам может понадобиться его в будущем). –

ответ

2

Используйте object sender, EventArgs e для событий и MyRelevantClass data для обратных вызовов.

Мое определение будет таким, как это для этого контекста: событие может происходить из нескольких мест, и многие сущности могут его слушать, каждый из которых требует (подмножество) данных. Обратные вызовы являются специфичными для системы, специфичны для контекста и намного ближе к строго связанному наследованию/полиморфизму, чем к слабосвязанным сообщениям.

Почему отправитель и события?

Что делать, если вам вдруг нужно знать, какая часть вашей системы вызвала подключение нового клиента? Что делать, если вы хотите добавить метаданные к этому конкретному соединению? (были ли какие-либо повторы? знаем ли мы, что этот IP-адрес находится в локальной сети, мы хотим переопределить TTL? и т. д.). Наличие традиционной подписи object sender, EventArgs e позволяет четко расширять код с помощью этой функции без необходимости переписывать код, за исключением случаев, когда вам нужны дополнительные данные.

Для событий важно подготовиться к ситуации, когда вам может понадобиться добавить данные, и вы должны постараться остаться в пределах Open-Closed Principle. Традиционная подпись делает это проще и считается лучшей практикой.

+0

Thx Alexander на самом деле объяснил это красиво :) плохо смотрю в твердое немного больше, едва поцарапал его. –