Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Желательно встроить средства расширения в язык.

В тот момент, когда управление передается на Except, в программе считается, что ошибка обработана. | Для возврата по try используется стек вызова процедур. | Приемы надежного программирования | Описание интерфейса | Механизм подсчета ссылок в интерфейсах | Reader._AddRef | Представление интерфейса в памяти | Применение интерфейса для доступа к объекту динамически-подключаемой библиотеки | Понятие компонента | Понятие визуального программирования |


Читайте также:
  1. GR: основная цель, задачи и средства GR-менеджера
  2. I. Отметить противоглистные средства
  3. III. Радиорелейные средства связи
  4. OKCP 1. Письменный перевод статьи с русского языка на английский язык.
  5. Автоматизация проектирования программного обеспечения. Методы и средства структурного системного анализа и проектирования.
  6. АЛКОГОЛЬ, ТАБАК И ИНЫЕ СРЕДСТВА ВОЗДЕЙСТВИЯ НА ГЕНОФОНД И ПСИХИКУ ЧЕЛОВЕКА КАК ГЛОБАЛЬНОЕ СРЕДСТВО УПРАВЛЕНИЯ
  7. Антиаритмические средства

Расширение:

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 остается в неправильном состоянии. Нарушение инварианта – следствие нарушения контектса.

Скрытая рекурсия.

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. Перехват – изменение переменных, через которые делается вызов;

Замена кода процедуры по месту. В 1х инструкциях сделать jmp на свою процедуру.

NET компиляция происходит в промежуточный язык (полностью лишен недостатков). За счет представления программы в промежуточном языке можно осуществить перехват.

Минусы:

1) сначала нужно пройтись по всему коду – затраты времени;

2) все вызовы косвенные – потеря производительности;


Дата добавления: 2015-11-16; просмотров: 56 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Microsoft Visual Studio| Всегда есть потеря на jmp;

mybiblioteka.su - 2015-2024 год. (0.005 сек.)