refactoring - 您是否应该将采用的第 3 方库包装到您的项目中?

标签 refactoring

我今天和一位同事进行的讨论。

他声称每当您使用第三方库时,您都应该为其编写一个包装器。因此,您可以随时更改内容并根据您的特定用途进行调整。

我不同意总是这个词,关于 log4j 的讨论发生了,我声称 log4j 已经经过充分测试和时间验证的 API 和实现,并且所有可以想到的东西都可以事后配置,并且没有什么是你可以做的。应该包裹。即使您想包装,也有经过验证的包装器,例如 commons-logging 和 log5j。

我们在讨论中提到的另一个例子是 Hibernate。我声称它有一个非常大的 API 需要封装。此外,它还有一个分层的 API,可以让您根据需要调整其内部。我的 friend 声称他仍然认为应该包装它,但由于 API 的大小,他没有这样做(这位同事在我们当前的项目中比我经验丰富)。

我领取了this ,并且应该在特定情况下进行包装:

  • 您不确定该库如何满足您的需求
  • 您将仅使用库的一小部分(在这种情况下,您可能仅公开其 API 的一部分)。
  • 您不确定该库的 API 或实现的质量。

我还认为有时您可以包装代码而不是库。例如,将数据库相关代码放在 DAO 层中,而不是抢先包装所有 hibernate。

好吧,最后这并不是一个真正的问题,但我们非常感谢您的见解、经验和意见。

最佳答案

这是 YAGNI 的完美示例:

  • 工作量更大
  • 它会让你的项目膨胀
  • 这可能会使您的设计变得复杂
  • 它没有立竿见影的好处
  • 你所写的场景可能永远不会出现
  • 当发生这种情况时,您的包装器很可能需要完全重写,因为它与您正在使用的具体库联系得太紧密,而新的 API 根本与您的 API 不匹配。

关于refactoring - 您是否应该将采用的第 3 方库包装到您的项目中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1916030/

相关文章:

c# - 如何将两种方法转换为一种方法以提高效率?

c# - 如何重构 C# 中的日志记录?

Python自身属性重命名

java - 使用 JSch 库在 Java 中获取 session 和 SFTP channel

javascript - 通用工厂/服务以避免 Angular 中的重复代码

objective-c - Xcode 中是否有组合键来实现协议(protocol)?

c - 如何避免类似 ISR 之间的代码重复?

ios - 当我重命名属性名称时,Xcode 重构不会重命名 setter 和 getter

go - 惯用地干掉 Go 中的公共(public)字段

javascript - 代码气味 - 将 bool 控制参数传递给函数