Читайте также:
|
|
Требует генерации специального кода компилятором. Процедура не м.б. слишком короткой (только 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 |