你会如何去换一个相当大(>300),相当成熟C codebase C++?

这种C我想到的是分割成文件的大致对应的模块(即小颗粒比典型的OO类基于分解)使用内部的联系代替私人的功能和数据,和对外联系公众的功能和数据。全球变量广泛使用之间的通信模块。有一个非常广泛的集成试验套房,但没有单元(即模块)的水平测试。

我心中已有一般的战略:

  1. 汇编中的一切C++'s C子集,并得到工作。
  2. 把模块成巨大类,因此,所有交叉参考范围是通过一个类的名称,但留下的所有功能和数据作为静态的成员,并获得了工作。
  3. 转换的巨大类实例,与适当的构造,初始化的交叉参考资料;替换访问静态部件与间接访问为适当的;并获得工作。
  4. 现在,办法的项目作为一个不考虑到面向对象的应用程序,并编写单元测试其中的依赖性都容易处理,并分解成为单独的类别,他们是不;这里的目标是从一个工作程序到另一个在每个转变。

显然,这将是相当多的工作。是否有任何案例研究/战争的故事出有这种翻译?替代战略?其他有用的建议?

注1:该计划是一个编译器,以及可能是数以百万计的其他程序依赖于其行为不改变,因此批发改写,是非常不是一种选择。

注2:该来源是接近20岁,并具有也许有30%代码改动(行修改+加入/前的总行)每年。这是大量维持和扩展,在其它的词。因此,目标之一将是增加mantainability.

[为了这个问题,假定翻译成 C++ 是强制性的,并把它留在C 一种选择。这点加上这一条件被淘汰的"把它留在C"的答案。]

有帮助吗?

解决方案

刚开始几乎同样的事情,几个月前(上一个十岁的商业项目,最初编写的与"C++是什么,但C聪明 structs"的理念),我建议使用同样的策略你用来吃一个大象:把它咬一口的时间。:-)

尽可能把它分成阶段,可以用最小效果的其他部分。建立一个门面系统,作为 Federico Ramponi 建议,是一个很好的开始--一旦一切都有一个C++立面,是通过它,可以更改的内部结构的模块,与公平的确定性,它们不能产生任何影响之外。

我们已经有了一部分C++interface系统中的地方,(由于先前的较小重构的努力),因此这种方法并不难在我们的情况。一旦我们有一切沟通C++的对象(其中采取了几个星期,工作对一个完全独立的源代码分和整合的所有变化的主要分支,因为他们批准),这是非常少,我们就不可能编制一个完全的工作版本之前,我们离开的一天。

的转换并不是完全但我们已暂停了两次关于临时释放(我们瞄准一点-释放每隔几个星期),但这是很好的方式,并且没有客户的投诉有关的任何问题。我们的质量保证的人只有找到一个问题,我记得,太。:-)

其他提示

什么约:

  1. 编制一切C++'s C子集,并得到那工作,
  2. 实施一套 外墙 离开C码不变?

为什么是"翻译成C++强制性"?你可以包C码没有痛苦的转换成巨大的类别等。

你的申请有很多人在它的工作,并且需要不被打破。如果你是认真的大规模转化为面向对象的风格是什么 你需要的是大规模的改造工具,以实现自动化的工作。

基本的想法是指定群体的数据作为课程,然后 获得的工具来重构代码移动,数据入课程, 移动功能上只是就数据纳入这些课程, 和修订所有访问该数据要求在课程。

你可以做一个自动化,以形成统计数据集群获得一些想法, 但是你仍然需要应用程序认识到工程师来决定什么 数据元素应进行分组。

一个工具,是能够这样做的任务是我们的 DMS软件再造 工具包.DMS具有很强的C分析程序用于读取你的代码、捕获C码 作为编译器抽象的法树木,(并不像传统的compiler) 可以计算流量分析整个300SLOC.DMS有C++前结束,可以被用作"后"结束;一个写道:转变图C语法C++的语法。

一个主要C++重组的任务在一个大型航空电子系统 一些想法是什么使用DMS为这种活动。看到的技术文件在 www.semdesigns.com/Products/DMS/DMSToolkit.html, 具体地说 重新设计用C++件模型通过自动程序转换

这个过程中不是微弱的心脏。但是比任何人 该手册将考虑重构的一个大型应用程序 已经是不害怕的艰苦工作。

是的,我是相关联的公司,是它的首席设计师。

我会写C++类在C界面。不是触摸C码将减少有机会搞乱和加快该过程明显。

一旦你有你的C++interface;然后这是一个简单的任务的复制代码贴到您的课程。正如你所提到的--在这一步骤至关重要的是不单元的测试。

海湾合作委员会目前正在midtransition C++从C。他们开始移动一切都变成了共同的子集C、C++,很明显。他们这样做,他们增加了警告,海湾合作委员会对于一切,他们发现,下找到的 -Wc++-compat.这应该得到你的第一部分的你的旅程。

对于后者部分,一旦实际上,你拥有的一切汇编用C++编译器,我将重点放在更换东西已经习惯用C++的同行。例如,如果您使用的列表、地图集、bitvectors,hashtables,等等,这是使用定义C宏,你可能会获得大量的移动这些至C++.同样,与OO,您可能发现的好处在哪里,你都已经使用了C OO语(如结构的继承),其中C++将得到更大的清晰度和更好的类型检查在你的代码。

您的名单看起来还好除了我会建议审查试验的第一套房,并试图获得紧张,因为可能这样做之前的任何编码。

让我们把另一种愚蠢的想法:

  1. 汇编中的一切C++'s C子集,并得到工作。
  2. 开始有一个模块,把它放在一个大类,然后在一个的实例,并建立一个C口(同以一个你从开始)出的实例。让剩余C码的工作,C界面。
  3. 重构为需要的、日益增长的OO子系统出的C码一个模块在一段时间,并降的部分C口的时候他们变得无用。

可能两个要考虑的事情不管你想怎么开始在你想要什么 重点, 和你想要 停止.

你的状态,存在是一个大型代码改动,这可能是一个关键 重点 你的努力。我建议你选的份代码,那里有很多的维修需要,该成熟/稳定的部分是显然是工作还不够,所以它是最好离开他们,因为他们的,除了可能对于一些窗口敷料与外墙等。

你想要停止取决于什么原因是为希望转换到C++。这可不是一个目标本身。如果这是由于一些第3党的依赖关系,专注你的努力上接口,分量。

软件,我的工作是一个巨大的,老码基地已经被'转变'从C至C++年前了。我认为这是因为GUI是转换为夸脱甚至现在仍然主要看起来像一C节目与类。打破依赖关系所引起的公共数据的成员,并重构的巨大类程序怪物的方法为更小的方法和类从来没有真正起飞的,我认为原因如下:

  1. 有没有需要改变代码的工作并不需要得到加强。这样做引入了新的错误而无需添加功能,并最终用户不赞赏;
  2. 它是非常非常难做到"重构"可靠。许多代码是如此之大,也使重要的是,人们几乎不敢碰它。我们有一个相当广泛的功能测试、但足够的代码复盖信息是很难得到。因此,它是难以确定是否已经有足够的测试,以检测问题,在重构过程中;
  3. 投资回报率是难以建立。最终用户不会受益于重构,因此它必须在减少维修费用,这将增加,最初是因为通过重构你引入新的问题在成熟,即相当错误的代码。并且在重构本身将是昂贵的,以及...

NB。我想你知道的"工作有效地与传统的代码"的书吗?

你说,你的工具是一个编译器,而且:"实际上,模式匹配,而不只是种类型的匹配,在多个调度甚至会更好"。

你可能想看一看 maketea.它提供了模式匹配用于Ast,以及AST的定义,从一个抽象的语法和访客,tranformers,等等。

如果你有一个小的或学术项目(说,少于10,000条线),一个重写可能是你最好的选择。你可以的因素它,但是你想要的,这不会花太多时间。

如果你有一个真实世界的应用程序,我建议把它编纂为C++(这通常意味着主要是固定的功能原型等),然后工作上的重构和OO包装。当然,我不同意的理念,代码需要OO结构,以便可以接受C++编码。我会做一件逐件转换、改写和重构为你需要(用于功能或纳入单元测试)。

这是什么我都会做的事:

  • 由于代码是20岁,废下parser/语法分析和替代它的一个较新的lex/yacc/bison(或任何类似的东西)等的基础C++码,更容易维护和更容易理解。快来开发太如果你有一个负责的方便。
  • 一旦这是改装的旧的代码,开始包装模块的入课程。替代的全球/共同变量与接口。
  • 现在你有什么将是一个编译器在C++(不though).
  • 画一类图的所有类在你的系统,并看到他们是如何进行通信。
  • 画出一个又一个使用同一类,看看他们如何应当进行沟通。
  • "重构"的代码转换第一个示意图。(这可能是混乱和棘手的)
  • 请记住,使用C++编码,对所有新代码加入。
  • 如果你有一些剩下的时间,尝试更换数据结构的一个通过一个使用较为标准化的限制或增强。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top