在一個(gè)比較大的軟件系統(tǒng)開發(fā)中,往往會(huì)出現(xiàn)某個(gè)程序包變得很大這種情況。對于需要這些新添功能的用戶來說,這是好事;而對于其它用戶來說,卻要花費(fèi)更多的時(shí)間編譯更大的程序包,無疑很讓人不舒服。在這種情況下,就有了子單元這種處理方法:將邏輯上單一的程序包分割成幾個(gè)實(shí)際上獨(dú)立的程序包,子單元從邏輯上講是源程序包的擴(kuò)展,但卻以獨(dú)立的文件形式存在,如將上例分割:
000 -- filename:account.ads
001 package Accounts is
002 type account is private;
003 My_Account : constant account;
004 procedure withdraw(account:in out account; amount :in Positive);
005 procedure deposit (account:in out account; amount :in Positive);
006 function balance(account: in out account) return Integer;
007 private
008 type account is
009 record
010 account_id : positive;
011 balance : integer;
012 end record;
013 My_Account:constant account := (78781, 122);
014 end accounts;
000 --filename:accounts_more_stuff.ads
001 package accounts.more_stuff is
002 function create(account:in out account;account_id :Positive) return Boolean;
003 function cancel(account:in out account;account_id :Positive) return Boolean;
004 end accounts.more_stuff;
程序包 accounts.more_stuff 是accounts的子程序包。這個(gè)例子的實(shí)際效果與上例一樣,包括作用域等等,只是從形式上來說分成了兩個(gè)不同程序包,編譯時(shí)也是分別編譯。對于用戶來講,使用上的區(qū)別還是有一點(diǎn):
with accounts.more_stuff;
procedure test is
...
begin
...
accounts.more_stuff.create (his_account,7827);
accounts.deposit(his_account,7000);
...
end test;
上面雖然只 with 了accounts.more_stuff,但能使用accounts里的資源,默認(rèn)情況下已作了 with accounts 的工作,如果 accounts 還有其它子單元,則不會(huì)自動(dòng) with 那些子單元。 use 和 with 不一樣,它不會(huì)在 use accounts.more_stuff 時(shí)默認(rèn)也 use accounts:
with accounts.more_stuff; use accounts; use more_stuff;
procedure test is
...
begin
create (his_account,7827);
deposit(his_account,7000);
...
end test;
子單元的使用應(yīng)該說還是和原來差不多。另外注意一下,程序使用程序包時(shí)會(huì)將程序包內(nèi)的所有子程序都載入內(nèi)存,因此有內(nèi)存浪費(fèi)現(xiàn)象;如果一個(gè)程序包內(nèi)一部份資源使用頻率較高,另一部份資源較少使用,則可以將這兩部份資源分成兩個(gè)子單元,以提高效率,這方面的典型情況就是程序包 Characters.Latin_1,Characters.Handling,具體見 第13章。
私有子單元
私有子單元允許創(chuàng)建的子單元只能被源程序包所使用,如:
000 --filename:accounts_more_stuff.ads
001 private package accounts.more_stuff is
002 function create(account:in out account;account_id :Positive) return Boolean;
003 function cancel(account:in out account;account_id :Positive) return Boolean;
004 end accounts.more_stuff;
這樣的話 create 和 cancle 對于用戶來說是不可見的,只能被程序包 accounts 所使用。
子單元除了上述的使用方法外,也可直接在其它程序包內(nèi)部:
package parent_name is
...
package child_name is
...
end child_name;
...
end parent_name;
更多建議: