标签: legacy-code

将cout和stdout重定向到C++中用于单元测试的字符串

我正在努力在单元测试下获取一些遗留代码,有时感知现有程序行为的唯一方法是从控制台输出.

我在网上看到很多关于如何将stdout重定向到C++中的另一个文件的例子,但有没有办法可以将它重定向到内存中的流,这样我的测试就不必依赖磁盘了?

我希望将遗留代码发送到stdout的任何内容转换为std :: string,这样我就可以轻松地查找输出.

编辑

遗留代码是如此糟糕,以至于用户混合使用cout << ..printf.这是我到目前为止:

void TestSuite::setUp(void)
{
    oldStdoutBuf = std::cout.rdbuf();
    std::cout.rdbuf(consoleOutput.rdbuf());
}
void TestSuite::tearDown(void)
{
    std::cout.rdbuf(oldStdoutBuf);
}
Run Code Online (Sandbox Code Playgroud)

问题是,这并没有用printf捕捉输出.我想要两件兼得的东西.有任何想法吗?

c++ unit-testing stdout legacy-code

28
推荐指数
1
解决办法
2万
查看次数

从旧数据结构到新数据结构的数据迁移

好的,这就是我们面临的问题.

目前:

  1. 我们有大量具有直接数据库访问权限的旧应用程序
  2. 数据库中的数据结构未规范化
  3. 几乎所有应用程序都使用当前的流程/结构

我们正在尝试实施的内容:

  1. 将所有功能移至RESTful服务,以便没有应用程序可以直接访问数据库
  2. 实现规范化的数据结构

我们遇到的问题是如何不仅使用Applications而且使用数据库实现此迁移.

我们目前的解决方案是:

  1. 确定所有CRUD功能并在新的Web服务中实现此功能
  2. 创建新的应用程序以替换旧版应用程序
  3. 将新应用程序指向新的Web服务(仍指向旧数据结构)
  4. 将数据库中的数据迁移到新结构
  5. 将新应用程序指向新的Web服务(指向新的数据结构)

但正如我们正在讨论这个过程,我们正在考虑两次重写New Web Service.一次用于旧数据结构,一次用于新数据结构,因为目前我们无法代表旧数据结构以适应新Web服务的新数据结构.

我想知道是否有人遇到过这样的挑战,你是如何克服这些类型的问题/实施等的.

database data-migration legacy-code data-structures

26
推荐指数
1
解决办法
5465
查看次数

Windows 7是否支持VB6运行时?

我似乎无法找到一个直接的答案.似乎不支持Visual Studio 6,但我只关心运行时.我们有一些我们不想重写的遗留应用程序,但我们的客户希望它们可以在Windows 7上运行.

如果任何人都可以提供MS关于该主题的官方链接,那将非常有帮助.

vb6 legacy-code windows-7

25
推荐指数
2
解决办法
4万
查看次数

遗产代码梦魇

我继承了一个项目,其中类图非常像一盘意大利面上的蜘蛛网.在过去的两个月里,我写了大约300个单元测试,给自己一个覆盖主要可执行文件的安全网.

在任何特定时刻,我都可以访问我的敏捷开发书籍库:

  • 有效地使用遗留代码
  • 重构
  • 代码完成
  • C#中的敏捷原则模式和实践
  • 等等

问题是我触摸的一切似乎打破了别的东西.UI类混合了业务逻辑和数据库代码.许多类之间存在相互依赖关系.每次我改变任何其他课程时,都会有几个神课程.还有一个带有大约一半实例方法和半静态方法的突变单例/实用程序类(虽然具有讽刺意味的是静态方法依赖于实例而实例方法却没有).

我的前任甚至认为向后使用所有数据集会很聪明.每个数据库更新都作为存储过程中的参数直接发送到数据库服务器,然后手动刷新数据集,以便UI显示最新的更改.

我有时候会想到他们在处理代码之前会使用某种形式的弱混淆来保证工作安全或作为最后的告别.

是否有任何好的资源来解决这个烂摊子?我所拥有的书籍很有用,但似乎只涵盖了我遇到的一半场景.

refactoring legacy-code

25
推荐指数
3
解决办法
3115
查看次数

如何通过反射改变方法行为?

我在一些遗留代码中有一个静态方法,由多个客户端调用.我显然没有选择覆盖它,或通过依赖注入改变行为.我不允许修改现有的类.

我现在要做的是使用反射更改行为(该方法 - 具有相同的签名和返回类型).

可能吗 ?如果没有,任何设计模式都能救我吗?

谢谢 !

编辑:对于我可以更改/修改的内容存在一些疑惑.我无法更改任何现有的类/方法 - 但我可以为项目添加更多类.我能用现有类做的最好的就是注释它们.这样做是为了避免破坏现有代码中的任何内容 - 这意味着对一个大项目进行了一轮完整的测试.

编辑2:java.lang.Instrumentation不适用于Android - 或者它听起来很合适!

java android design-patterns legacy-code

25
推荐指数
2
解决办法
3万
查看次数

C函数的隐式int返回值

我用Google搜索,似乎无法找到这个简单问题的答案.

使用遗留代码库(最近移植到Linux,并慢慢更新到新的编译器),我看到了很多

int myfunction(...)
{
// no return...
}
Run Code Online (Sandbox Code Playgroud)

我知道函数的隐式返回TYPE是int,但是当没有指定返回时,隐式返回VALUE是什么.我已经测试过并且得到了0,但这只是用gcc.这个编译器是特定的还是标准定义为0?

编辑:12/2017调整接受的答案基于它引用更新版本的标准.

c function legacy-code

24
推荐指数
4
解决办法
2万
查看次数

糟糕系统设计的代码重构

我是一名初级软件工程师,他接受了接管旧系统的任务.根据我的初步评估,该系统存在一些问题.

  1. 意大利面条代码
  2. 重复的代码
  3. 10k及以上的课程
  4. 使用log4j进行误操作和过度记录
  5. 糟糕的数据库表设计
  6. 缺少源代码控制 - >我为此设置了Subversion
  7. 缺少文档 - >除了阅读代码之外,我不知道业务规则

我该怎么做才能提高系统质量并解决这些问题?我可以考虑使用静态代码分析软件来解决任何不良编码实践.

但是,它无法检测到任何不良设计问题或问题.我该如何逐步解决这些问题?

java refactoring legacy-code

23
推荐指数
5
解决办法
1827
查看次数

如何在现有的rails引擎中生成虚拟应用程序

我最近为一家公司工作,该公司一直致力于特定的铁路项目.在开发过程的中间,我开始回去为现有代码以及当前正在生成的代码编写测试.测试rails 4 app非常简单,但是一旦我开始测试引擎,我就会遇到心理障碍.在做了尽职调查之后,我发现大多数人采取这样的方法(http://viget.com/extend/rails-engine-testing-with-rspec-capybara-and-factorygirl),但我看到的共同点在所有这些响应中,人们正在从头开始构建这些应用程序,因此自动为它们生成了一个虚拟应用程序.我没有了能够产生一切从零开始的利益,并与他们给我什么样的工作,所以我想知道的是,如果有一种方法来追溯产生只是虚拟应用程序.有什么简单的东西我可以在控制台中输入并为我生成它吗?还是有更长,稍微不那么漂亮的路线?或者一个不同的策略会更好吗?

rspec ruby-on-rails legacy-code rails-engines ruby-on-rails-4

23
推荐指数
1
解决办法
5378
查看次数

我正在维护一个40K行长的Java类..问题?

这可能是导致删除的主观问题,但我真的想要一些反馈.

最近,我转到另一个非常大的企业项目,在那里我作为开发人员工作.我惊讶地发现项目中的大多数类都是从8K到50K行的长度,方法是1K到8K行.它主要是处理数据库表和数据管理的业务逻辑,充满了处理用例的条件语句.

类在大型企业系统中是否常见?我意识到没有看代码很难做出决定,但是你曾经在一个有这么大的类的系统上工作吗?

java maintenance legacy-code

21
推荐指数
5
解决办法
3542
查看次数

熟悉继承代码库的最佳方法

堆叠器没人问过新程序员进入现场时发现最令人震惊的事情.

列表中的高位是继承代码库的影响,必须迅速熟悉它.突然发现自己有责任维护N行代码,这些代码已被纠缠在一起,知道多长时间,以及在短时间内开始为此做出贡献,这可能会非常震惊.

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

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

我添加了社区建设标签,因为我也想听一些关于这些过渡的战争故事.随意分享您如何处理特别紧张的学习曲线.

language-agnostic legacy-code

20
推荐指数
3
解决办法
4421
查看次数