儿童包裹在 ADA 安全吗?

Alb*_*s23 3 encapsulation ada

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

除了单元测试之外,使用它们是一个好习惯吗?

Fré*_*aca 6

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

例如,它可用于提供不直接链接到您的基础包的功能。

典型的例子是 Input-Output 包。

想象一下以下包:

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;
Run Code Online (Sandbox Code Playgroud)

这个包提供了直接链接到定义的类型的基本操作。

如果您想扩展它以提供文本格式的 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;
Run Code Online (Sandbox Code Playgroud)

package Temperature.Database_IO is

   procedure insert (Temp : in Celsius_Temp);

   procedure insert (Temp : in Kelvin_Temp);

end Temperature.Database_IO;
Run Code Online (Sandbox Code Playgroud)

标准库中的IO就是这样做的

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

  • 将其更改为插入不太容易出错的内容,因为它不是 Ada 关键字 (2认同)