多个子程序封装在一个文件里过于庞大,且分类不清,这时就使用了程序包(package),作为一种分组机制,将子程序归类封装成独立的单元。Ada 的程序包机制主要受 Pascal 及 70 年代时的软件工程技术影响。当时很主要的一项革新就是软件包的概念。软件包使一个大程序分离成了多个单元,使软件维护更加方便,可重用性也更高,是结构化编程思想中必不可少的一部份。
程序包的声明(Package Declaration), 程序包一般分为两部份,声明部分和执行部份。声明部份声明子程序、变量等实体,他们通常被称为资源;而执行部份则是声明部分中实体的实现。它们的扩展名一般情况下分别为 ads 和 adb。
①:adderpkg.ads – 声明部分
package AdderPkg is
type MY_ARRAY is array(INTEGER range <>) of FLOAT;
procedure Add_Em_Up(In_Dat : in MY_ARRAY;
Sum : out FLOAT);
end AdderPkg;
②:adderpkg.adb – 实现部分,这里类似于C语言
package body AdderPkg is
procedure Add_Em_Up(In_Dat : in MY_ARRAY;
Sum : out FLOAT) is
Total : FLOAT;
begin
Total := 0.0;
for Index in In_Dat'FIRST..In_Dat'LAST loop
Total := Total + In_Dat(Index);
end loop;
Sum := Total;
end Add_Em_Up;
end AdderPkg;
③:main.adb – 使用部分
with Ada.Text_IO, Ada.Float_Text_IO;
use Ada.Text_IO, Ada.Float_Text_IO;
with AdderPkg;
use AdderPkg;
procedure Adder1 is
FIRST : constant := 2;
LAST : constant := 7;
Sum_Of_Values : FLOAT;
New_Array : MY_ARRAY(FIRST..LAST);
procedure Summer(In_Dat : MY_ARRAY;
Sum : out FLOAT) renames AdderPkg.Add_Em_Up;
begin
for Index in New_Array'FIRST..New_Array'LAST loop
New_Array(Index) := FLOAT(Index);
end loop;
Put_Line("Call Add_Em_Up now");
Add_Em_Up(New_Array, Sum_Of_Values);
Put("Back from Add_Em_Up, total is");
Put(Sum_Of_Values, 5, 2, 0);
New_Line;
-- The next three statements are identical
Add_Em_Up(New_Array, Sum_Of_Values);
AdderPkg.Add_Em_Up(New_Array, Sum_Of_Values);
Summer(New_Array, Sum_Of_Values);
end Adder1;