
- •1. Понятие модуля. Принципы модульного программирования. Понятие объекта как динамического модуля.
- •2. Понятие класса. Понятие метода. Представление метода в виде обычной процедуры. Понятие конструктора и деструктора.
- •3. Понятие свойства. Методы получения и установки значений свойств. Свойства-массивы (в некоторых языках программирования). Индексаторы (в некоторых языках программирования).
- •Информация о типе времени выполнения программы
- •5. Классы в программных модулях. Атрибуты доступа к элементам объектов. Термин «инкапсуляция».
- •Термин «инкапсуляция»
- •Virtual – в базовом классе
- •7. Понятие ссылки на метод объекта (или делегата – в зависимости от языка программирования). Понятие события. Применение ссылок на методы для расширения объектов.
- •8. Понятие метакласса (в некоторых языках программирования). Методы, применяемые к классам. Виртуальные конструкторы (в некоторых языках).
- •Понятие метакласса (в некоторых языках программирования)
- •Виртуальные конструкторы (в некоторых языках)
- •3) Finally – вызвать free.
- •Если глобально-уникальный идентификатор назначается интерфейсу, то он записывается после ключевого слова interface и заключается в квадратные скобки, например:
- •Microsoft Visual Studio
- •Import Network;
- •Var Stat: SocketStat;
- •Var SocketStatCollection: … ;
- •Конструкторы и деструкторы
- •Стандартные конструкторы
- •Создание объектов по значению (на стеке) и по ссылке (в динамической памяти)
- •Операторы new и delete
- •Размещающий оператор new
- •Порядок конструирования и разрушения объектов
- •Вложенные определения классов
- •«Друзья» класса
- •Статические члены класса
- •19. Перегрузка бинарных операторов. Перегрузка унарных операторов. Перегрузка операторов преобразования типа.
- •Индексаторы
- •Механизм вызова событий
- •Создание пользовательских обобщенных коллекций
- •Создание обобщенных интерфейсов
- •Несколько слов о вложенных делегатах
- •25. Понятие итератора в языке c#. Оператор foreach. Оператор yield.
- •И напоследок... Блок finally
- •26. Понятие атрибутов в языке c#. Создание пользовательских атрибутов. Анализ атрибутов во время выполнения программы. Понятие рефлексии (reflection) в языке c#. Сериализация объектов.
- •Что такое метаданные и зачем они нужны?
- •1. Метаданные в .Net обязательны и универсальны.
- •2. Метаданные в .Net общедоступны.
- •3. Метаданные в .Net исчерпывающи.
- •4. Метаданные в .Net расширяемы.
- •5. Метаданные в .Net конструируемы программно.
- •Получение экземпляра класса Type
- •Динамическая загрузка сборок
- •Динамическая загрузка типов
- •Исследование типа
- •Характеристики типа как целого
- •Члены класса
- •Исследование объекта
- •Динамическое создание объекта и вызов методов
- •Создание объекта по его типу
- •Декларативное программирование
- •Новые механизмы абстракции?
- •Динамическое создание типов
- •Роль графов объектов
- •Formatter сериализации
- •XmlSerializer
- •Интерфейсы iFormatter и iRemotingFormatter
- •Точность типов среди форматеров
- •28*. Ооп в языке программирования Smalltalk. Достоинства и недостатки этого языка в сравнениии с языком программирования c#.
Microsoft Visual Studio
История Visual Studio начинается с 1997 года. Это довольно ценный набор инструментов для программиста. Visual Studio был создан разработчиками корпорации Microsoft.
Microsoft разработали свою модель компонентов MFL (Microsoft Foundation Library), которая является конкурентом модели VCL, которая используется в Delphi и Builder.
О Visual Studio можно говорить как о полнофункциональном наборе продуктов для разработки и программирования в Windows. Visual Studio может использоваться для создания обычных, традиционных клиентских приложений, так и для интернет-приложений. По возможностям Visual Studio ничем не уступает продуктам Borland. Однако каждый из них имеет свои достоинства и недостатки. И для каждого программиста они индивидуальны. Кому-то важна VCL с богатым выбором функционала, а для кого-то – быстродействующая и мощная MFC.
Существует еще одна платформа для разработки программного обеспечения от Microsoft — .NET, которая ориентирована на Web-разработки. Для этой платформы была создана отдельная спецификация языка программирования – С#.
12. Понятие расширяемой программы и расширяемого программирования. Принципы расширяемого программирования. Применение методологии объектно-ориентированного программирования для построения расширяемых программ. Языки программирования Никлауса Вирта: Oberon, ComponentPascal.
Понятие расширяемой программы и расширяемого программирования
Расширяемое программирование – возможность конструирования таких иерархий модулей, когда каждый модуль добавляет новую функциональность в систему. Другие модули изменяться не должны, их даже не нужно перекомпилировать.
Расширяемая система – система, в которую можно добавить новый модуль, а когда он начнет плохо себя вести, то его можно выбросить без ущерба для системы.
Созданный и отлаженный модуль не изменяется.
Расширение программ обеспечивается механизмами расширения.
Принципы расширяемого программирования
Сторонний разработчик добавляет функционал:
1) без привлечения разработчиков;
2) без модификации исходных кодов;
3) без перекомпиляции, переустановки и перезагрузки;
4) без согласования с другими разработчиками.
Примеры: MS Word, Visual Studio, Ecclipse, IE, OS (drivers, services…)
Применение методологии объектно-ориентированного программирования для построения расширяемых программ
Желательно встроить средства расширения в язык.
Расширение:
1) кода – новый модуль изменяет работу процедур существующих модулей;
2) данных – новый модуль добавляет к существующим объектам новые свойства;
Расширение кода.
1) Постановка задачи: Существуют модули A, B, C. В и С импортируют А. В В и С нужно изменить работу модуля А, если А изменять нельзя, В и С ничего не знают друг о друге.
2) Решения:
А) процедурные переменные – традиционное решение. В ООП процедурные переменные скрываются в таблицах виртуальных методов.
MODULE A
Procedure Insert* (S:string); * – public-процедура
Var InsertEvent* : PROCEDURE (S: string)
MODULE B import A
Procedure OnInsert(s: string)
Begin End;
Проблемы: 1) затраты на дизайн; (register/unregister для поддержки некоторых обработчиков, возможость отметы вставки, синхронизация при доступе из разных потоков)
2) разрыв контекста (beforeInsert, afterInsert. Перехватываются обе процедуры. А если несколько потоков? Разные процедуры должны работать с 1м контекстом)
3) нарушение инварианта var InsertInProgress (B.Insert – true, A.Insert – false)
В случае исключения переменная InsertInProgress остается в неправильном состоянии. Нарушение инварианта – следствие нарушения контектса.
4) скрытая рекурсия.
Insert* (s: string)
Begin
InsertIvent(S) – м.б. неявная рекурсия
End;
Рекурсия м.б. недопустима, но компилятор обладает недостаточной информацией. A.Insert(s).
5) Выгрузка модулей. Если модуль нужно выгрузить, возможно ли дать ОС команду «выгрузить модуль»? Нет, т.к. он может иметь ссылки с других модулей. Сама система не может удалить модель, не имеет права его выбросить.
Решение всех указанных проблем – переопределение процедур.
MODULE A; MODULE B
PROCEDURE Insert* (S:string); IMPORT A;
BEGIN PROCEDURE A.Insert+ (S:string);
… BEGIN
END; …
… BASE(s);
END A. …
END;
END B.
Реализация: 1) перенастройка адресов (при загрузке модуля реализации В. Старое значение нужно сохранить в переменной);
2) вызов через процедурную переменную – для всех процедур модуля объявляется неявная переменная, модуль переопределяет процедуры;
3) процедура-переходник. Делается вызов процедуры-переходника, которая вызовет функцию через процедурную переменную, переходник сделает jmp. Перехват – изменение переменных, через которые делается вызов;
4) замена кода процедуры по месту. В 1х инструкциях сделать jmp на свою процедуру.
5) .NET компиляция происходит в промежуточный язык (полностью лишен недостатков). За счет представления программы в промежуточном языке можно осуществить перехват.
Минусы:
1) сначала нужно пройтись по всему коду – затраты времени;
2) все вызовы косвенные – потеря производительности;
3) всегда есть потеря на jmp;
4) требует генерации специального кода компилятором. Процедура не м.б. слишком короткой (только ret на перехват).
В современных микропроцессорах за счет кэширования производительность увеличивается.
Расширение данных
Задача: модули А, В, С. В и С импортируют А. А имеет множество объектных типов. При загрузке В и С требуется доопределить поля данных в объектах, не приостанавливая их работу. 3 разных производителя, А не дает модифицировать код, В и С не знают друг о друге.
MODULE Network
TYPE
Socket* = POINTER TO RECORD
…
END;
PROCEDURE Send* (S: Socket; Data: String)
BEGIN
…
END
END Network;
Module NetworkMonitor