几年前,我们需要一个 C++ IPC 库来通过 TCP 进行函数调用。我们选择了一个并在我们的应用程序中使用它。一段时间后,很明显它并没有提供我们需要的所有功能。在我们软件的下一个版本中,我们抛弃了第三方 IPC 库并用我们自己编写的库替换它。从那时起,我有时会怀疑这是否是一个好的决定,因为事实证明这是一项相当多的工作,而且显然感觉像是在重新发明轮子。所以我的问题是:代码重用是否有缺点来证明这种重新发明的合理性?
11 回答
我可以推荐几个
错误会被复制 - 如果您重用错误代码:)
有时它可能会增加额外的开销。例如,如果您只需要做一件简单的事情,则不建议使用实现所需功能的复杂 BIG 库。
您可能会面临一些许可问题。
您可能需要花一些时间来学习\配置外部库。如果重新开发花费的时间要短得多,这可能不会有效。
重用文档记录不佳的库可能会比预期/估计花费更多的时间
PS 编写我们自己的库的原因是:
- 评估外部库通常非常困难并且需要大量时间。此外,有些问题只有在彻底评估后才会显现出来。
- 它使得引入一些特定于我们项目的功能成为可能。
- 维护和编写扩展更容易,因为您对库了如指掌。
几乎总是个案。您必须查看您尝试重用的内容的适用性和质量。
第一个问题是:只有当代码是好的代码时,你才能成功地重用代码。如果它设计得不好,有错误,或者非常脆弱,那么你会遇到你已经遇到过的同样的问题——无论如何你必须自己去做,因为修改现有代码非常困难。
但是,如果您正在考虑使用没有源代码的第三方库,那就有点不同了。如果是那种库,您可以尝试获取源代码。一些商业图书馆供应商对建议和功能请求持开放态度。
重用第三方库的最大缺点(您自己提到)是您强烈耦合并依赖于该库的工作方式以及它应该如何使用,除非您设法创建一个可以处理的中间接口层它。
但是很难创建一个通用接口,因为用另一个库替换现有的库,或多或少需要新功能以类似的方式工作。但是,您始终可以使用它重写代码,但这可能非常困难并且需要很长时间。
另一方面是,如果您重新发明轮子,您可以完全控制正在发生的事情,并且可以根据需要进行修改。如果您依赖第三方库并不断为您提供更新和错误修复,这可能是完全不可能的。另一方面,以这种方式重用代码使您能够专注于软件中的其他事情,这有时可能是要做的事情。
总会有取舍。
黄金智慧 :: 在可重复使用之前,它必须是可用的。
如果您的代码依赖于外部资源并且这些资源消失了,那么您可能会削弱许多应用程序的某些部分。
由于大多数重用代码都来自互联网,因此您会遇到Atwood 谈到的浴室墙代码的所有问题。您可能会遇到不安全或不可靠的借用代码问题,而且黑盒越多,情况就越糟糕。
代码复用的缺点:
- 调试需要更长的时间,因为它不是您的代码,而且很可能是有些臃肿的代码。
- 任何特定的要求也将需要更多的工作,因为您受到重用代码的限制并且必须解决它的限制。
- 从长远来看,不断的代码重用将导致臃肿且杂乱无章的应用程序难以追踪错误 - 编程地狱。
- 重用代码可以(取决于具体情况)减少程序员的挑战和满意度因素,同时也浪费了开发新技能的机会。
这取决于您要重用或重写的情况、语言和代码。一般来说,我相信语言越高级,我就越倾向于代码重用。高级语言中的错误可能会产生更大的影响,并且更容易重写。高级代码必须保持可读、整洁和灵活。当然,所有代码都可以这么说,但是,不知何故,重写 C 库听起来不如重写(或更确切地说是重构)PHP 模型代码是个好主意。
所以无论如何,这些都是我用来促进“重新发明轮子”的一些论点。
有时,从长远来看,从头开始重写比解决当前代码库的错误和限制更快、更有趣、更好。
想知道你用什么来保持你重新发明的这个库吗?
- 创建可重用代码的初始时间更昂贵且时间成本更高
- 当主分支有更新时,您需要同步它并再次部署
- 错误被复制 - 如果您重用错误代码
- 重用记录不佳的代码可能会比预期/估计的时间更长