Теорема об универсальной функции
Теорема об универсальной функции заключается в том, что любая программа может быть записана в один цикл, в котором каждый раз проверяется наличие (истинность) некоторого предиката.
Нужно отметить, что на каждый предикат подвешено действие, которое должно выполниться. Это называется охраняемой командой.
С позиции теоремы о нормальной форме любые две программы отличаются только набором охраняемых команд, т. е. цикл обработки событий фиксирован.
Триггер — «спусковой крючок»- процедура, отличающаяся от обычной функции тем, что это команда, которая срабатывает до наступления какого-нибудь события, в силу истинности какого-нибудь предиката постоянно проверяется (идея охраняемой команды).
Триггеры
Удаления Вставки
Идея:
Когда что-то вставляется, срабатывает некоторый предикат. Например, после вызывается команда проверки, каскадного удаления или какая-нибудь другая команда.
Генераторы и приёмники сообщений
Событие – это вызов метода. Обработка события заключается в кратном вызове процедур.
Сообщение – это передаваемые параметры.
Слушатель — приёмник – это вызываемый объект.
Говорящий — отправитель – это тот, кто вызывает.
Событийное программирование нужно:
— с одной стороны, для описания коммуникаций общего вида между людьми, программными или техническими системами
— с другой стороны, для реализации – PTP (point to point)
Пример PTP:
1 слушатель – 1 говорящий
Это очень популярная схема в дискретной математике, конечных автоматах.
Замечание:
Нас интересует более общая схема. Отсюда возникают трудности.
broadcasting — вещание, радиовещание, телерадиовещание, трансляция, телевещание, эфир, широковещание
отправитель получатель 1 … получатель n |
Подразумевается схема «Подписка» – слушатели добровольно могут либо включаться в подписку, либо по желанию исключаться из неё.
Это означает, что у каждого из этих объектов есть однотипный метод, который нужно вызвать.
Тип функции (метода, процедуры):
Пример:
An — функция двух аргументов
Её тип: Z * R->R, где Z– целый аргумент
R – вещественный аргумент
R – вещественный результат
Это и есть общематематическое понятие типа функции.
В каком смысле типы однотипны?
В том смысле, что по типу параметров и возвращаемых значений совпадают. Это, безусловно, декартово произведение (т. е. функции от двух аргументов трактуются как пара).
Отсылка сообщений – это кратный (многократный) вызов
Проще говоря, если в предыдущей схеме обработка событий слушателем означала вызов одной его процедуры, то в данном случае это означает вызов многих процедур (всех подписчиков, которые подписаны).
Реализация такова:
Существует список (обработка событий), который применяется к какому — то аргументу.
Message (трактуется как аргумент) — произвольный список параметров, который у всех одинаков.
<f1, f2, …>(message) -> f1(m), f2(m),…
Список применить к аргументам (отправка сообщения)- это
поочерёдное применение всех функций к аргументу (т. е. f1(n) … f2(n) , где n= сonst)
Таким образом, при вызове многих методов фактические параметры применяются к одному списку. Передача сообщения состоит в том, что эти методы поочерёдно применяются к этому списку параметров.
Вызов процедуры:
отправитель 1 получатель1
Вызов многих методов:
отправитель 1 получатель 1
получатель 2
…
получатель n
Замечание:
Применяются они к одному и тому же списку параметров => параметры должны быть однотипными.
Замечание:
Фактически, это просто вызов, который где-то стоит и где-то «стреляет» (вызывается несколько методов с одним и тем же списком параметров).
Вводится новое понятие:
Функциональный тип— указатель на функцию (метод, процедуру), которая привязана к объекту.
Событийный стиль в процедурном программировании — управление данными (на примере)
Пример (животные):
Задача: Описывается вызов движения блохи. Как только блоха начинает движение, все динозавры начинают кричать: «Ай-яй-яй». Нужно заметить, что явного вызова того, чтобы динозавры кричали, нет (но этот вызов где-то прошит). Событием здесь является то, что блоха движется, а динозавры кричат.
Замечание:
Блоха — отправитель сообщений, а TRex-ы – слушатели.
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
namespace Animals
{
class cAnimal
{
.
.
.
}//class cAnimal
//класс "cDinosaur" наследник класса "сAnimal"
public class cDinosaur : cAnimal
{
.
.
.
} //class cDinosaur
class cTRex : cDinosaur
{
.
.
.
//обработка событий — слушатель (listener) события FleaJumpEvent
private cFlea FleaJumpSender; // Flea To Listen To- поле, в котором хранится ссылка на блоху, а FleaJumpSender-Отправитель
public void SetFleaJumpSender(cFlea x) // получает ссылку на эту блоху
{
FleaJumpSender = x; // запоминание источника события
//Итак, блоха нужна для того, чтобы получить лист (список слушателей), который при ней хранится.
FleaJumpSender. FleaJumpEventList += new cFlea. FleaJumpEventHandler(TRexFleaJumpEventHandler);// добавление в список ссылки на свой обработчик
// new — создаётся новая копия описанной переменной функционального типа. После новое значение этого типа добавляется в список.
// += — это бинарное присваивание (т. е. имя списка и в левой, и в правой частях присваивания)
// аналогично осуществляется отказ от подписки "-="
}
public void TRexFleaJumpEventHandler(cFlea Sender)
{
Console. WriteLine(GetName() + "afraid of" + Sender. GetName() + "jumping");
}
} // class cTRex
// класс "Flea" наследник класса "cAnimal"
class cFlea : cAnimal //производный класс "Блоха"
{
.
.
.
public override void Move() // описание метода "двигаться" для блох
{
Console. WriteLine(GetName() + "jumps");
OnFleaJump(); // кратный вызов
}
.
.
.
}
}
Событийное программирование в C# (delegate, event)
Delegate — функциональный тип, к которому относятся любые функции, принимающие на вход параметр типа блоха (т. е. cFlea Sender) и возвращающие функции.
Таким образом, к этому типу относятся все функции с определённым списком параметров.
Event — событие- объявление переменной списка ссылок ранее объявленного типа
class cFlea
{
.
.
.
// обработка событий-источник/ sender(Отправитель)
// организация обработки события FleaJumpEvent
public delegate void FleaJumpEventHandler(cFlea Sender); // типизированая ссылка на функцию — обработчик — заголовок
//-объявление функционального типа с именем FleaJumpEventHandler — типизированная ссылка на функцию, но не на тип данных
EventHandler- пользовательское соглашение — обработчик событий,
FleaJump-прыжок блохи
public event FleaJumpEventHandler FleaJumpEventList; // связь имени события с его обработчиками (реализация — список ссылок на обработчики)
//список называется FleaJumpEventList, содержит он ссылки типа FleaJumpEventHandler
//кратный вызов — применение объявленного списка к нужному аргументу (обработчиков)
protected virtual void OnFleaJump() //protected, т. к. события не вызываются извне
//OnFleaJump — по прыжку блохи-стандартное соглашение для методов такого назначения