Ада-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.




Содержание  Назад  Вперед