Architecture 什么时候可以公开第三方库作为API的一部分?

Architecture 什么时候可以公开第三方库作为API的一部分?,architecture,Architecture,我对这件事有自己的想法,但似乎很多库和产品都让第三方lib渗透到API中。日志记录就是一个很好的例子。几乎所有这些都表明您需要配置日志API,而不是使用可以实现并提供给lib的提供程序接口 是否旨在包装和隐藏所有LIB要求太多?这值得麻烦吗?我认为这很大程度上取决于你在做什么。考虑到您正在谈论的示例,我认为如果您完全隐藏第三方API,这将是一种难以置信的时间浪费,并且会给最终消费者带来一个不那么健壮的包 例如,如果您使用Log4Net并隐藏所有配置方面,那么您将灵活性限制为仅集成/公开的项。现在

我对这件事有自己的想法,但似乎很多库和产品都让第三方lib渗透到API中。日志记录就是一个很好的例子。几乎所有这些都表明您需要配置日志API,而不是使用可以实现并提供给lib的提供程序接口


是否旨在包装和隐藏所有LIB要求太多?这值得麻烦吗?

我认为这很大程度上取决于你在做什么。考虑到您正在谈论的示例,我认为如果您完全隐藏第三方API,这将是一种难以置信的时间浪费,并且会给最终消费者带来一个不那么健壮的包

例如,如果您使用Log4Net并隐藏所有配置方面,那么您将灵活性限制为仅集成/公开的项。现在,从另一方面来说,有些时间和地点是你想要做的


因此,我想,只有当有真正的业务需要这样做时,才是长期和短期的。至少这是我的0.02美元。

不仅不值得费心去包装和隐藏库的所有内容,而且往往会适得其反

例如,我们有一个实现特定HTTP协议的库,名为。此库是在的基础上实现的,它有一组丰富的配置参数。我们不需要编写我们自己的配置参数来包装HttpClient参数,而只是使用我们自己的工厂和构造函数来公开这些参数


如果我们试图包装所有Apache参数,那么可能需要几个月的时间。如果我们代表我们库的用户决定哪些参数是重要的,并且只包装这些参数,我们将限制他们对我们库的操作。

当重写HttpClient时会发生什么?包装始终为您提供将x转换为y的机会,这意味着您可能能够解决一个不需要客户干预的问题。仅仅因为存在HttpClient 5.x并不意味着HttpClient 4.x会突然停止工作。如果您与第三方图书馆提供商之间的关系如此脆弱或好斗,那么您最好切换提供商或编写自己的提供商。当应用于运行时提供的类库时,上述“对正”同样有效。您是否也包装了java.lang.Strings?他们不是重写了HttpClient 4吗?它与3不兼容?不能将字符串之类的值类型与HttpClient之类的服务及其intfs进行比较。一个是值类型,它几乎总是一个类,另一个隐藏在intf后面。那么,当您需要升级HttpC时会发生什么?当它的依赖项(如阻塞)阻碍时会发生什么?HttpClient 3和4可以共存于同一个类加载器中。即使他们不能,这就是为什么我们有不同的类加载器和类似OSGI的东西。如果我们想使用HttpClient 5.x,那么我们的库也会有一个大的修改。我不能评论hc3和hc4之间的差异,但显然肯定有一些改进。在btoh端完成一些升级到hc4的工作之前,您的客户机会一直使用hc3。不同的是,更改配置是本地的-它只影响少数文件。如果需要从o升级切换到不兼容的log4net,那么一半的代码库都会立即出错并被破坏。这种情况在java世界w/log4j中发生过,当时一个主要类被弃用,取而代之的是一个新的等价类。