Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
62
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

Глава 59

Крупные проекты

Структура модуля

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

Прежде всего, уточним структуру модуля. Из рис. 148 следует, что она схожа со структурой программы. В состав модуля, по мере необходимости, включаются те же самые персонажи: константы, типы данных, переменные, процедуры и функции. Всё это может располагаться в одной из двух секций. То, что требует экспорта, выставляют напоказ в секции интерфейса, а остальное прячут в секции реализации. Что касается процедур и функций, то в секцию интерфейса выносят при необходимости лишь копии их заголовков, а сами подпрограммы поселяют в секции реализации. Константы, типы и переменные, объявленные в секции интерфейса, в секции реализации не повторяют.

О совпадении имен

Настало время ответить на отложенный вопрос: зачем прятать часть модуля, почему бы не выставить всё напоказ? На это есть две причины, и обе веские.

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

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

Но хуже, если программа скомпилируется! В этом состоит вторая причина сокрытия лишних имен. Если компилятор найдет искомое, но не в том модуле, в котором вы предполагали — то-то будет морока с отладкой!

Отсюда вывод: не выставляйте напоказ ничего лишнего, будьте скромнее, — так поступают профессионалы. И всё же полностью исключить нежелательное совпадение имен удается не всегда. Как быть? Выход есть — используйте префикс с именем модуля. Префикс — это приставка перед идентификатором, отделяемая от него точкой. Например, в главной программе нашего проекта вызовы процедур можно записать так.

490

Глава 59

Крупные проекты

MyLibr.Push(S);

while MyLibr.Pop(S) do . . .

Этим мы подсказали компилятору, что процедуры Push и Pop берутся из

модуля MyLibr и боле ниоткуда.

 

 

 

Имя библиотечного модуля

unit . . .

 

 

 

 

Секция ИНТЕРФЕЙСА.

interface

 

Содержит константы, описания типов,

uses

. . .

объявления переменных, а также заголовки

процедур и функций, видимые за пределами

 

 

const

. . .

модуля

type

. . .

 

var

. . .

 

procedure . . .

 

function

. . .

 

implementation

Секция РЕАЛИЗАЦИИ.

Содержит константы, описания типов,

 

 

uses

. . .

объявления переменных, а также

const

. . .

процедуры и функции.

 

type

. . .

 

var

. . .

 

procedure . . .

 

function

. . .

 

 

 

Секция ИНИЦИАЛИЗАЦИИ.

 

 

Содержит операторы, выполняемые при

begin

 

запуске программы.

. . .

 

 

end.

 

 

 

Рис. 148 – Общая структура библиотечного модуля

Модуль, указанный в префиксе, должен упоминаться в списке USES. Но есть одно исключение — это модуль по имени SYSTEM. В этом библиотечном модуле собраны процедуры и функции, встроенные в Паскаль. Модуль SYSTEM в списке USES никогда не упоминают.

491

Глава 59

Крупные проекты

Иногда программисты называют свои процедуры и функции так же, как встроенные в модуль SYSTEM, — это не запрещено. И тогда для уточнения имен пользуются префиксами с именами библиотек, например:

System.Writeln(F);

{

стандартная процедура }

MyModule.Writeln(S);

{

моя «самоделка» }

 

 

 

Завершая обзор структуры модуля, обратим внимание на необязательные списки импорта USES в секциях интерфейса и реализации (рис. 148). Через эти списки библиотечный модуль импортирует нужные ему элементы из других модулей. Составляя списки, следуйте простому правилу: если внешний модуль требуется только в секции реализации, упоминайте его в списке USES секции реализации, а иначе — в секции интерфейса. Упоминать модуль в обоих списках нельзя. А когда импортировать нечего, список импорта не вставляют.

Сборочный цех

Оглядев структуру модуля, войдем теперь в сборочный цех IDE и рассмотрим порядок соединения модулей в единую программу — исполняемый файл.

 

Пользовательские

 

 

 

 

Пользовательские

 

 

 

 

 

 

 

 

 

 

 

 

 

 

библиотечные модули

 

 

 

 

 

 

 

библиотечные модули

 

 

 

 

 

 

 

 

 

 

 

 

(

формат PAS)

 

 

 

 

(

формат TPU)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

F9, Alt+F9

F9

 

 

 

F9

 

Первичный модуль с

 

 

Исполняемый EXE-файл

 

 

 

главной программой

 

 

 

 

(формат PAS)

 

 

 

 

 

 

 

 

 

 

 

 

 

F9

Компиляция отдельных модулей (F9 или Alt+F9)

Поставляемые Компиляция и сборка программы («F9») библиотечные модули

(формат TPU)

Рис. 149 – «Цех» компиляции и сборки проекта

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

492

Глава 59

Крупные проекты

используемого компилятора. Так, для Borland Pascal файлы получат расширение TPU (это сокращение от «Turbo Pascal Unit»). Для Free Pascal это будут пары файлов с расширениями O и PPU. Модули можно компилировать как по отдельности, так и вместе со всем проектом. Рассмотрим оба случая.

Для компиляции отдельного модуля откройте его в редакторе и нажмите сочетание Alt+F9, или выберите пункт меню Compile à Compile. Компилятор выполнит свою обычную работу по проверке ошибок и, при отсутствии таковых, сформирует библиотечный файл. На экране появится сообщение об успешной компиляции (рис. 150).

Рис. 150 – Сообщение об успешной компиляции модуля

Если же выявятся синтаксические ошибки, вам придется устранить их.

Модули компилируются и в ходе сборки проекта. При нажатии клавиши F9 (или при выборе в меню Compile à Make) компилятор просматривает списки импорта USES как в главной программе, так и в модулях. Обнаружив очередной модуль, компилятор сравнивает время редакции его исходного файла (PAS) со временем создания откомпилированного файла. Если исходный файл оказался свежее откомпилированного или последний пока не существует, то модуль компилируется. Так или иначе, но перед сборкой проекта все его модули будут скомпилированы. Только после удачной компиляции первичного файла и всех связанных с ним модулей создаётся исполняемый EXE-файл.

Фирменные библиотеки

Яуже упоминал о библиотеках, входящих в состав IDE, — они поставляются

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

493

Соседние файлы в папке delphi