标签: legacy-code

从jquery 1.3升级到1.4的最佳方法是什么?

我正在尝试根据我们使用的所有库来确定升级是否可行.问题是这些插件中的一些不再被开发,所以我不确定它们中的哪一个与1.4兼容

关于如何最好地处理旧版插件的遗留依赖关系的任何想法?

jquery upgrade legacy-code

5
推荐指数
2
解决办法
372
查看次数

UnitTesting返回复杂数据集的类

经过几个月的挫折和在先前开发人员的巫毒娃娃中插入针头所花费的时间后,我决定尝试重构遗留代码.

我已经订购了Micheal Feather的书,我正在进行Fowler的重构,我用DUnit做了一些示例项目.

所以即使我不掌握这个主题,我觉得是时候采取行动并将一些想法付诸实践.

我工作的代码几乎100%都包含在UI中的业务逻辑,而且所有都是过程式编程(除了少数例外).应用程序开始快速而肮脏,并继续这样.

现在为我的所有应用程序编写测试都是毫无意义的任务,但我想尝试对需要重构的东西进行单元测试.

一个大的"TForm业务逻辑类"的复杂任务之一是读取DB数据,进行一些计算并填充调度程序组件.我想删除读取数据库数据和计算部分,并将此任务分配给新类.当然这是一种改进当前设计的方法,它不是从头开始的最佳方式,但我想这样做是因为这个新类返回的数据在其他方面也很有用,例如现在我已被要求发送调度数据的电子邮件通知.

因此,为了避免大规模的复制和粘贴操作,我需要新的类.

现在,调度程序是从一个巨大的数据集(大小和字段数量)填充的,可能第一个重构步骤可能是从新类中获取数据集.但是在将来我最好使用一个新类(比如TSchedulerData或其他一些不太受调度程序限制的名称)来管理数据,而不是将数据集作为结果我可以拥有一个TSchedulerData对象.

由于重构发生在小步骤并且需要测试以更好地重构我对如何继续进行有点困惑.

我不清楚以下几点:

1)如何测试复杂的数据集?我应该运行工作应用程序,将一个结果集保存到xml,并编写一个测试,我使用包含该xml数据的TClientDataSet吗?

2)我需要多少关心TSchedulerData?我的意思是我不是100%肯定我会使用TSchedulerData,可能我会坚持使用数据集,无论如何想要创建将在2周内丢弃的复杂测试对于DUnitNewbee并不吸引人.无论如何,这可能是它的工作原理.我无法想象没有测试我会遇到的错误数量.

最后说明:我知道有人认为从头开始重写是一个更好的选择,但这不是一个选择."该应用程序非常庞大,今天已售出,今天需要新功能才能停止运营".这就是我被告知的,无论如何,重构可以挽救我的生命并延长应用程序的使用寿命.

delphi refactoring unit-testing legacy-code

5
推荐指数
1
解决办法
522
查看次数

在 PHP 中,如何将过程代码包装在一个类中?

我有一大块遗留的 php 代码,我需要与之交互,如下所示:

//legacy.php

function foo() {
}

function bar() {
}
Run Code Online (Sandbox Code Playgroud)

我希望能够将这些遗留函数包装在一个类中或以某种方式 require_once 而不污染全局命名空间或更改原始文件。

php namespaces legacy-code

5
推荐指数
1
解决办法
1968
查看次数

将TDD回溯应用到C#代码库的最佳选择

我有一个由5个C#库组成的现有框架,该框架自2006年以来使用得很好,并且是我大多数项目的主要代码库.我公司希望出于软件质量的原因推出TDD; 通过许多教程和阅读理论,我了解TDD的好处.

时间不是无限的我需要为实际的方法制定计划.据我所知,我看到的选项是:

A)可以使用一个测试项目来重叠来自所有5个库组件的对象.一系列高级测试可能是最初被视为非常大的软件库的起点.

B)5个库组件中的每一个的测试项目.这些项目将在最低级别测试功能,与其他库组件隔离.

C)由于代码被广泛认为有效,因此只需对错误修复或新功能添加单元测试.使用重现错误的步骤编写一个测试,该测试在包含错误的逻辑上失败.然后重新计算代码,直到测试通过.现在您可以确信错误已得到修复,并且以后也不会在循环中引入

无论选择哪个选项,都可能需要"Mocking"来替换外部依赖项,例如:

  • 数据库
  • 网络服务
  • 配置文件

如果有人有任何更多的输入,这将是非常有帮助的.我计划在Visual Studio 2010中使用Microsoft内置的MSTest.

c# tdd mstest mocking legacy-code

5
推荐指数
2
解决办法
650
查看次数

使用依赖注入将应用程序中的词典保存在何处

我有一个遗留代码,我有重构器的问题.

在我的应用程序开始时,我从WCF属性加载App(这是SL应用程序)用户列表.

然后,每个控件(用于发送电子邮件,查看日历和分配任务)都使用此属性

(App.Current as App).Users
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试为使用此列表的控件之一创建单元测试,而且我被卡住了.

我应该使用Appas参数进行构造函数注入(我使用Unity)吗?或者可能会介绍一些类来保存这个列表?

c# dependency-injection legacy-code inversion-of-control

5
推荐指数
1
解决办法
632
查看次数

如何将好的代码与传统/怪癖模式代码分开

鉴于一些库,实现了一些广泛的协议或类似的(例如FTP)的东西,我怎么会保持我的标准兼容的代码单独从只需要能够与不那么符合标准的系统进行合作的代码?

一个很好的例子,这也是有意义的恕我直言,像jQuery这样的库必须考虑所有这些浏览器的特性.必须保持传统兼容性的项目可能也是这些技术的良好目标受众.

我对ruby解决方案特别感兴趣,但也欢迎语言无关的模式或来自其他语言的好例子.

我已经在stackoverflow上找到了一个相关的问题,但还有其他方法吗?

language-agnostic legacy-code

5
推荐指数
1
解决办法
116
查看次数

需要一些关于从Motif迁移到Gtk的建议

我正在做一个关于将遗留GUI程序从Motif迁移到Gtk的项目.源代码很长(大约80k行).现在我有两个计划:

  1. 只需找到Motif函数和Gtk的相应关系.然后编写一些脚本来自动执行此转换.当然,这不能100%自动完成,需要手动工作.
  2. 从源代码返回GUI程序的体系结构.构建一个树状结构,然后根据结构使用Gtk重新构建程序.

关于这两个计划,请给我一些建议.任何想法或想法也受到热烈欢迎.

c x11 gtk motif legacy-code

5
推荐指数
1
解决办法
545
查看次数

无效指针的迭代器可以解决怪癖和怪异问题,或者如何不在脚下射击自己

在过去(当C是幕后的主流语言和STL /模板是Alex Stepanov的梦想)时,为了使程序员实现函数和数据容器的通用性,将void*其用作输入参数(用于函数通用性)或底层容器类型(对于数据容器的一般性).一个典型的例子是qsort,它位于<cstdlib>.

现在,在处理遗留的代码库或恐龙编写的代码时,您很可能会偶然发现在这种范例下设计的数据结构,这些数据结构将其元素保留在void**缓冲区中.您的主要目标之一应该是逐步将代码库移至使用现代STL容器和算法,直到这些旧数据结构过时.然而,也有恐龙要与之抗争,也许是一个恰好是你的经理的霸王龙.为了使他们相信C++/STL的优越性而不质疑遗留数据结构的"可用性",这些遗留数据结构已经运行了多年而没有问题并且没有冒犯他们(因为他们可能是原作者),我决定参与政治问题.

我以为是制作一个模板迭代器,可以处理这样的void**缓冲区,并会作为与STL算法(如桥std::sort,std::copy等等).

下面是一个非常早期的迭代器:

template<typename T>
class Iterator : public std::iterator<std::bidirectional_iterator_tag, T> {
  using T_ptr = std::remove_pointer_t<T>*;
  void  **pos;
public:  
  Iterator(void **pos_) : pos(pos_) {  }
  bool operator==(Iterator const &other) const { return pos == other.pos; }
  bool operator!=(Iterator const &other) const { return pos != other.pos; }
  bool operator<( Iterator const &other) const { return pos <  other.pos; }
  bool operator>( Iterator const …
Run Code Online (Sandbox Code Playgroud)

c++ iterator stl legacy-code void-pointers

5
推荐指数
0
解决办法
212
查看次数

如何使用单元测试覆盖由预处理器#ifdefs 控制的 C++ 遗留代码?

我继承了一个不太大的 C++ 遗留代码,我目前正在重新设计。到目前为止,我对大部分代码都非常了解并且能够使用它,尽管维护工作很糟糕。我认为主要的困难在于大量使用预处理器指令来控制程序的行为。

考虑以下示例:

void function(){
    ... // lots of code 
    #ifdef PARAMETER == 1
        do_one_thing();

    #elif PARAMETER == 2
        do_another_thing();
    ...//etc
    #endif
    ...//lots of code
}
Run Code Online (Sandbox Code Playgroud)

或者

void function(double arg1,
             #ifdef SOME_PP_VAR1 == 5
             double arg2,
             #endif
             )
Run Code Online (Sandbox Code Playgroud)

和类似的东西

#ifdef SOME_PP_VAR2 == 2
    typedef myVector std::vector<double>;
#elif SOME_PP_VAR2 == 7
    typedef myVector std::vector<int>;
#endif
Run Code Online (Sandbox Code Playgroud)

在全球范围内。甚至

#ifdef SOME_PP_VAR2 == 2
    #include "some_header.hpp"
#elif SOME_PP_VAR2 == 7
    #include "some_other_header.hpp"
#endif
Run Code Online (Sandbox Code Playgroud)

大约 30 个这样的预处理器变量被设置在一个配置文件中,该文件被传递给构建系统,然后传递给编译器。它基本上控制着一切,几乎存在于任何文件中。顺便说一句,在某些地方,#ifs 甚至是嵌套的。

因此,编写单元测试相当困难。我必须构建预处理器变量的所有可能组合并测试每个。

到目前为止,我的(糟糕的)想法是:

  • 从头开始重写代码,可能使用不同的语言。(高风险,太费时)。
  • 用常量替换预处理器变量。(并非总是可行)。

你有没有遇到过这样的情况,你是怎么处理的?

c++ unit-testing legacy-code c-preprocessor

5
推荐指数
1
解决办法
101
查看次数

如何在Eclipse中访问内部Java包?

我在Eclipse中使用Java 11(或Java 10)打开了一个遗留Java(8)项目.Eclipse现在正在抱怨无法访问的软件包.例如com.apple.laf.AquaComboBoxUI.

从命令行编译时,我可以通过添加参数来显式访问这些包javac:

--add-exports java.desktop/com.apple.laf=ALL-UNNAMED

有没有办法在Eclipse IDE中执行相同的操作?我试图在JDK库上添加一个可访问的规则.但这似乎没有效果.有任何想法吗?

是的,我知道,我们应该将项目迁移到仅使用官方API.但那是漫长的道路......

java eclipse legacy-code java-11

5
推荐指数
1
解决办法
1402
查看次数