问题标签 [legacy-code]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
2437 浏览

c++ - 清理遗留代码“标题意大利面条”

清理导致编译时间极慢(Linux / Unix)的“标题意大利面条”的任何推荐做法?

GCC 有没有相当于“#pragma once”的东西?
(发现与此有关的相互矛盾的消息)

谢谢。

0 投票
6 回答
7335 浏览

legacy-code - 如何最好地集成多个系统?

好吧,在我工作的地方,我们维护了过去几十年编写的相当多的系统。

这些系统多种多样,包括多种操作系统(Linux、Solaris、Windows)、多种数据库(Oracle、sybase 和 mysql 的多个版本),甚至多种语言(C、C++、JSP、PHP 和许多其他语言)用过的。

每个系统都是相当自主的,即使是以将相同的数据输入多个系统为代价。

管理层最近决定,我们应该调查如何让所有系统愉快地相互交谈和共享数据。

请记住,虽然我们可以对任何单个系统进行软件更改,但对任何一个(或更多)系统进行完全重写并不是管理层可能会接受的事情。

这里几个开发人员的第一个想法是直截了当的:如果系统 A 需要来自系统 B 的数据,它应该连接到系统 B 的数据库并获取它。同样,如果它需要给 B 数据,它应该只是将它插入到 B 的数据库中。

由于使用的数据库(和版本)混乱,其他开发人员认为我们应该拥有一个新数据库,将来自所有其他系统的表结合起来,以避免不得不处理多个连接。通过这样做,他们希望我们能够合并一些表并摆脱冗余数据输入。

这大约是我被请来对整个混乱发表意见的时候了。

使用数据库作为系统通信手段的整个想法对我来说很有趣。业务逻辑必须放置在多个系统中(如果系统 A 想向系统 B 添加数据,则在插入之前更好地理解 B 的有关数据的规则),几个系统很可能必须进行某种形式的数据库轮询才能找到对其数据的任何更改,持续维护将是一件令人头疼的事情,因为对数据库模式的任何更改现在都会传播多个系统。

我的第一个想法是花时间为不同的系统编写 API/服务,一旦编写,就可以轻松地来回传递/检索数据。许多其他开发人员认为这比仅仅使用数据库要多得多,而且工作量要大得多。

那么让这些系统相互通信的最佳方式是什么?

0 投票
11 回答
4350 浏览

refactoring - 您可以对对提高质量产生最大影响的遗留代码库做些什么?

当您在遗留代码库中工作时,随着时间的推移,什么会对提高代码库的质量产生最大的影响?

  • 删除未使用的代码
  • 删除重复代码
  • 添加单元测试以提高覆盖率低的测试覆盖率
  • 跨文件创建一致的格式
  • 更新第 3 方软件
  • 减少静态分析工具(即Findbugs)产生的警告

多年来,该代码库由许多具有不同专业水平的开发人员编写,其中许多领域未经测试,有些无法测试,而无需花费大量时间编写测试。

0 投票
3 回答
656 浏览

c++ - 在 C++ 应用程序中查找未引用的方法

我们有一个大型的 C/C++ 遗留源代码树,它已经出现了几次。我们预计有大量的方法不再使用。有没有工具可以帮助我们快速识别未使用的代码?

0 投票
3 回答
1235 浏览

java - 如何用 final 方法模拟一个类?

说我有A类

现在我有B级

我将如何对这种方法进行单元测试?原因foo()是最终的,因为我们不希望扩展 A 的类改变其功能。但是在真正对方法进行单元测试的同时,我不希望它伸出手来运行实际的A.foo()方法。

有没有办法,比如说,删除 final 关键字并添加注释@finalUnlessTest?你会推荐什么?将 A 重构为接口将非常非常困难,因为它是我们的中心类之一,并且不幸的是非常耦合。

编辑#1对不起,忘了提,我们说的是 Java。到目前为止,我们还没有使用模拟框架。

回答好,所以:哇。JMockit简直令人难以置信,在我看来,它是测试遗留代码的杀手级应用。令人难以置信的有用,尤其是在我的情况下。非常感谢!您基本上会为我的伪示例执行以下操作:

这是他妈的酷还是什么?

0 投票
13 回答
5472 浏览

language-agnostic - 熟悉继承代码库的最佳方式

Stacker 没有人询问新程序员进入该领域时发现的最令人震惊的事情

排在首位的是继承一个必须迅速熟悉的代码库的影响。突然发现自己负责维护 N 行代码,这些代码已经被拼凑了多久,并且有很短的时间开始为它做出贡献,这可能会非常令人震惊。

您如何有效地吸收所有这些新数据?是什么缓解了这种转变?已经为足够多的开源项目做出贡献的唯一真正的解决方案是冲击消退吗?

这也适用于资深程序员。您使用什么技术来简化向新代码库的过渡?

我为此添加了 Community-Building 标签,因为我还想听听一些关于这些过渡的战争故事。随意分享您如何处理特别紧张的学习曲线。

0 投票
19 回答
13640 浏览

legacy - 熟悉大型代码库的最佳方式是什么?

加入一个拥有庞大代码库的现有团队可能会令人生畏。什么是最好的方法;

  • 广阔; 尝试从代码中大致了解所有内容如何链接在一起
  • 狭窄的; 一次专注于一小段代码,了解它们是如何充分工作的
  • 选择一个功能来开发和学习
  • 尝试从类图和 uml 中获得洞察力,如果可用(并且是最新的)
  • 完全不同的东西?

我正在研究目前大约 20k 行的 C++ 应用程序和库(编辑:在宏伟的计划中很小!)。在行业中,我想您会得到一位经验丰富的程序员的介绍。但是,如果不是这种情况,您可以做些什么来尽快开始增加价值?

--
答案总结:

  • 在调试模式下单步执行代码以查看它是如何工作的
  • 与比您更熟悉代码库的人配对,轮流担任编码人员和观看/讨论的人员。在团队成员中轮换合作伙伴,以便知识传播。
  • 编写单元测试。从你认为代码如何工作的断言开始。如果结果如您所料,您可能已经理解了代码。如果没有,你有一个难题要解决和/或进行调查。(谢谢Donal,这是一个很好的答案)
  • 以与上述类似的方式检查功能代码的现有单元测试
  • 阅读 UML、Doxygen 生成的类图和其他文档以全面了解代码。
  • 进行小的编辑或错误修复,然后逐步建立
  • 记笔记,不要跳进去开始开发;花时间理解比生成混乱或不适当的代码更有价值。

这篇文章是the-best-way-to-familiarize-yourself-with-an-inherited-codebase的部分副本

0 投票
5 回答
723 浏览

java - 遗留代码中的泛型

我们有相当多的代码刚刚跳转到 Java 5。我们一直在那些旨在在 Java 5 版本中发布的组件中使用泛型,但是剩下的代码当然充满了原始代码类型。我已将编译器设置为为原始类型生成错误并开始手动清除它们,但按照目前的速度,它需要长时间才能完成(大约有2500 个错误)。这就是 Eclipse 有用的 Infer Generic Type 快速修复,它总是可以消除错误,但通常会生成需要进一步工作的代码。

有没有更好的方法来处理这个问题?有没有比 Eclipse 更好的自动化工具?有什么方法可以将重构应用于所有事件而不是一个一个地进行?还是您只是忽略警告?

0 投票
8 回答
36801 浏览

c++ - 遗留 C/C++ 项目中的死代码检测

您将如何在 C/C++ 代码中进行死代码检测?我有一个相当大的代码库可供使用,至少 10-15% 是死代码。是否有任何基于 Unix 的工具来识别这些区域?有些代码仍然使用大量的预处理器,自动化过程可以处理吗?

0 投票
3 回答
1809 浏览

security - 使用经典 ASP 构建“退出”页面,避免主要的跨站点脚本陷阱

我正在更新一个经典的 ASP 网页,该网页由我工作的公司维护的许多子站点使用。

该页面的目的是通知用户他们将离开“我们的”网站并前往另一个网站。它基本上是免责声明,但由于资源限制和时间限制,我无法将免责声明添加到我们管理的每个站点。

这是问题的症结所在。当前代码从查询字符串中提取一个变量以在新窗口中创建“继续”链接。这显然会以跨站点脚本的形式产生许多问题。

如何处理此更新以消除大多数(如果不是全部)使用 vbScript/ASP 的跨站点脚本问题。

我正在使用的代码如下。