受此问题启发使用第三方库-始终使用包装器吗? 我想知道人们实际上认为第三方库是什么。
来自PHP的示例:
如果我正在使用Zend框架构建应用程序,是否应该将Zend框架库视为第三方代码?
C#中的示例:
如果正在构建桌面应用程序,是否应该将所有.Net类都视为第三方代码?
Java示例:
是否应将JDK中的所有库都视为第三方库?
有人说,如果一个库是稳定的并且不会经常更改,那么就不需要包装它。但是我看不到如何包装不依赖第三方代码的类。
受此问题启发使用第三方库-始终使用包装器吗? 我想知道人们实际上认为第三方库是什么。
来自PHP的示例:
如果我正在使用Zend框架构建应用程序,是否应该将Zend框架库视为第三方代码?
C#中的示例:
如果正在构建桌面应用程序,是否应该将所有.Net类都视为第三方代码?
Java示例:
是否应将JDK中的所有库都视为第三方库?
有人说,如果一个库是稳定的并且不会经常更改,那么就不需要包装它。但是我看不到如何包装不依赖第三方代码的类。
Answers:
您的示例都是第三方代码,但不应为它们编写包装。它们是大型,成熟的项目,具有稳定且经过精心计划的API。
包装器的需要是在代码和库之间提供抽象层。仅当发现库没有针对您正在做的特定事情提供良好的API时,才需要这种抽象。然后,您可以创建包装器以简化自己的代码,并隐藏API调用很尴尬的事实。
如果您使用依赖注入,您的代码将是可测试的。在单元测试中,您可以将库依赖项与模拟对象交换出去,从而使您可以隔离测试中的代码。
Zend_Mail
模拟,并将其传递给Logger
被测对象。PHP不支持鸭子输入吗?如果是这样,那么创建一个模拟对象就不容易了吗?我不太了解PHP,但是您可以查看PHP模拟库中的示例以了解其通常的工作方式。在不支持鸭子类型的语言中,那么我认为您需要更改Zend_Mail
为接口,然后创建一个实现该接口并从其继承Zend_Mail
或仅委托其所有调用的瘦包装器。
Zend_Mail
是我的第一个想法,但是正如您在编辑该文章之前的原始帖子中所看到的,我确实使用了实现该包装的接口和包装器。但是,包装器存在的唯一目的是使我可以模拟其接口。在不支持鸭子类型的语言中常见吗?建立无限个包装器是什么意思?
封装库的目的是打破您自己的代码对该库的依赖性,以便启用:
隔离第三方库和框架只是隔离更改的一个子集。
我会将特定编程语言提供的库视为该语言的一部分。
比起第三方,我将任何其他实体提供的所有库作为扩展或独立于编程语言本身的工具。
以您的例子为例,我将Zend视为第三方。我还将以我的核心业务逻辑不依赖Zend的方式构建应用程序。
维基百科将第三方组件定义为:
在计算机编程中,第三方软件组件是可重用的软件组件,可开发为由开发平台的原始卖方以外的实体自由分发或出售。
从最严格的意义上讲,您给出的每个示例都是第三方代码。但是,并非所有第三方代码都应包装。所有第三方库均应包装。根据定义,框架无法包装,因为它们已成为代码的一部分。这就是为什么要包装日志记录库而不包装.NET框架或Zend框架的原因。您无法真正将代码与.NET分开-它们是交织在一起的。当然,好的框架将具有针对其进行编程的接口,使您可以在某种程度上绕过该问题。
另请参阅:https : //stackoverflow.com/questions/148747/what-is-the-difference-between-a-framework-and-a-library