
- •Программирование и алгоритмические языки. Курс за третий семестр.
- •Введение в объектно-ориентированное программирование (ооп)
- •Идеологический обзор
- •Базовые принципы ооп
- •Наследование имён. Наследование значений.
- •Коллизия
- •Что такое имя процедуры?
- •Ооп как оперирование типами
- •Именование типов в c# Тип данных «класс»
- •Конструкторы и деструкторы
- •И нкапсуляция данных
- •Наследование (краткое введение)
- •Наследование реализации как уточнение семантики типа
- •Пополнение и переопределение методов Отношение пополнения интерфейса
- •Открытие реализации для проектирования классов - опция protected
- •Полиморфизм Полиморфизм как уточнение семантики типа переменной
- •Динамические методы как поддержка полиморфизма- опции static, virtual, override
- •Событийное программирование Обработка событий
- •Идея: Когда что-то вставляется, срабатывает некоторый предикат. Например, после вызывается команда проверки, каскадного удаления или какая-нибудь другая команда. Генераторы и приёмники сообщений
- •Событийное программирование нужно:
- •Событийный стиль в процедурном программировании - управление данными (на примере)
- •Событийное программирование в c# (delegate, event)
- •Введение в компонентное программирование
- •Объекты, реализующие интерфейсы
- •Частный случай общей проблемы взаимодействия программного обеспечения разных производителей на уровне исполняемого кода
- •Базовый интерфейс компонент
- •Проблема множественности иерархий
- •Коллизия имён
- •Коллизия реализации
- •«Симметричное» решение – агрегаты (декартовы произведения классов)
- •Множественное наследование
- •«Асимметричное» решение - именованные интерфейсы
- •Основные отличия интерфейса и абстрактного класса
- •Наследование интерфейса (компонентный подход)
- •Обработка исключений в ооп
- •Определение и генерация исключений в c#
- •Выбрасывание исключений
- •Захват исключения
- •Блок finally
- •Коды программ
Событийное программирование Обработка событий
Интуитивно, событие (event) – это случай, факт изменения, который всегда можно трактовать как изменение состояния.
Идея событийного программирования отнюдь не нова:
Понятие автомата - поведение как реакция на события. Автомат реагирует, когда поступает поток входных сигналов, изменяя при этом собственные состояния и выдавая что-то на выход.
Событием является сам вызов функции.
Стоит упомянуть о теореме об универсальной функции:
Теорема об универсальной функции заключается в том, что любая программа может быть записана в один цикл, в котором каждый раз проверяется наличие (истинность) некоторого предиката.
Нужно отметить, что на каждый предикат подвешено действие, которое должно выполниться. Это называется охраняемой командой.
С позиции теоремы о нормальной форме любые две программы отличаются только набором охраняемых команд, т.е. цикл обработки событий фиксирован.
Триггер - «спусковой крючок»- процедура, отличающаяся от обычной функции тем, что это команда, которая срабатывает до наступления какого-нибудь события, в силу истинности какого-нибудь предиката постоянно проверяется (идея охраняемой команды).
Триггеры
Удаления Вставки
Идея: Когда что-то вставляется, срабатывает некоторый предикат. Например, после вызывается команда проверки, каскадного удаления или какая-нибудь другая команда. Генераторы и приёмники сообщений
Событие – это вызов метода. Обработка события заключается в кратном вызове процедур.
Сообщение – это передаваемые параметры.
Слушатель - приёмник – это вызываемый объект.
Говорящий - отправитель – это тот, кто вызывает.
Событийное программирование нужно:
- с одной стороны, для описания коммуникаций общего вида между людьми, программными или техническими системами
- с другой стороны, для реализации – 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
Замечание:
Применяются они к одному и тому же списку параметров => параметры должны быть однотипными.
Замечание:
Фактически, это просто вызов, который где-то стоит и где-то «стреляет» (вызывается несколько методов с одним и тем же списком параметров).
Вводится новое понятие:
Функциональный тип- указатель на функцию (метод, процедуру), которая привязана к объекту.