【问题标题】:Elegant way of handling similar code处理类似代码的优雅方式
【发布时间】:2016-07-12 05:46:51
【问题描述】:

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

我想到了以下几点:

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

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

【问题讨论】:

  • 大量#ifdefs 的替代方案是链接时间接缝。例如,您有一个在 Windows 上编译和链接到的 .cpp 文件,以及在 Linux 上编译和链接到的另一个文件。
  • 如果差异适合定义明确的区域,您可以考虑定义接口并使用类来隐藏实现细节 - 有点像驱动程序,但这个概念可以更广泛地应用。
  • 你有没有想过将所有常用代码移到静态库中。您的应用程序将调用函数/创建具有不同参数的对象。

标签: c++ git code-organization pragma


【解决方案1】:

我们也有同样的问题,我们是这样解决的:

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

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

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

希望回答对你有帮助

【讨论】:

    【解决方案2】:

    有什么策略可以使这两个代码井井有条?他们将拥有一个大约 90% 相同的代码库


    这并不完全是您所需要的,但请确保您了解它。

    Submodules 始终允许将外部存储库嵌入到源代码树的专用子目录中指向一个特定的提交。


    git-repository 中的不同分支:完美控制两个项目,但必须分别在每个分支中进行共同更改。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2015-03-22
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      相关资源
      最近更新 更多