复制粘贴与参考

时间:2010-05-17 14:01:45

标签: open-source reference copy-paste code-reuse

我的问题是关于引用开源框架。它们中有许多用于许多不同的目的。我个人在一个项目中利用其中几个。例如:

  1. 统一
  2. CAL /棱镜
  3. ValidationAspects
  4. EnterpriseLibrary记录
  5. EnterpriseLibrary异常处理
  6. EnterpriseLibrary缓存
  7. 卡利
  8. 从开发工作的角度来看,所有这些框架都有很大帮助。然而,涉及一些消极方面:

    1. 大量的dll(上面列出的15个)。
    2. 应用程序级别(非公共程序集和新程序集)必须引用许多核心dll,这可能会造成混淆)并且涉及大量不同的名称空间。
    3. 部署上述数量的dll可能会出现问题(我有时会使用ILMerge来解决这个问题以及上述问题,但我们现在就把它放在一边)。
    4. 开源项目生命周期 - 开源项目来去匆匆,所以如果不再积极维护这些项目中的任何一项,如果存在需要修复或增强的内部错误,可能会有所顾忌。
    5. “如何做事”的混淆。我们没有积极利用上述框架的每一部分。实际上,这些框架中的一些具有重叠并提供冗余组件和功能。就发展而言,这可能令人困惑。我们希望在我们的代码库中使用一致且易于理解的一致实现。在这方面,具有以不同方式做同样事情的多个区域可能是麻烦的。这可能是我最关心的问题之一。
    6. 如果这些框架引用其他程序集的不同版本(即一个内部引用Unity 1.1和另一个Unity 2.0),则会遇到大麻烦。
    7. 另类?将源代码包含在项目的公共dll中(即MyProject.Common)。让我们暂时搁置许可要求的遵守问题。

      这也有一些负面影响:

      1. 利用框架提供商发布的更新并不容易 - 您需要更新源代码。
      2. 封装功能 - 当源代码全部掌握在您手中时,更容易打破这种范例。
      3. 所以,我知道人们可能对此有很多意见......我想听听他们的意见。

        感谢。

1 个答案:

答案 0 :(得分:2)

对于问题的某些方面,这可能是相关的:http://en.wikipedia.org/wiki/DLL_hell#Running_Conflicting_DLLs_Simultaneously

此问题的另一个常见解决方案是在所需功能之上编写封装层,这至少可以在升级到支持库的新版本时保护代码免受大量更改。

对于开源项目的生命周期,应该清楚哪些项目是健康的,哪些不是。例如,作为Apache或Eclipse基础的一部分的项目可能是健康的,而sourceforge上的一些随机事物可能不是。通常,您可以通过避免看起来不活跃的项目来完全避免此问题。

对于将代码复制到项目中的负面影响:

  1. 我知道你想把许可证放在一边,但实际上你不能。如果可能存在问题,我不是律师,你应该为你的项目咨询,但如果你正在开发一个专有系统,它可能会意外地成为GPL。
  2. 它使您的开发环境更加混乱。您必须担心确保复制的代码正确编译,正在使用正确的版本进行编译,并且具有正确的构建脚本。您还在IDE中拥有占用空间的所有额外代码。
  3. 正如您所指出的,它使更新代码变得非常困难。
  4. 如果您必须使用开源项目提交错误,则会变得更加困难。
  5. 如果你不小心,一个不知道更好的初级开发人员可以进入代码并开始使用它。
  6. 可能有更多理由不这样做,但这只是一些。希望有所帮助。