Шаг 63.
Модуль. Общие понятия и структура

    На этом шаге мы начинаем знакомиться с модулями. Здесь даются общие сведения о модулях и приводится его структура.

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

   

    В языке Turbo Pascal модуль (Unit) по определению считается отдельной программой. Если подпрограмма является структурным элементом Pascal-программы и не может существовать вне ее, то модуль представляет собой отдельно хранимую и независимо компилируемую единицу.

    В самом общем виде модуль представляет собой совокупность программных ресурсов, предназначенных для использования другими модулями и программами. Под ресурсами в данном случае понимаются любые программные объекты языка Turbo Pascal - константы, типы, переменные, подпрограммы. Модуль сам по себе не является выполняемой программой - его объекты используются другими программными единицами.

    Все программные ресурсы модуля можно разбить на две части:

    В соответствии с этим модуль, кроме заголовка, имеет две основные части, называемые интерфейсом и реализацией.

    В интерфейсной части модуля сосредоточены описания объектов, доступных из других программ; такие объекты называют видимыми вне модуля. В части реализации помещаются рабочие объекты, называемые также невидимыми или скрытыми.

    Заголовок модуля составляется из служебного слова Unit и следующего за ним идентификатора, являющегося именем модуля:


     UNIT <имя модуля>;   .

    Интерфейсная часть начинается со служебного слова Interface, за которым следует совокупность обычных описаний. Часть реализации начинается служебным словом Implementation, за которым идут описания скрытых объектов. Завершает модуль, как и программу, служебное слово End с точкой.

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


     Unit <имя модуля>;
     Interface
             <Описания видимых объектов>
     Implementation
             <Описания скрытых объектов>
     Begin
             <Операторы инициализации объектов модуля>
     End.

    В интерфейсной части модуля представляются только заголовки процедур и функций, видимые (доступные) для других программ, а их полные описания будут содержаться в разделе реализации. При этом полное описание подпрограммы может иметь сокращенный заголовок, состоящий только из служебного слова Procedure или Function, имени подпрограммы и символа "точка с запятой".

    Таким образом, механизм модулей позволяет скрыть детали реализации тех или иных программных подсистем, предоставив в распоряжение использующих программ строго определенную совокупность интерфейсных объектов. При изменении реализации какой-либо процедуры, такая модификация никак не отразится на использующих ее программах (естественно, если интерфейс модуля при этом остается неизменным).

    В заключение приведем пример модуля, выводящего требуемую последовательность символов в заданное место экрана.

Unit Display;   {Содержит простую программу вывода на экран}
Interface {Интерфейсная часть}
    {Заголовок процедуры}
    Procedure WriteXY(X,Y: Integer; Message: String); 
Implementation {Раздел реализации}
Uses Crt; {Подключение модуля Crt для выполнения процедуры GotoXY}
    {Реализация процедуры}
    Procedure WriteXY(X,Y: Integer; Message: String);  
        Begin
           If (X in [1..80]) And (Y in [1..25]) Then
              Begin
                 GoToXY(X, Y);
                 Write(Message);
              End;
        End;
End. {Конец модуля}
Текст модуля можно взять здесь.

    Все модули хранятся в файлах с расширением TPU, имена которых совпадают с именами модулей. Для создания на диске файла с именем Display.tpu нужно выполнить компиляцию этого модуля (клавиши Alt+F9), предварительно установив опцию Compile/Distination/Disk.

    На следующем шаге мы посмотрим, как используются модули.


Предыдущий шаг Содержание Следующий шаг