ADA中的子程序包是否安全?

3

我对ADA语言非常陌生,在学习过程中,我看到了很多使用这种ADA功能的例子。 在我的看法中,它仅在单元测试中有用,可以测试父包的私有类型和方法,但我没有看到以这种方式编写代码有任何优势,似乎会破坏封装性。

除了单元测试外,它是否是一个好的实践方法?

3个回答

6

子包可以被看作是其父包的扩展。

例如,它可以用于提供与您的基础包无直接关联的功能。

典型的例子是输入输出包。

想象一下以下的包:

package Temperature is

    type Kelvin_Temp is private;
    type Celsius_Temp is private;
    
    function build (temp : Positive) return Kelvin_Temp;
    function build (temp : Integer) return Celsius_Temp;

    function to_celsius (temp : in Kelvin_Temp) return Celsius_Temp;
    
    function to_kelvin (temp : in Celsius_Temp) return Kelvin_Temp;
    
  private
    type Kelvin_Temp is 0.0 .. 10_000.0;
    type Celsius_Temp is -273.0 .. 10_000.0;
end Temperature;

这个软件包提供了与所定义类型直接相关的基本操作。

如果您想将其扩展为以文本格式提供I/O(输入/输出)怎么办? 您可以决定将操作放在“Temperature”包内,但是如果您想添加其他类型的I/O,例如数据库I/O,那么会有很多与您的类型不直接相关的函数位于同一文件中。

您可以定义

package Temperature.Text_IO is

    procedure Put(temp : Celsius_Temp);

    procedure Put(temp : Kelvin_Temp);

end Temperature.Text_IO;

并且

package Temperature.Database_IO is

   procedure insert (Temp : in Celsius_Temp);

   procedure insert (Temp : in Kelvin_Temp);

end Temperature.Database_IO;

这正是标准库中输入输出(IO)的实现

从封装的角度来看,你的私有类型在包层次结构之外仍然保持私有,因此不会破坏封装。


是的,绝对没问题 :D - Frédéric Praca
2
改为使用插入(insert),因为它不是Ada关键字,从而减少错误的可能性。 - Frédéric Praca
非常感谢您的评论!我还有一个关于OOP的问题。假设您在Parent包中有一个私有标记抽象类型Parent_T。创建一个继承Parent_T类型的子包Parent.Child是否仍然是一种好的实践?例如,type Child_T is new Parent_T with private; 我看到过类似的东西,但我不太喜欢。 - Albatros23
好的,那可能是另一个问题 ;) 无论如何,你不喜欢这个的什么?你可以按照自己喜欢的方式来做,使用子包或不使用。个人而言,我不使用子包来完成这个任务,但你可以参考一下这个(https://en.wikibooks.org/wiki/Ada_Style_Guide/Object-Oriented_Features)。 - Frédéric Praca

3

那个视频非常有趣,谢谢分享。 - Albatros23

1

子包存在的目的是为了通过扩展进行编程,但实现时它们也提供了一种绕过包应该执行的信息隐藏的方法。

虽然设计共享某些隐藏信息的包层次结构可能很方便,但通过扩展进行编程通常是一个糟糕的想法,它强调写作的易用性而不是阅读的易用性,重视编码而不是软件工程。您可能会对文章“打破Ada隐私法”的内容感兴趣,可在此处找到。


谢谢你的回答!不幸的是,如果不付费我无法阅读整篇文章。这是我的观点,但我不知道语言是否足够了解并构建最终的看法。 - Albatros23
那个链接应该提供免费获取论文的途径。我得和他们谈谈。私信我一个电子邮件地址,我会给你发送一份副本。 - Jeffrey R. Carter
我以为这里支持私信,但似乎我错了。论文正在途中。 - Jeffrey R. Carter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接