Введение

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


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

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

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

Когда человек подходит к переходу, он подписывает свой обработчик события перехода дороги на конкретное событие этого светофора. Если человек передумает переходить или, например, отойдет поговорить по телефону, то он не будет выполнять свой обработчик, если событие возникнет.

И, наконец, когда светофор включается на зеленый, все люди начинают переходить дорогу. Возникло событие – выполнился обработчик.

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

Давайте рассмотрим пример создания события на языке C#.

 

namespace TrafficLight

{

    // Светофор

    public class Light

    {

        // Событие появления зеленого света

        public event EventHandler Green;

        // Метод который вызывает событие

        public void SwichToGreen()

        {

            Green.Invoke(thisnew EventArgs());

        }

    }

    // Человек

    public class Human

    {

        public string Name { getprivate set; }

 

        public Human(string name)

        {

            Name = name;

        }

        // Метод обработчик события перехода через дорогу

        public void CrossingTheRoad(object sender, EventArgs e)

        {

            Console.WriteLine(this.Name + " crossing!");

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            // Создание светофора

            Light light = new Light();

            // Создание людей

            Human human1 = new Human("Alex");

            Human human2 = new Human("Bob");

            Human human3 = new Human("Alice");

            // Подписка на событие

            light.Green += human1.CrossingTheRoad;

            light.Green += human2.CrossingTheRoad;

            light.Green += human3.CrossingTheRoad;

            // Вызов события

            light.SwichToGreen();

            Console.ReadKey();

        }

    }

}

 

Simple events

 

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

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