我对ADA语言非常陌生,在学习过程中,我看到了很多使用这种ADA功能的例子。 在我的看法中,它仅在单元测试中有用,可以测试父包的私有类型和方法,但我没有看到以这种方式编写代码有任何优势,似乎会破坏封装性。
除了单元测试外,它是否是一个好的实践方法?
我对ADA语言非常陌生,在学习过程中,我看到了很多使用这种ADA功能的例子。 在我的看法中,它仅在单元测试中有用,可以测试父包的私有类型和方法,但我没有看到以这种方式编写代码有任何优势,似乎会破坏封装性。
除了单元测试外,它是否是一个好的实践方法?
子包可以被看作是其父包的扩展。
例如,它可以用于提供与您的基础包无直接关联的功能。
典型的例子是输入输出包。
想象一下以下的包:
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)的实现
从封装的角度来看,你的私有类型在包层次结构之外仍然保持私有,因此不会破坏封装。
子包存在的目的是为了通过扩展进行编程,但实现时它们也提供了一种绕过包应该执行的信息隐藏的方法。
虽然设计共享某些隐藏信息的包层次结构可能很方便,但通过扩展进行编程通常是一个糟糕的想法,它强调写作的易用性而不是阅读的易用性,重视编码而不是软件工程。您可能会对文章“打破Ada隐私法”的内容感兴趣,可在此处找到。
type Child_T is new Parent_T with private;
我看到过类似的东西,但我不太喜欢。 - Albatros23