78
12.6. Модули и техните версии
{- записване на лентов маркер }
procedure write_buff(No: shortcard; const buff; size: natiral);
{ записване на буфер (buff) с дължина size }
procedure read_buff(No: shortcard; var buff; var size: natural);
{- прочитане от лентата на блок в buff, дължината е в size }
end { Tape };
След като този модул е заработил и се използва от няколко програми, чиито
изходен текст може и да е неизвестен, ако са писани от други програмисти, може да
се наложи да се правят поправки и изменения в реализационната част на модула, за да
се поддържат друг вид лентови устройства. Докато изменението се прави само в
реализационната част на модула, програмите които го използват, ще работят и с
прекомпилираната реализация. Но може да се наложи добавянето на нова процедура,
например за четене на блок в обратна посока:
procedure read_back(tape_no: shortcard; var buff; var size: natural);
{- прочитане от лентата на блок в обратна посока }
За такава промяна в модула е необходима промяна в неговата описателна част.
Но ако се смени описанието на модула, с добавянето на тази процедура, ще трябва да
се прекомпилират всички програми, които го използват (освен ако специално заради
тези от тях, чиито изходен текст е неизвестен, се пази стария вариант и ако стария
вариант може да работи с новия тип лентови устройства).
В UniPascal е възможно да се добавят нови възможности (декларации на обекти)
към описателната част на модула (както в дадения пример), без да се прекомпилират
програмите, които вече използват този модул. Това се прави, като се укаже номер на
версията на модула, оградена в скоби след идентификатора му в описателната част
(реализационната част може да се прекомпилира без това да налага прекомпилация на
други модули). Например:
interface unit Tape (2);
procedure rewind(tape_no: shortcard);
{- пренавиване на лентата }
procedure write_TM(tape_no: shortcard);
{- записване на лентов маркер }
procedure write_buff(tape_no: shortcard; const buff; size: natiral);
{ записване на буфер (buff) с дължина size }
procedure read_buff(tape_no: shortcard; var buff; var size: natural);
{- прочитане от лентата на блок в buff, дължината е в size }
{=== добавено във версия 2: ===}
procedure read_back(tape_no: shortcard; var buff; var size: natural);
{- прочитане от лентата на блок в обратна посока }
end { Tape };
Всички версии на даден модул са съвместими в строго възходящ ред, т.е. версия
2 е съвместима с версия 3, версия 3 - с 4 и т.н., но версия 7 не е съвместима с 6 или с
версия със същия номер 7, но компилирана отново. Не е необходимо номерата на
версиите на модула да бъдат последователни, т.е. след версия 1 може да следва версия
10, след нея версия 50 и т.н. Компилаторът не проверява дали наистина новата версия е
реално съвместима със старата. Ако в горния пример процедурата READ_BACK бъде
описана първа, модулът ще бъде реално (на практика) несъвместим със предната си
версия. 
<<  <  GO  >  >>

Вернуться к началу сайта