Ада-95. Компилятор GNAT

       

Отладка контролируемых типов Некоторые рекомендации


Сложность отладки и проверки контролируемых типов заключается в том, что процедуры Initialize, Finalize и Adjust

вызываются автоматически, без какого-либо явного указания в программе.

В таком случае, можно поместить в тела соответствующих процедур Initialize, Finalize и Adjust

инструкции которые отображают диагностические сообщения, например, следующим образом:

procedure Initialize (Self: in out Controlled_Type) is

begin

. . . -- код инициализации

Ada.Text_IO.Put_Line("Initialize called for Controlled_Type"); end Initialize;

procedure Finalize (Self: in out Controlled_Type) is

begin

. . . -- код очистки

Ada.Text_IO.Put_Line("Finalize called for Controlled_Type"); end Finalize;

procedure Adjust (Self: in out Controlled_Type) is

begin

. . . -- код подгонки

Ada.Text_IO.Put_Line("Adjust called for Controlled_Type"); end Adjust;

Не смотря на простоту данного подхода, он является достаточно эффективным способом проверки корректности выполняемых действий.

Перечислим также некоторые рекомендации которые помогут избежать некоторых ошибок при написании процедур Initialize, Finalize и Adjust:

Первой инструкцией подпрограмм Finalize и Adjust должна быть проверка if, которая проверяет, что объект не nil. Следует остерегаться любого декларативного кода, который может быть выполнен до проверки на nil.

Подпрограммы Finalize и Adjust должны быть симметричны и инверсны по отношению друг к другу.

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

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

При тестировании подпрограммы Finalize, необходимо проверить, что значение объекта после очистки действительно будет nil.




Для агрегата или вызова функции, реализация конкретного компилятора может создавать, а может и не создавать отдельный анонимный объект. Следовательно, подпрограммы Finalize и Adjust

должны поддерживать создание временных анонимных объектов (следует остерегаться любых ограничений на число существующих объектов).

Следует помнить, что при программировании контролируемых типов, любое присваивание, описание константы или динамическое размещение которое использует инициализационный агрегат, в результате, может привести к вызову Finalize и/или Adjust.

В частности, не следует выполнять подобных операций при реализации процедур Finalize и Adjust

(это может привести к бесконечно рекурсивным вызовам).

Copyright (C) А.Гавва V-0.4w май 2004

Содержание раздела