- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
关闭。这个问题是opinion-based .它目前不接受答案。
3年前关闭。
锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。
本周我的工作一直在研究一些 10 年前的 C 代码,在实现了一些更改后,我去找老板问他是否还需要做其他事情。那是他扔炸弹的时候。我的下一个任务是浏览大约 7000 行代码并理解更多代码,并对代码进行一定程度的模块化。我问他希望源代码如何模块化,他说开始把旧的 C 代码放到 C++ 类中。
作为一名优秀的员工,我点了点头,是的,然后回到我现在坐的办公 table 前,想知道到底如何使用这些代码,并将其“模块化”。它已经包含在 20 个源文件中,每个文件都有自己的用途和功能。此外,还有三个“主要”结构。这些结构中的每一个都有 30 多个字段,其中许多是其他较小的结构。试图理解它完全是一团糟,但几乎程序中的每个函数都传递了一个指向结构之一的指针并大量使用该结构。
有什么干净的方法可以让我把它硬塞进类吗?如果可以做到,我决心去做,我只是不知道如何开始。
最佳答案
首先,您很幸运,您的老板认识到代码重构可以成为一项长期的成本节约策略。
我已经做过很多次了,即将旧的 C 代码转换为 C++。好处可能会让你大吃一惊。完成后,最终代码可能是原始大小的一半,并且更易于阅读。此外,您可能会在此过程中发现棘手的 C 错误。以下是我将在您的情况下采取的步骤。小步骤很重要,因为在重构大量代码时,您无法从 A 跳转到 Z。您必须经历一些小的中间步骤,这些步骤可能永远不会部署,但可以在您使用的任何 RCS 中进行验证和标记。
private
(是,或 protected ),然后隔离访问该字段的代码。最简单、最非侵入性的转换是使该代码成为 friend function
.还考虑使该代码成为一种方法。将代码转换为方法很简单,但您还必须转换所有调用站点。一个不一定比另一个好。 const
宽松地。自下而上(即调用图的底部)扫过一遍,您将为代码添加更强的保证,并且您将能够从非变体中识别变体。 NULL
并且永远不能重新分配。将引用视为编译时断言,它表示这是有效对象的别名,并表示整个当前范围内的同一对象。 char*
与 std::string
.这一步应该是显而易见的。您可能会大大减少代码行数。另外,用一行代码替换 10 行代码很有趣。有时,您可以消除旨在执行 C++ 中标准的 C 字符串操作的整个函数。 std::vector
或 std::array
.同样,这一步应该是显而易见的。这种转换比从 char
的转换简单得多。至 std::string
因为std::vector
的接口(interface)和 std::array
旨在匹配 C 数组语法。好处之一是您可以消除额外的 length
变量传递给与数组一起的每个函数。 malloc
/free
至 new
/delete
.这一步的主要目的是为以后的重构做准备。仅从 malloc
更改 C 代码至 new
不会直接给你带来很多好处。这种转换允许您向这些结构添加构造函数和析构函数,并使用内置的 C++ 自动内存工具。 new
/delete
与 std::auto_ptr
的操作家庭。 此步骤的目的是使您的代码异常安全。 throw
最低级别的返回代码(C++ 允许您抛出任何您想要的类型)。插入一个 try{} catch(){}
处理错误的代码中的语句。如果没有合适的地方来处理错误,可以考虑包裹main()
的主体。在 try{} catch(){}
声明并记录它。 关于c++ - 如何更新旧的 C 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007707/
在什么情况下我们应该在 JDK 8 中使用旧的 foreach 循环遍历新的 collection.forEach() 还是最好的做法是转换 every foreach 循环?是否存在任何重要的性能差
我想使用新的 CoraData 模型创建应用程序的新版本(由其他人创建)。我的疑问是:核心数据模型通过更新是永久的。我想确保以前的 CoreData 模型不会对新版本的应用程序产生问题。 我必须遵循一
我正在阅读“Dennis Ritchie 的 C 编程语言”,并且在一开始它演示了一个代码,即以下 #include main() { printf("Hello, World"); } 根据本书,这
首先,我知道这个问题在过去几年中在 Stack Overflow 上被提出过几次。问题是有时我会收到新的 PayPal 结帐页面,有时会收到旧页面。 我在沙盒中创建了两个测试帐户。第一个采用新设计,第
我在同一 Google Analytics(分析)帐户中有多个配置文件,但我发现新创建的配置文件的跟踪代码不同。它们会影响跟踪功能吗? 旧代码: var _gaq = _gaq || [];
我是一名优秀的程序员,十分优秀!