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

Всегда есть потеря на jmp;

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


Читайте также:
  1. B.) Поломка и потеря оружия
  2. VIII. Почему массы во все лезут и всегда с насилием?
  3. VIII. Почему массы во все лезут и всегда с насилием?.
  4. VIII. ПОЧЕМУ МАССЫ ВТОРГАЮТСЯ ВСЮДУ, ВО ВСЕ И ВСЕГДА НЕ ИНАЧЕ КАК
  5. Будь мудрой, и мужчина навсегда останется в твоих руках. Целую, моя девочка, и надеюсь на встречу в июне.
  6. В английском предложение ВСЕГДА должен быть ГЛАГОЛ!
  7. В безлимитной игре вам нужно быть очень осторожным, чтобы не потерять все свои фишки в поте, который не был увеличен рэйзом.

Требует генерации специального кода компилятором. Процедура не м.б. слишком короткой (только ret на перехват).


В современных микропроцессорах за счет кэширования производительность увеличивается.

Расширение данных

Задача: модули А, В, С. В и С импортируют А. А имеет множество объектных типов. При загрузке В и С требуется доопределить поля данных в объектах, не приостанавливая их работу. 3 разных производителя, А не дает модифицировать код, В и С не знают друг о друге.

MODULE Network

TYPE

Socket* = POINTER TO RECORD

END;

PROCEDURE Send* (S: Socket; Data: String)

BEGIN

END

END Network;

Module NetworkMonitor

Import Network;

TYPE SocketStat = POINTER TO RECORD

CurrentSpeed: INTEGER;

END;

PROCEDURE Network Send+ (S: Network.Socket; Data: String);

Var Stat: SocketStat;

BEGIN

BASE(S, Data);

Stat:= FindSocketStat(S);

Stat.CurrentSpeed:= …;

END;

END NetworkMonitor;

TYPE SocketStat = POINTER TO RECORD (Socket)

END;

PROCEDURE … (S:Network.Socket; Data: String);

BEGIN

BASE(S,Data);

S(SocketStat).CurrentSpeed:= …;
END;

В модуле Network создаются экземпляры типа Socket, а не SocketStat. Чтобы создать экземпляр нового типа, нужно использовать паттерны (Factory Pattern).

Если расширяющих модулей несколько и все они создают свои типы на основе типа Socket, то Factory Method не работает.

Ассоциирование данных

MODULE NetworkMonitor;

Var SocketStatCollection: …;

PROCEDURE Network Send+ (S, Data)

BEGIN

BASE(S, DATA);

FindSocketStat(S).CurrentSpeed;
END;

Минусы: высокая трудоемкость (поддерживать ассоциацию при create и удалении первичных объектов). При уничтожении socket нужно уничтожить socketstat. => снижение надежности, уменьшение производительности, необходимость синхронизации – при доступе к таблицам поиска необходимо синхронизировать потоки;

РЕШЕНИЕ: дополнение типов данных.

MODULE NetworkMonitor;

IMPORT Network;

TYPE

SocketStat = POINTER TO RECORD EXTENSION Network.Socket

END;

PROCEDURE NetworkSend+ (…)

BEGIN
BASE(S,Data);

S[SocketStat].CurrentSpeed;

END;

Реализация: 1) дополнение расширяет все экземпляры определенного типа данных;

2) память под дополнение выделяются на летупри первом обращении к объекту;

Дополнения можно использовать только для данных, которые находятся в динамической памяти;

4) ортогональны «наследованию», могут создаваться в любом количестве и для любого типа данных в иерархии;

Эти методы позволяют:

Упростить создание, сопровождение и развитие расширяемых систем;

Повысить надежность;

Повысить производительность;


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


<== предыдущая страница | следующая страница ==>
Желательно встроить средства расширения в язык.| Component Pascal

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