ADA中的儿童包裹安全吗?

ADA中的儿童包裹安全吗?,ada,encapsulation,Ada,Encapsulation,我对ADA语言非常陌生,在我的学习过程中,我看到了很多使用ADA功能的示例。 在我看来,它可能只对单元测试有用,以便能够测试父包的私有类型和方法,但我不认为以这种方式编码有任何好处,它似乎破坏了封装 除了单元测试之外使用它们是否是一种好的做法?子包可以看作是其父包的扩展 例如,它可以用于提供不直接链接到基本包的功能 典型的例子是输入输出包 想象一下下面的包: 封装温度为 开尔文温度类型为专用型; 类型u Temp是私有的; 功能构建(温度:正)返回开氏温度; 函数构建(temp:Integer)

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


除了单元测试之外使用它们是否是一种好的做法?

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

例如,它可以用于提供不直接链接到基本包的功能

典型的例子是输入输出包

想象一下下面的包:

封装温度为
开尔文温度类型为专用型;
类型u Temp是私有的;
功能构建(温度:正)返回开氏温度;
函数构建(temp:Integer)返回摄氏度;
函数返回摄氏度(温度:以开尔文为单位)返回摄氏度;
用于返回开尔文温度(温度:摄氏度)的函数;
私有的
类型开尔文温度为0.0。。10_000.0;
温度类型为-273.0。。10_000.0;
终点温度;
此包提供直接链接到定义的类型的基本操作

如果要扩展它以提供文本格式的I/O,该怎么办? 您可以决定将操作放在Temperature包中,但是如果您想添加其他类型的I/O,例如数据库I/O,那么在同一个文件中有许多函数不会直接链接到您的类型

你可以定义

package Temperature.Text\u IO为
程序输入(温度:摄氏度/温度);
程序输入(温度:开氏温度);
结束温度.Text_IO;

package Temperature.Database\u IO为
程序插入(温度:以摄氏度为单位);
程序插入(温度:开氏温度);
结束温度。数据库_IO;
这正是我们要做的


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

子包的存在允许通过扩展进行编程,但在实现时,它们还提供了一种绕过PKG应该强制执行的信息隐藏的方法


虽然可以方便地设计共享一些隐藏信息的pkg层次结构,但扩展编程通常是一个糟糕的想法,它强调易于编写而不是易于阅读,强调编码而不是软件工程。您可能会对“违反Ada隐私法”一文感兴趣。

您可以查看2018年FOSDEM上的演示,讨论(私人)软件包和实施安全:


是的,肯定是:D将其更改为插入不太容易出错的内容,因为它不是Ada关键字非常感谢您的评论!我还有一个关于OOP的问题。假设在包Parent中有一个私有标记的抽象类型Parent。创建子包Parent.child继承类型Parent\T仍然是一种好做法吗?例如,
type Child是具有private的新父项我见过这样的东西,我不太喜欢。嗯,那可能是另一个问题;)不过,你不喜欢这里面的什么?你可以按你喜欢的方式做,不管是不是儿童套餐。就我个人而言,我不使用儿童软件包来做这件事,但是你可以看一看这个()那个视频。它非常有趣,谢谢你分享它。谢谢你的回答!不幸的是,我不付钱就看不懂整篇文章。这是我的观点,但我对构建最终意见的语言了解不够。这个链接应该可以免费访问该论文。我得和他们谈谈。PM给我一个电子邮件地址,我会给你发一份副本。我以为这里支持私人信息,但似乎我弄错了。报纸就要出版了。