在编程中使用WRAPPER的术语在哪里以及如何使用,有什么帮助?


83

我遇到过使用创建其他类或API甚至某些代码的包装的术语的软件开发人员,这是经验丰富的软件程序员使用的术语

所以任何想法,这是什么意思;

例如一个简单的问题;我们有两种类型的数组排序技术,让我们为其创建包装器

上面的例子很简单

Answers:


132

术语“包装器”到处都是。通常,它用于描述一个包含另一个类的实例的类,但不直接公开该实例。包装器的主要目的是提供一种使用包装对象的“不同”方式(也许包装器提供了一个更简单的接口,或添加了一些功能)。

描述经典设计模式时也可以使用“包装”一词。

包装对象以为其提供简化的界面通常被称为“外观”模式。包装是门面。

有时您可能拥有适合特定接口的类,但是您无法更改其代码以使其符合该接口。您可以为该类创建一个包装器,该包装器实现接口,但将大多数调用定向到包装的对象。这是“适配器”模式。包装器是适配器。

您描述的实例中,您有两个可以使用不同算法进行数组排序的类,听起来像“策略”模式,其中您提供了对某个对象执行操作的方法,但是用于该操作的算法可能会有所不同在那个物体的结构上。

例如,您的一种排序算法可能适合长度小于100的数组,但性能可能是一个问题。另一种算法可能适合较大的数组。您可以为这两种支持排序操作的算法创建一个“包装器”,但可以根据数组长度决定要使用哪种算法。

存在绝大多数包装程序以隐藏某种复杂性。


5
哦,知道了...谢谢:)一个非常详细的答案,解决了我的包装器问题:)
Basit Anwer

在python中有xdress包github.com/xdress/xdress。它说这是包装器生成器。在这种情况下,这意味着什么?它是否在C中创建了一个可执行文件(确实会提供一种“不同的”(在C中)使用包装的对象(在Python中)的方式,还是让我感到困惑?

75

用类推简单解释:包装是什么?

代码不用于解释。

示例1:Ipad“包装” Iphone

ipad不执行iphone会执行的操作?

他们基本上不是同一件事,只是屏幕更大了吗?

Ipad会“包裹” iphone:这意味着您可以在ipad本身内拥有iphone的所有优点,并具有更大屏幕等优点。但是从根本上讲,ipad内是Iphone。

那有什么不同呢?唯一不同的是外观:您的屏幕更大,也许您无法在Ipad上拨打电话。

iPhone是Ipad内唯一的东西。 Ipad实际上包裹了Iphone。 除非您无法使用Ipad拨打电话,否则无法“公开”拨打电话的功能。 苹果希望您购买的x2产品不只是一种:P

实际上,“对象”是一样的东西。

.............内部具有所有相同但相同的外观的好东西。不同的包装器。

“包装程序可能会公开与基础对象不同的功能” ......好吧,但这意味着什么?

有时包装器可能会限制您可以访问的内部内容。例如,即使埋在其中的Iphone具有该功能,ipad可能会限制您拨打电话的能力。

示例2:自动汽车充当手动汽车的包装

想想自动车和手动车。在幕后,在自动驾驶汽车中,有一些工程机制可以自动为您改变齿轮,但是从根本上说,在表面下,汽车仍然是手动车。换句话说,汽车的自动功能“包装”了汽车的手动功能。如果您想自己在自​​动驾驶汽车中手动换档-您根本做不到。自动驾驶汽车“不暴露”变速能力。但是它暴露在手动车中。理所当然的比喻有点紧张,但我希望你明白我的意思。

但是包装器的目的是什么?

如果您想简化事情,可以编写包装类。您将创建一个易于使用的“包装器”,并将所有复杂的位留在包装器中,确保这些“复杂的位”不被“暴露”。

例如,您可能有一个.net包装器,该包装器在其下进行COM调用。如果没有包装器,那么您将不得不自己进行这些COM调用。幸运的是,使用包装程序,您只需对.net包装代码进行调用-这样就可以进行这些COM调用。这有望为您简化事情。


8
在解释技术术语时,我喜欢这些解释。您知道有专门的网站吗?谢谢。
viggy28 '18

2
这很有意义。
L. Dai

10

只是您编写了一些易于使用的代码来隐藏其下的代码的复杂性。当您需要从高级语言调用某些低级API并希望隐藏所有“丑陋”代码时,它特别有用。

编辑:您可以在以下两个Wiki文章中找到有关它的更多信息:函数


4

包装器是一些在不更改实际API的情况下内部调用某些API的代码。

Facebook的Facebook C#SDK发行就是一个例子。该SDK实际上是包装器,因为它仅允许您调用其基础平台,而没有提供特定的方法和类。另一方面,Facebook Developer Toolkit是其完整的API。


我需要编写一个创建脚本文件的C#程序(脚本语言特定于硬件设备,称为CoraScript)。CoraScript中大约有50条左右的命令,例如,一条连接到设备的命令,一条将文件发送到该设备的命令,告诉它在其闪存中执行应用程序的命令等。喜欢创建一个将生成此类脚本的C#库。将此C#库称为wrapper libraryCoraScript脚本语言的吗?
Minh Tran

该脚本语言的命令行解释器是一个控制台应用程序。在该应用程序运行时,它将接收CoraScript命令,执行它们,然后返回该命令的输出(例如,Connect localhostCoraScript命令将返回字符串+connect,"coralib3.dll version 1,8,11"以指示该命令已成功执行)。
Minh Tran's

2

“包装器”有许多示例,该术语有时可以互换使用。以下是一些想到的例子:

DLL包装器

过去,我围绕.NET DLL创建了COM包装器,以便在理解COM但不了解.NET的旧应用程序中使用.NET的高级功能。

对象包装器(Java)

在Java中,java.lang程序包中提供了一个类,以提供八种基本类型的对象方法。Java中的所有原始包装器类都是不可变的。因此WrapperObject在需要时,类用于表示原始值。



-1

假设您想在代码中添加更多功能,但是您无法更改代码。这就是包装器帮助的地方。您可以使用包装器来获取输出,而无需更改原始代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.