私は機械工学のバックグラウンドを持っていますが、Adaで優れたソフトウェアエンジニアリングの実践を学ぶことに興味があります。いくつか質問があります。
Q1。私が正しく理解していれば、誰かがパッケージ仕様(ads)ファイルを作成し、それをコンパイルしてから、パッケージを使用しているメインプログラムをコンパイルすることができます。後で、パッケージ本体に何を含めるかがわかったら、後者を作成してコンパイルできます。その後、メインプログラムを実行できるようになります。私はこれを試しましたが、これが良い習慣であることを確認したいと思います。
Q2。2番目の質問は、スタブ(サブユニット)とSEPARATEの使用についてです。次のようなメインプログラムがあるとします。
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
そこで、コンパイル時にAdaGIDEから提案されたように、input.adbファイルの名前をtest2-input.adbに変更しました。メインファイルをコンパイルする際に、警告はありません。今の私の質問は、書いて大丈夫かどうかです
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があることを強調しますか?この考えは、前述のようにtest2-input.adbについてヒントを与えてくれたAdaGIDEから得られたものです。
b)私の次の質問:
コンパイル順序をよく理解している場合は、最初にメインファイル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の間にステートメントを入れないと、エラーが発生することはわかっています。つまり、これは常にそこにステートメントを配置する必要があることを意味します。そして、後でステートメントを書きたい場合は、サブユニットのBEGINとENDの間に常にNULLステートメントを入れて、後で後者に戻ることができます。これは実際にソフトウェアエンジニアリングが行われる方法ですか?
どうもありがとう...