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). * Используйте параметры по умолчанию для добавления новых параметров к существующим; размещайте их в конце списка параметров. |
| Оглавление| |