Стандартная библиотека DAQ PASCAL


Концепция библиотеки и ее состав

   С появлением в языке DAQ PASCAL включаемых по директиве {$I FILE.INC} файлов стало понятно, что появилась хорошая возможность сократить код прикладных программ и повысить его стабильность за счет использования стандартных библиотек включаемых файлов. Поэтому была создана стандартная библиотека включаемых файлов для прикладных программ DAQ PASCAL. Есть шаблон программы, поясняющий, как правильно ее использовать.

   Предполагается, что постепенно большинство прикладных программ будут создаваться на основе этой библиотеки путем включения в программу нужных библиотек и модулей. Это резко (в 2-3 раза) сократит объем прикладного кода, а также понизит вероятность ошибок в прикладных программах за счет отделения стандартного, хорошо провереного кода от прикладного. Здесь описана структура этой библиотеки.

   Начнем с того, что библиотека основана на концепции модуля - условной программной единицы, со строго оговоренным порядком подключания и использования в прикладной программе. Модули unit, как в Delphi, реализуют идею раздельно компилируемых модулей на уровне компилятора. Включаемые файлы, к сожалению, не могут в полной мере реализовать такие же возможности. Однако с их помощью можно смоделировать модульную структуру программ, если дополнить включаемые файлы набором жестких соглашений. Именно так построена описываемая библиотека.

   Программа DAQ PASCAL имеет жесткую структуру program: сначала идут описания констант (const), типов (type), переменных (var), процедур (procedure) и функций (function), затем тело основной программы:

   program demo;
   
   const ...
   
   type ...
   
   var ...
   
   procedure ...
   function ...
   procedure ...
   function ...
   
   begin
    ...
   end.
  

   Эта жесткая структура несколько затрудняет использование включаемых файлов в качестве модулей. Ведь получается, что расположить код модуля в одном месте нельзя: он "расползается" как минимум на три части - описание констант, переменных и функций. Кроме того, используемые переменные и используемые ресурсы бывает необходимо инициализировать, а при завершении работы - освобождать.

   Поэтому были введены такие правила для стандартных модулей:

  1. Стандартные библиотеки имеют имена, начинающиеся со знака подчеркивания "_".

  2. Запрещено использовать файлы, начинающиеся со знака подчеркивания, в пользовательских библиотеках, создаваемых прикладными программистами для своих целей. Это чтобы не путать код прикладных и стандартных библиотек.

  3. Каждый стандартный модуль (для примера его имя будет StdDemos) должен содержать минимум три файла:
    1. ) _con_StdDemos - описание констант, помещаемое в секции const.
    2. ) _var_StdDemos - описание переменных, помещаемое в секции var.
    3. ) _fun_StdDemos - описание функций, помещаемое после var и перед основным begin.

    Эти файлы должны присутствовать, даже если они пустые.

  4. При необходимости также создается файл с описанием типов:
    1. ) _typ_StdDemos - описание типов, помещаемое в секции type.

    Это очень редко используемая возможность, поэтому она считается необязательной.
    При описании переменных лучше использовать неявное описание типов, это позволит избежать необоснованного включения файла с описанием типов.
    Например: Monthes : array[1..12] of String;

  5. В файле функций модуля должно содержаться как минимум четыре процедуры (даже если они пустые):
    1. ClearStdDemos - процедура очистки строк, помещаемая в процедуре ClearStrings.
    2. InitStdDemos - процедура инициализации, помещаемая в секции Starting.
    3. FreeStdDemos - процедура завершения, помещаемая в секции Stopping.
    4. PollStdDemos - процедура опроса в цикле обработки, помещаемая в секции Polling.

  6. Код прикладной программы обязан вызывать функции очистки, инициализации, завершения и опроса, даже если эти процедуры пустые. Ведь в следующей версии библиотеки эти процедуры могут оказаться совершенно необходимыми. Чтобы не пришлось потом менять прикладной программный код, эти функции надо вызывать в любом случае.

  7. При наличии нескольких модулей эти процедуры Init/Free должны вызываться в "стековом" порядке, то есть порядок завершения обратный по отношению к порядку инициализации.

  8. При наличии зависимостей между модулями первыми идут независимые модули, затем зависимые.

  9. Порядок следования модулей при включении в секции констант, переменных и функций должен быть одинаковым. Так будет легче следить за структурой программы.

  10. Порядок очистки, инициализации и опроса (вызовов Clear, Init, Poll) должен повторять порядок включения модулей. Порядок завершения (Free), как уже сказано - обратный.

   Пример:

   program Demos;
   const
    {$I _con_StdDemos1}
    {$I _con_StdDemos2}
    {$I _con_StdDemos3}
    ...
   type
    {$I _typ_StdDemos1}
    ...
    var
    {$I _var_StdDemos1}
    {$I _var_StdDemos2}
    {$I _var_StdDemos3}
    ...
    {$I _fun_StdDemos1}
    {$I _fun_StdDemos2}
    {$I _fun_StdDemos3}
    ...
   begin
    if Starting then begin
     InitStdLibrary;
     ClearStrings;
     InitStdDemos1;
     InitStdDemos2;
     InitStdDemos3;
     ...
     if CheckStdErrors
     then Success('Start Ok.')
     else Trouble('Start Fails.');
    end else
    if Stopping then begin
     ...
     FreeStdDemos3;
     FreeStdDemos2;
     FreeStdDemos1;
     ClearStrings;
     FreeStdLibrary;
    end else
    if Ok then begin
     while StdIn_Readln(StdIn_Line) do StdIn_Process(StdIn_Line);
     PollStdLibrary;
     PollStdDemos1;
     PollStdDemos2;
     PollStdDemos3;
     ...
    end;
   end.
  

   Смотрите также шаблон программы, в котором включены все имеющиеся модули.

Оглавление



Состав стандартной библиотеки DAQ PASCAL