C # Best Practice - подписка на события - PullRequest
1 голос
/ 28 февраля 2011

Очень простой вопрос, так что я просто ищу лучшую практику для подражания.

В моем классе есть несколько событий, на которые следует подписаться. (например, DiscoveryCompleted). Внутри метода я проверяю, является ли событие нулевым или нет, однако я не уверен, стоит ли вызывать исключение, если да, то какого типа. NotImpletementedException?

Если исключение не обработано, оно выглядит не очень элегантно.

Твои мысли?

Ответы [ 5 ]

3 голосов
/ 28 февраля 2011

Я думаю, что это именно то, для чего был создан NotImplementedException.Вы никогда не должны сталкиваться с NotImplementedException в производственном коде, но во время тестирования становится ясно, что у вас есть путь к коду, который, ну, в общем, не был реализован.

Вроде как комментарий TODO, но больше в-your-face:)

Хотя я могу спросить, не означает ли наличие обработчика событий, на который необходимо подписаться, и отсутствие подписчика по умолчанию,

РЕДАКТИРОВАТЬ

Я думаю, что я немного неправильно понял ваш первоначальный вопрос, основываясь на вашем комментарии.Как уже говорили другие (и я сомневался), вы не должны вызывать исключение, если у вас нет подписчика на обработчик событий;просто не пытайся это назвать.Если никто не заботится о том, что произошло событие x, вы ничего не можете с этим поделать.

В ваш код не входит забота о том, заботится ли кто-нибудь о том, что это произошло, а просто уведомление о том, что это произошло, если они это сделаютcare.

EDIT 2 - теперь с дополнительным кодом

public interface INeedToKnowAboutSomethingImportant 
{
    void WhenSomethingImportantHappens(SomethingImportantHappenedEventArgs args);
}


public class DoesSomethingImportant 
{
    private readonly INeedToKnowAboutSomethingImportant _needyDependency;
    public DoesSomethingImportant(INeedToKnowAboutSomethingImportant needyDependency)
    {
        _needyDependency = needyDependency;
    }

    protected void SomethingImportantHappened(object sender, EventArgs e)
    {
        //Handle internally
        _needyDependency.WhenSomethingImportantHappens(new SomethingImportantHappenedEventArgs(e));
    }
}

Следуя этой схеме, вам не нужно беспокоиться о том, подписан ли кто-либо на ваши обработчики событий.,Вы должны выполнить зависимость, но не имеет значения ВСЕ чем вы ее заполняете, потому что чем бы она ни была, у вас будет этот метод для вызова.

2 голосов
/ 28 февраля 2011

События должны быть дополнительно подписаны.Если ваш класс должен вызвать метод, вместо этого передайте делегат его конструктору.

1 голос
/ 28 февраля 2011

Вы не должны бросать NotImplementedException при проверке вашего события. Просто проверьте и выполните, если не ноль.

Взять, к примеру. Вы размещаете элемент на своей странице, но не собираетесь реализовывать какие-либо события на кнопке. Кнопка проверяет событие Click, не находит его и выдает исключение NotImplementedException.

Теперь это просто неправильно.

Событие - это то, что возникает при достижении определенной точки программы. Тогда у вас может быть код, который «запускается» им. Основной путь кода не должен зависеть от того, присутствует событие или нет. Если основной путь вашего кода не может продолжаться без инициируемого события, вам нужно вместо этого использовать метод.

Мое предложение: 1) Создать событие. 2) Подписаться на событие с обработчиками, которые вы собираетесь реализовать позже. 3) Добавьте исключение NotImplementedException в обработчик.

Поскольку исключение не обрабатывается, вы все равно не должны обрабатывать NotImplementedException: P ... (И вам не следует создавать исключение NotImplementedException для пустой ссылки на события).

0 голосов
/ 28 февраля 2011

Я бы не выбрасывал, если у события нет подписчиков.

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

0 голосов
/ 28 февраля 2011

Вам не следует беспокоиться о нулевом объекте события. Если никто не подписался на событие, то ничего. Если вам нужна другая функция для запуска вне вашего класса повышения событий, тогда вам нужно использовать другой шаблон, помимо шаблона наблюдателя. Как предположил Эдуардо, вы можете передать делегата, вы также можете рассмотреть шаблон строителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...