Interface

End.

Interface

Лекции 17-19: Модули и их использование.

1. Концепция модуля.

2. Структура описания модуля.

3. Разработка модулей.

4. Примеры модулей.

5. Использование модулей в программах.

6. Стандартный модуль СRT.

7. Стандартный модуль GRAPH.

1. Концепция модуля.

Рассмотренный ранее механизм подпрограмм (процедур и функций) действует только внутри одной программы. Поэтому такие процедуры и функции называются внутренними подпрограммами. Ограниченность применения внутренних подпрограмм очевидна. Весьма желательно иметь возможность эффективного использования одной и той же подпрограммы во многих программах без её повторного описания. Это, в частности, совершенно необходимо для стандартных подпрограмм. Турбо Паскаль и предоставляет такую возможность за счёт введения модулей как вида программных структур.

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

Понятие модуля отсутствовало в Паскале и в первоначальных версиях Турбо Паскаля. Оно было введено в связи с потребностями коммерческих приложений Турбо Паскаля. Разработанная для Турбо Паскаля концепция модуля зарекомендовала себя как весьма удачная и плодотворная. Модули представляют удобный инструмент для создания библиотек прикладных программ. Этот инструмент получил также широкие приложения в объектно-ориентированном программировании.

 

2. Структура описания модуля.

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

unit <имя модуля >;

<описания компонентов модуля >

[implementation

<реализация тел процедур и функций >]

[begin

< операторы инициализирующей части >]

Заголовок модуля включает ключевое слово unitи имя модуля (желательно, чтобы оно совпадало с именем файла, хранящего текст модуля). Имя модуля служит средством связи модуля с использующей его программой. Такая связь устанавливается специальным описанием, помещаемым в начале раздела описаний программы, в которой используются данные модули:

uses <список имён используемых модулей >;

Интерфейс является видимой частью модуля, в которой описаны все представленные в модуле компоненты, предназначенные для экспорта в программы. При этом процедуры и функции описываются только своими заголовками, остальные компоненты описываются точно в такой же форме, как и в разделе описаний программы. Интерфейс начинается ключевым словом interfaceи заканчивается ключевым словом implementation(или beginили endпри отсутствии исполняемой части). Интерфейс является обязательным разделом описания модуля.

Исполняемая часть содержит так называемые тела процедур и функций, заголовки которых описаны в интерфейсной части. Тела имеют обычную форму описаний процедур и функций, либо могут отличаться от таковой только сокращенными заголовками, состоящими лишь из ключевого слова procedureили functionи имени процедуры (функции). Исполняемая часть является как бы "невидимой" для пользователя частью модуля, поскольку пользователю модуля нет необходимости знать, как реализованы процедуры или функции, которыми он пользуется. Ему достаточно лишь знать, как их вызывать и какую функцию они выполняют. Исполняемая часть отсутствует, если в модуле не описаны процедуры и/или функции.

Инициализирующая часть завершает описание модуля и является необязательной частью модуля. Если она присутствует, то помещается между скобками begin end, если отсутствует - то остаётся только закрывающая модуль скобка end и последующая точка.

Назначением инициализирующей части является выполнение начальных действий при подключении модуля к исполняемой программе. Такие действия составляют некоторый фрагмент программы, выполняемый непосредственно перед передачей управления основной программе (в которой имеется обращение к модулю описанием uses). Обычно инициализирующие действия подготавливают нормальную работу программы. Например, инициализируют переменные начальными значениями, открывают файлы, устанавливают связь с коммуникационными средствами и др.

В интерфейсной или исполняемой частях можно использовать другие модули, подключаемые описанием uses, которое должно следовать непосредственно за ключевыми словами interfaceили implementation. В исполняемой части можно также использовать локальные имена (типов, констант, переменных и т.д.), относящиеся к инициализирующей части модуля.

 

3. Разработка модулей.

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

А) Создание текста модуля. Текст модуля подобен тексту программы, поэтому к его разработке применима в целом та же методика, что и для разработки программ с подпрограммами.

Б) Компиляция и отладка модуля. Для использования разработанного модуля (в том числе и для его отладки на программах-примерах) необходимо получить откомпилированный код модуля. Эта операция легко выполняется с помощью интегрированной среды Турбо Паскаля. Результатом компиляции модуля является одноименный с модулем файл с расширением tpu (сокращение от TURBO PASCAL Unit). Этот файл следует поместить в папку, доступную при компиляции.

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

4. Примеры модулей.

Приведем примеры разработанных модулей на Турбо Паскале.

Примером простого модуля является модуль points, содержащий некоторые подпрограммы работы с точками на плоскости, константу null - начало координат, а также тип point, представляющий координаты точки. Инициализирующая часть модуля содержит оператор randomize. Тестом этого модуля является программа test_points.

UNIT points;{Точки на плоскости}

type point = array[1..2] of real;{координаты точки}

const null:point =(0,0);{начало координат}

procedure rpoint(var x:point); {случайная точка}

procedure r(x:point;var d:real);{расстояние точки х от null}

function dist(x,y:point):real;{расстояние между точками x и y}

function line(x,y,z:point):Boolean;{точки x,y,z на одной прямой}