У меня есть опыт работы в области машиностроения, но мне интересно научиться хорошей практике разработки программного обеспечения с Адой. У меня есть несколько вопросов.
Q1. Если я правильно понимаю, то кто-то может просто написать файл спецификации пакета (рекламы), скомпилировать его, а затем скомпилировать основную программу, использующую пакет. Позже, когда известно, что включать в тело пакета, его можно написать и скомпилировать. После этого можно запустить основную программу. Я пробовал это, и я хотел бы подтвердить, что это хорошая практика.
Q2. Мой второй вопрос касается заглушек (субблоков) и использования ОТДЕЛЬНЫХ. Скажем, у меня есть основная программа следующим образом:
WITH Ada.Float_Text_IO;
WITH Ada.Text_IO;
WITH Ada.Integer_Text_IO;
PROCEDURE TEST2 IS
A,B : FLOAT;
N : INTEGER;
PROCEDURE INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS SEPARATE;
BEGIN -- main program
INPUT(A,B,N);
Ada.Float_Text_IO.Put(Item => A);
Ada.Text_IO.New_line;
Ada.Integer_Text_IO.Put(Item => N);
END TEST2;
Тогда у меня есть процедура INPUT в отдельном файле:
separate(TEST2)
PROCEDURE INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS
BEGIN
Ada.Float_Text_IO.Get(Item => A);
Ada.Text_IO.New_line;
Ada.Float_Text_IO.Get(Item => B);
Ada.Text_IO.New_line;
Ada.Integer_Text_IO.Get(Item => N);
END INPUT;
Мои вопросы:
a) AdaGIDE предлагает мне сохранить файл процедуры INPUT как input.adb. Но затем при компиляции основной программы test2 я получаю предупреждение:
warning: subunit "TEST2.INPUT" in file "test2-input.adb" not found
cannot generate code for file test2.adb (missing subunits)
Для AdaGIDE это скорее ошибка, так как приведенные выше предупреждения появляются перед сообщением:
Compiling...
Done--error detected
Поэтому я переименовал файл input.adb в test2-input.adb, как было предложено мне AdaGIDE при компиляции. Теперь при компиляции основного файла у меня нет никаких предупреждений. Теперь мой вопрос: можно ли писать
PROCEDURE INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS
как я сделал в файле субблока test2-input.adb, или лучше написать более описательный термин, например
PROCEDURE TEST2-INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS
чтобы подчеркнуть, что вход процедуры имеет родительскую процедуру test2 ? Эта мысль следует из того, что AdaGIDE намекает мне на test2-input.adb, как я упоминал выше.
б) Мой следующий вопрос:
Если я хорошо понимаю порядок компиляции, то я должен сначала скомпилировать основной файл test2.adb, а затем заглушку test2-input.adb. При компиляции заглушки получаю сообщение об ошибке:
cannot generate code for file test2-input.adb (subunit)
Done--error detected
Однако теперь я могу сделать привязку и линковку для test2.adb и запустить программу.
Я хотел бы знать, я сделал неправильно, пытаясь скомпилировать заглушку test2-input.adb или ее не следует компилировать?
Q3. Какая польза от субъединиц? Просто разбить большую программу на более мелкие части? Я знаю, что возникает ошибка, если в субюните не помещаются операторы между BEGIN и END. Таким образом, это означает, что всегда нужно помещать туда утверждение. И если кто-то хочет написать операторы позже, он всегда может поместить оператор NULL между BEGIN и END в субблоке и вернуться к последнему позже. Это то, как программная инженерия делается на практике?
Большое спасибо...