我目前在两个社交网站上工作,它们有很多共同点,但又截然不同。我发现自己为两者(包括 UI)编写了很多相同的代码,并且想知道是否存在限制重复代码的最佳实践。
主要问题之一是这些项目彼此非常独立,并且很快就会有更多的差异而不是相似之处。此外,一旦最初的工作完成,它们可能会被移交给其他程序员,因此共享代码库最终可能会成为一个大问题。
可能不得不处理类似情况的人有什么建议吗?
PS:我是这两个项目的唯一开发者,而且看起来这种情况会持续一段时间。
我目前在两个社交网站上工作,它们有很多共同点,但又截然不同。我发现自己为两者(包括 UI)编写了很多相同的代码,并且想知道是否存在限制重复代码的最佳实践。
主要问题之一是这些项目彼此非常独立,并且很快就会有更多的差异而不是相似之处。此外,一旦最初的工作完成,它们可能会被移交给其他程序员,因此共享代码库最终可能会成为一个大问题。
可能不得不处理类似情况的人有什么建议吗?
PS:我是这两个项目的唯一开发者,而且看起来这种情况会持续一段时间。
将共享功能抽象回具有已定义接口和默认实现的框架或库是处理此问题的常用方法。例如,您的插件架构,如果您选择支持一个,可能是可以在您的所有项目之间共享的东西。大多数时候,您想要共享的内容是非常基本的功能或可以轻松定制的相对抽象的功能。前者更容易识别和分解到常见的库中。后者有时可能比简单地重新实现具有微小更改的代码(共享模式而不是代码)需要更多的工作。
您需要注意的一件事是让实际重用驱动公共库的设计,而不是提前提出共享架构。陷入框架设计并将其抽象出来以供共享使用是非常诱人的。不幸的是,您经常发现共享使用从未发展或朝着与您预期不同的方向发展,并且您最终会重写或丢弃大部分框架 - 或者更糟糕的是,保留和维护未使用的代码。让 YAGNI(你不会需要它)成为你的向导,并延迟重构到公共库,直到你真正需要它。
这里有几种(至少)不同的方法,你当然可以同时使用这两种方法。首先,您可以将一些通用代码删除到一个单独的项目中,然后静态调用该代码。这很容易做到,我有时会使用简单的辅助函数来使用这种方法,这些辅助函数可能不属于我的主项目中的一个类 - 一个很好的例子是数学库或类似的东西。另一种方法是将通用功能提取到一个类或接口中,然后继承和扩展。根据您希望重用的代码,您可能会使用这些方法中的一种(或两种)。
我怀疑你会发现它比你想象的要容易。用一些简单的代码尝试一下,在同一个解决方案中设置一个新项目,从现有代码中引用你的库,看看它是如何进行的。也没有理由不在多个解决方案中引用您的共享项目。
如果开发被移交,拥有共享代码库就不会成为问题。现在,您可以让您的 2 个站点引用您维护的同一个库(或多个库),但是如果并且当您将项目拆分给其他团队时,您可以将共享代码的副本提供给每个团队。