C#: события или интерфейс наблюдателя? Профессионалы/недостатки?

Размышляя о том, как работает pinpad, который мой банк прислал мне, вам всегда нужно вводить две цифры после десятичной точки, а форматирование на дисплее касается положения точки.

Поэтому, если я вхожу в «1», он интерпретируется как 0,01. Аналогично, «1023» будет 10.23.

Я думаю, что такой же подход мог бы сработать для вас. Таким образом, 1.23 вводится как «123» и 0.80 как «80»

Я не вижу ссылки, которая ограничивает символы 0-9 # *, но все примеры следуют этому формату. Однако ваш пример начинается с * 234, который, похоже, соответствует этому правилу в спецификации

Случай a) 1, 2 или 3 цифры из набора (*, #), за которым следует 1X (Y), где X = любое число 0-4, Y = любое число 0-9, затем, необязательно «*, за которым следует любое количество любых символов» и завершение с # SEND: этот случай зарезервирован для использования HPLMN. Когда обслуживающая сеть получает такое сообщение от приглашенного абонента, оно передает сообщение USSD непосредственно в HPLMN. Если он получает его от домашнего абонента, он должен решить, следует ли его обрабатывать локально или передать его в HLR

http://www.etsi.org/deliver /etsi_ts/100600_100699/100625/07.00.00_60/ts_100625v070000p.pdf

В общем, я не уверен, что HPLMN (Home Public Land Mobile Network) или HLR (Home Location Register) будет ожидать дополнительные символы, даже если весь набор символов и даже другие наборы символов разрешены в протоколе USSD.

58
задан Roger Lipscombe 15 February 2009 в 12:10
поделиться

8 ответов

Полагайте, что событие интерфейс обратного вызова, где интерфейс имеет только один метод.

Только события рычага Вам нужно
события With, только необходимо реализовать обработчики для событий, Вы интересуетесь обработкой. В шаблоне интерфейса наблюдателя необходимо было бы реализовать все методы во всем интерфейсе включая реализацию тел метода для типов уведомления, о которых Вы на самом деле не заботитесь об обработке. В Вашем примере всегда необходимо реализовывать OnFoundDirectory и OnFoundFile, даже если Вы только заботитесь об одном из этих событий.

Меньше обслуживания
Другая хорошая вещь о событиях - Вы, может добавить новый к конкретному классу так, чтобы это повысило его, и Вы не должны изменять каждого существующего наблюдателя. Принимая во внимание, что, если Вы хотите добавить новый метод к интерфейсу, необходимо обойти каждый класс, который уже реализует тот интерфейс, и реализуйте новый метод во всех них. С событием, хотя, только необходимо изменить существующие классы, которые на самом деле хотят сделать что-то в ответ на новое событие, что Вы добавляете.

шаблон встроен в язык, таким образом, все знают, как использовать его
, События идиоматичны, в том, что, когда Вы видите событие, Вы знаете, как использовать его. С интерфейсом наблюдателя люди часто реализуют различные способы зарегистрироваться, чтобы получить уведомления и поднять трубку наблюдателя.. с событиями, хотя, после того как Вы изучили, как зарегистрировать и использовать одного (с + = оператор), остальные все одинаковые.

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

Синтаксис
Некоторым людям не нравится способ, которым необходимо объявить тип делегата для каждого события. Кроме того, стандартные обработчики событий в платформе .NET следуют, имеют эти параметры: (возразите отправителю, EventArgs args). Поскольку отправитель не указывает конкретный тип, Вы имеете к удрученному, если Вы хотите использовать его. Это часто прекрасно на практике, если не совсем чувствует себя хорошо хотя, потому что Вы теряете защиту статической системы типов. Но, если Вы реализуете свои собственные события и не следуете рамочной конвенции .NET об этом, можно использовать корректный тип, столь потенциальный вниз бросающий, не требуется.

67
ответ дан Scott Langham 7 November 2019 в 15:19
поделиться

Хм, события могут использоваться для реализации шаблона The Observer. На самом деле использование событий может рассматриваться как другая реализация шаблона "наблюдатель", по моему скромному мнению.

29
ответ дан Frederik Gheysels 7 November 2019 в 15:19
поделиться

Некоторые дальнейшие преимущества событий.

  • Вы получаете надлежащее многоадресное поведение бесплатно.
  • при изменении подписчиков события в ответ на то событие, поведение четко определено
  • , Они могут анализироваться (отраженные) легко и последовательно
  • поддержка Набора инструментальных средств событий (просто, потому что они - идиома в .NET)
  • , Вы получаете опцию использовать асинхронную пчелу, которую это обеспечивает

, можно достигнуть всех их (кроме набора инструментальных средств) сами, но это удивительно твердо. Например: Если Вы используете членскую переменную как List<> для хранения списка наблюдателей. При использовании foreach для итерации по нему затем какой-либо попытки добавить или удалить подписчика в одном из OnFoo (), обратные вызовы метода инициируют исключение, если Вы не напишете дальнейший код для контакта с ним чисто.

7
ответ дан ShuggyCoUk 7 November 2019 в 15:19
поделиться

Профессионалы интерфейсного решения:

  • , Если Вы добавляете методы, существующие наблюдатели должны реализовать те методы. Это означает, что у Вас есть меньше шанса упущения обеспечить электричеством существующих наблюдателей к новой функциональности. Можно, конечно, реализовать их как пустые методы, что означает, что у Вас есть роскошь тихого выполнения ничего в ответ на определенные "события". Но Вы так легко не забудете.
  • при использовании явной реализации Вы также получите ошибки компилятора другой путь, если Вы удалите или измените существующие интерфейсы, затем наблюдатели, реализующие их, прекратят компилировать.

Недостатки:

  • Более мысль должна войти в планирование, так как изменение в интерфейсе наблюдателя могло бы осуществить изменения на всем протяжении Вашего решения, которое могло бы потребовать другого планирования. Так как простое событие является дополнительным, минимальный другой код должен измениться, если тот другой код не должен реагировать на событие.
8
ответ дан angry person 7 November 2019 в 15:19
поделиться

Профессионалы - то, что события являются большим количеством 'точки-netty'. При разработке невидимых компонентов, которые могут быть отброшены на форму, можно сцепить их использование разработчика.

Недостатки - то, что событие только показывает единственное событие - Вам нужно отдельное событие для каждой 'вещи', о которой Вы хотите уведомить наблюдателя. Это действительно не оказывает много практического влияния за исключением того, что каждый наблюдаемый объект должен был бы содержать ссылку для каждого наблюдателя для каждого события, чрезмерно увеличивая размер памяти в случае, где существует много наблюдаемых объектов (одна из причин, они сделали другой способ управлять отношениями наблюдателя / заметными отношениями в WPF).

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

3
ответ дан U62 7 November 2019 в 15:19
поделиться

Java имеет поддержку языка анонимных интерфейсов, таким образом, интерфейсы обратного вызова являются вещью использовать в Java.

C# имеет поддержку анонимных делегатов - лямбд - и таким образом, события являются вещью использовать в C#.

2
ответ дан Daniel Earwicker 7 November 2019 в 15:19
поделиться

Лучший способ решить является этим: какой удовлетворяет ситуации лучше. Это могло бы походить на глупый или бесполезный ответ, но я не думаю, что необходимо расценить один или другой как "надлежащее" решение.

Мы можем бросить сто подсказок в Вас. События являются лучшими, когда наблюдатель, как ожидают, прислушается к случайным событиям. Интерфейс является лучшим, когда наблюдатель ожидается к перечисленному ко всему данному набору событий. События являются лучшими при контакте с приложениями для GUI. Интерфейсы используют меньше памяти (единственный указатель для нескольких событий). Yadda yadda yadda. Маркированный список за и против - что-то для размышления о, но не категорический ответ. То, что действительно необходимо сделать, попробовать их обоих в реальных приложениях и получить хорошее ощущение их. Затем можно выбрать тот, который удовлетворяет ситуации лучше. Изучите выполнение формы.

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

2
ответ дан snarf 7 November 2019 в 15:19
поделиться

Я предпочитаю решение для основы события по следующим причинам

  • , Оно уменьшает стоимость записи. Намного легче сказать "+ = новый EventHandler", чем реализовать абсолютный интерфейс.
  • Это уменьшает затраты на обслуживание. Если Вы добавляете новое событие в свой класс, это - все, что должно быть сделано. Если Вы добавляете новое событие к интерфейсу, необходимо обновить каждого потребителя в кодовой базе. Или определите совершенно новый интерфейс, который со временем становится раздражающим потребителям, "Я реализую IRandomEvent2 или IRandomEvent5?"
  • События позволяют, чтобы обработчики были базирующимся неклассом (т.е. статический метод где-нибудь). Нет никакой функциональной причины вынудить все обработчики событий быть членом экземпляра
  • , Группировка набора событий в интерфейс делает предположение о том, как события используются (и это просто, что, предположение)
  • Интерфейсы не предлагают реального преимущества перед необработанным событием.
1
ответ дан JaredPar 7 November 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: