Преимущества использования EventHandler - PullRequest
0 голосов
/ 07 декабря 2011

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

Пример сокращенного кода:

Public Class MenuEntry
    Public Event selected as EventHandler(of EventArgs)

    Protected Friend Overridable Sub onSelectEntry(e as EventArgs)
        RaiseEvent selected(Me, e)
    End Sub
End Class


Public Class Menu
    Private menuSelect as New inputAction(Keys.Enter)
    Private menuEntry as New List(of MenuEntry)

    'keeps track of which menu item we're currently on
    Private _selectedEntry as Integer

    Public Sub Update()
        If menuSelect.evaluate Then
            onSelectEntry(_selectedEntry)
        End If

        Protected Overridable Sub onSelectEntry(ByVal entryIndex as Integer)
            menuEntry(entryIndex).onSelectEntry(New EventArgs())
        End Sub
    End Sub
End Class


Public Class OptionsMenu
    Inherits Menu

    Private arbitraryOne as Integer
    Private arbitraryTwo as Integer

    Public Sub New()
        Dim entryOne as New MenuEntry(String)
        Dim entryTwo as New MenuEntry(String)

        AddHandler entryOne.selected, AddressOf entryOneSelected
        AddHandler entryTwo.selected, AddressOf entryTwoSelected

        MenuEntry.add(entryOne)
        MenuEntry.add(entryTwo)
    End Sub

    Private Sub entryOneSelected(ByVal entryIndex as Integer)
        arbitraryOne += 1
    End Sub

    Private Sub entryTwoSelected(ByVal entryIndex as Integer)
        arbitraryTwo += 1
    End Sub
End Class

И я был прав, мне не хватало большей картины. Написание всего кода в одном месте помогло мне точно увидеть, что происходит. Надеюсь, я прав:

Событие позволяет классу сказать «Делай что-нибудь, когда это происходит» очень двусмысленным образом, оставляя класс, который создал Объект, для определения Обработчика; каким должно быть это действие. Этот обработчик может и, скорее всего, будет уникальным для каждого экземпляра класса.

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

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

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Возможность запуска произвольного кода при возникновении события является важным аспектом. Но есть гораздо большее преимущество, оно сильно уменьшает связь между классами. Обратите внимание, что ваш класс MenuEntry вообще не имеет ссылки на класс Menu. Вы можете полностью перепроектировать класс Menu, и вам не нужно вносить какие-либо изменения в класс MenuEntry. Это делает код легко компонуемым.

Технический термин - шаблон наблюдателя. Книга Gang of Four является важным чтением для программистов.

1 голос
/ 07 декабря 2011

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

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