Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_answers (1).docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
2.9 Mб
Скачать

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.Inserttrue, A.Insertfalse)

В случае исключения переменная 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]