什么是第三方代码?


15

受此问题启发使用第三方库-始终使用包装器吗? 我想知道人们实际上认为第三方库是什么。

来自PHP的示例:
如果我正在使用Zend框架构建应用程序,是否应该将Zend框架库视为第三方代码?

C#中的示例:
如果正在构建桌面应用程序,是否应该将所有.Net类都视为第三方代码?

Java示例:
是否应将JDK中的所有库都视为第三方库?

有人说,如果一个库是稳定的并且不会经常更改,那么就不需要包装它。但是我看不到如何包装不依赖第三方代码的类。


8
下选民可以解释原因吗?
Songo 2012年

我听说过第三方软件,但没有第三方代码。大多数第三方都不给您源代码。
图兰斯·科尔多瓦

Answers:


18

您的示例都是第三方代码,但不应为它们编写包装。它们是大型,成熟的项目,具有稳定且经过精心计划的API。

包装器的需要是在代码和库之间提供抽象层。仅当发现库没有针对您正在做的特定事情提供良好的API时,才需要这种抽象。然后,您可以创建包装器以简化自己的代码,并隐藏API调用很尴尬的事实。

如果您使用依赖注入,您的代码将是可测试的。在单元测试中,您可以将库依赖项与模拟对象交换出去,从而使您可以隔离测试中的代码。


+1,用于解释何时需要包装材料或外墙。
Joshua Drake 2012年

感谢您的回答,但是关于单元测试的最后一段,您能否看一下这个问题,在这里我试图对直接依赖于库框架的类进行单元测试?
Songo 2012年

@Songo:您的测试策略应该是创建一个Zend_Mail模拟,并将其传递给Logger被测对象。PHP不支持鸭子输入吗?如果是这样,那么创建一个模拟对象就不容易了吗?我不太了解PHP,但是您可以查看PHP模拟库中的示例以了解其通常的工作方式。在不支持鸭子类型的语言中,那么我认为您需要更改Zend_Mail为接口,然后创建一个实现该接口并从其继承Zend_Mail或仅委托其所有调用的瘦包装器。
M. Dudley

@emddudley很好,是的,但是我正在寻找不支持鸭子类型的其他语言的更通用解决方案。实际上,您的包装解决方案Zend_Mail是我的第一个想法,但是正如您在编辑该文章之前的原始帖子中所看到的,我确实使用了实现该包装的接口和包装器。但是,包装器存在的唯一目的是使我可以模拟其接口。在不支持鸭子类型的语言中常见吗?建立无限个包装器是什么意思?
Songo 2012年

@Songo:我认为这是特定于语言和库的,并且您必须处理平台所支持的一切。有时您可能会被包装纸包裹住。依赖注入和对象模拟是相当新的发展(2004年?),因此并不是所有的语言和库都很好地支持它们。您正在寻找的“通用解决方案”只是一种心态:如何为松耦合和有效的单元测试构建代码?
M. Dudley

6

封装库的目的是打破您自己的代码对该库的依赖性,以便启用:

  • 单元测试-您必须能够测试您的代码。如果库不允许您模拟类或强制执行测试所需的响应,则需要包装该库。这是一个明显的问题,可能不是您想知道的情况。
  • 不断变化的实现-作为代码作者,您需要了解可能会以自己的方式发生的变化,以及与可能发生的变化相比,准备这些更改需要花费多少费用。您可以从.NET切换到JVM吗?这是困难且不可能的。但是,将来很有可能会更改UI技术或XML引擎。

隔离第三方库和框架只是隔离更改的一个子集。


关于单元测试的要点。我并不是说总是包装以能够对应用程序进行单元测试,但这是在需要时解耦依赖关系的好策略。
Sergio Acosta 2012年

2

我不会将标准库的成员视为第三方代码-毕竟它们是标准的,并且可以合理地假定它们在您正在使用的平台上可用并起作用。

至于Zend之类的东西,我认为不会包装它-如果采用其他框架,则可能需要重写该程序。老实说,我不会包装那些不是严重的外部配置依赖性的东西,或者如果我不是真的没有计划使该部分可交换的话。


2

我会将特定编程语言提供的库视为该语言的一部分。

比起第三方,我将任何其他实体提供的所有库作为扩展或独立于编程语言本身的工具。

以您的例子为例,我将Zend视为第三方。我还将以我的核心业务逻辑不依赖Zend的方式构建应用程序。

维基百科将第三方组件定义为:

在计算机编程中,第三方软件组件是可重用的软件组件,可开发为由开发平台的原始卖方以外的实体自由分发或出售。


1

从最严格的意义上讲,您给出的每个示例都是第三方代码。但是,并非所有第三方代码都应包装。所有第三方均应包装。根据定义,框架无法包装,因为它们已成为代码的一部分。这就是为什么要包装日志记录库而不包装.NET框架或Zend框架的原因。您无法真正将代码与.NET分开-它们是交织在一起的。当然,好的框架将具有针对其进行编程的接口,使您可以在某种程度上绕过该问题。

另请参阅:https : //stackoverflow.com/questions/148747/what-is-the-difference-between-a-framework-and-a-library

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.