Введение в программирование - Учебное пособие (Корочкин А. В.)

7.1 спецификация подпрограммы

Спецификация подпрограммы задаёт имя подпрограммы и всю необ­ходимую информацию о параметрах и результатах подпрограммы . Спецификация определяет соглашение о её вызове.

Информация о формальных параметрах процедуры задаёт вид и тип параметров. Вид параметра определяется ключевыми словами in, out, in out:

in - параметр подпрограммы рассматривается как входной, то есть является константой, и разрешается только его чтение;

out - параметр подпрограммы рассматривается как выходной, то есть является в процедуре переменной, и разрешается изменять его зна­чения;

In out - параметр является одновременно и входным и выходным, то есть рассматривается как переменная, значение которой можно чи­тать и изменять.

Если вид параметра явно не задан, то предполагается вид In.

Передача параметра в подпрограмму выполняется с использованием двух механизмов передачи : путем копирования ( by copy ) или путем вызовы ссылки ( by reference).

Формальные параметры при копировании должны иметь элементар­ный тип. При этом передача параметров осуществляется только перед и после выполнения подпрограммы.

Формальные параметры при использовании вызова ссылки должен быть производным от одного из следующих типов: •   тэгового типа;

•   задачного типа;

•   защищенного типа;

•   лимитированного типа ( но не личного );

•   составного типа с компонентами передаваемых через ссылку;

•   личного типа.

При этом передача параметра выполняется непосредственно при вы­зове ссылки.

Для параметров других типов механизм передачи не определен.

Описание параметра в спецификации подпрограммы может заканчи­ваться выражением. В этом случае говорят, что имеет место выражение по умолчанию (default_expression) для формального параметра ( только для вида in). При вызове подпрограммы с такими параметрами их можно опускать, при этом значение фактического параметра берется из выражения по умолчанию.

П   Пример спецификации подпрограмм:

procedure              Model_Train ;

procedure              Cat( Number: in out   Float);

procedure              Zt_lsk( X : in   Data; Y : out    Elem );

procedure              Sound (A, D, С :    in    Note);

procedure              Crown ( Dase :     out  Size );

procedure              Print_FF( Arg :      in Positive; Num :   in Integer: = 200);

procedure              SUM (А, В    :       in   Vector; С :   out  Vector);

function     Lotto     return    Number; function     Demo_Run_Model( X : Vector;

Y : integer)    return    Vector;

function      " -" ( MA, MB :   Matrix )      return      Matrix ; function     Root (X :   float)      return    float;

В Аде 95   подпрограмма может быть описана как   абстрактная : Спецификация_Подпрограммы    IS    ABSTRACT ;

Абстрактная подпрограмма - это подпрограмма, которая не имеет тела. Понятие абстрактной подпрограммы базируется на использова-

Глава 7. Подпрограммы

63

Ада 95. Введение в программирование

62

 

нии тэговых типов, связано с объектно-ориентированным программи­рованием и более подробно будет рассмотрено в Главе 16. О   Пример описания абстрактных подпрограмм:

package     Abstract_Objects   is

type   Snow   is  abstract   tagged   limited    private; function Action (Arg : Snow)   return    Snow    is  abstract; procedure   Power (X : in integer; Y : in out Snow)

is   abstract;

end  Abstract_Objects;

В Аде подпрограммы могут иметь одинаковые имена, то есть допус­кается совмещение подпрограмм:

procedure              ADD       (A, D       in             integer;   С             :               out  integer);

procedure              ADD       (X, Y       in             float;      Z             :               out  real);

procedure              ADD       (V1.V2   in             Vec;        A             :               out  Vec );

При совмещении выбор конкретной подпрограммы на выполнение при вызове выполняется автоматически на основании свойств пара­метров или типа результата:

ADD( 345,   Nu);        ADD( 234.876,   Reck ); ADD(Vec_1, Vec_2, Vec_Sum );

Спецификация подпрограммы может быть опущена, если подпро­грамма описана и вызывается в одном программном модуле; В этом случае её тело выступает в качестве спецификации.

Ш       СОВЕТЫ:

ф   Выбирайте имена подпрограмм и параметров так, чтобы можно было понять их назначение.

*  Подпрограмма - эффективный   и понятный   вид абстракции; ис­пользуйте подпрограммы для увеличения абстракции.

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

*   Используйте подпрограммы для инкапсуляции и сокрытия деталей реализации, которые могут быть изменены.

*  Список параметров определяет интерфейс подпрограммы; тщатель­но выбирайте имена и порядок формальных параметров - это улучшает понимание и использование подпрограммы.

*  Используйте именованное связывание фактических параметров при вызове, если число параметров велико; это уменьшает количество ошибок при работе с подпрограммами.

*  Обязательно указывайте направление передачи параметров во всех процедурах через описание вида параметров (in, out, in out).

**  Используйте вид параметов для ограничения доступа ( более огра­ничены параметры вида   in ,   out ,  меньше - вида  in out).

*  Используйте параметры по умолчанию для добавления новых пара­метров к существующим; размещайте их в конце списка параметров.