处理相似代码的优雅方式

Elegant way of handling similar code

我有一个运行良好的软件项目。 现在,必须调整该项目以模拟一个新的但相关的系统。 有什么策略可以使这两个代码井井有条? 他们将有一个大约 90% 相同的代码库,但有许多功能需要稍微调整。

我想到了以下几点:

  1. git-repository 中的不同分支:两个项目的完美控制,但必须分别在每个分支中进行公共更改。
  2. 通过 C++ 编译指示对不同的程序模式进行建模(#ifdef Project1 ...): 这会将更改保留在本地,但会使代码难以阅读。

我对这些解决方案不太满意。有没有更好的方法?

我们遇到了同样的问题,以下是我们的解决方法:

  • 我们的 git 仓库中只有一个分支
  • 除了普通文件外,我们根据配置还有不同的文件:access_for_config1.cpp、access_for_config2.cpp、...
  • 我们使用设计模式,如factory,将特定部分抽象为公共部分
  • 对于常见文件中非常具体的小部分,我们有一个 #ifdef 根据配置的部分
  • 根据每个配置,我们在makefile 中有不同的规则:对于一个配置,我们编译普通文件+特定文件并设置正确的标志。此外,在办公室使用 eclipse,我们还定义了不同的构建配置,以允许正确突出显示。

这种方法的优点是使公共部分始终保持同步,并且我们正确地隔离了每个特定部分。

但是,您必须小心每个配置中的 not so far 代码。例如,在不同的特定文件中使用相似(但不相同)的代码,可能的错误只能在一种配置中得到纠正。可以通过将一些代码定义为公共模板或重新考虑设计以将某些部分放在公共模板中来减少它

希望回答对您有所帮助

What strategies are there to keep these two codes well organized? They will have a codebase that is about 90% the same


这不是您真正需要的,但请确保您了解它。

Submodules allow foreign repositories to be embedded within a dedicated subdirectory of the source tree, always pointed at a particular commit.


Different branches in the git-repository: perfect control of the two projects, but common changes have to be made in each of the branches separately.

您可以将更改提交到一个分支,然后使用 cherry-pick 将它们添加到您想要的任何其他分支。