标签: legacy

如何进行大型重构项目?

我即将开始计划我们的代码库的重大重构,我想得到一些问题的一些意见和答案(我已经看到很多关于类似主题的讨论,例如/sf/ 108141/how-do-do-do-working-very-messy-legacy-code, 用于大规模重构的策略,但我有一些具体的问题(在底部):

我们开发了一个复杂的应用 有大约25名开发人员在使用代码库.到目前为止,该产品的总人数约为150年.目前的代码库是一个用ant构建的单一项目.我正在着手的项目的高级目标是将代码库模块化为其各种基础架构和应用程序组件.目前各种逻辑组件之间没有良好的分离,因此很明显,任何模块化工作都需要包含一些API定义并进行严格的解决以实现分离.质量标准很低 - 几乎没有测试,并且绝对没有测试作为构建过程的一部分运行.

另一个非常重要的一点是,该项目需要与活跃的产品开发和发送给客户的版本并行进行.

项目目标:

  • 允许跨不同项目重用组件
  • 将应用程序与基础架构分开,并允许它们独立发展
  • 提高可测试性(通过创建API)
  • 简化开发人员的开发环境(减少检出和编译的代码)

我的想法和问题:

  1. 您对该项目的目标有何看法?你会改变什么?
  2. 你有这些项目的经验吗?会有什么建议吗?
  3. 我非常关心缺乏测试 - 因此我无法控制,因为我知道重构过程并没有像我一样破坏任何东西.这是一个问题22,因为这个项目的目标之一是使我们的代码更可测试...
  4. Michael Feathers的" 有效使用遗产代码 "非常受我的影响.根据它,自下而上的方法是解决我的问题的方法 - 不要首先跳到代码库并尝试修复它,而是通过在几个月内围绕新代码添加单元测试来开始,并看看如何代码(和团队)变得更好,在某种程度上抽象将出现,API将浮出水面,基本上 - 模块化将自己开始发生.有没有人有这方面的经验?正如关于这个主题的许多其他问题所见 - 这里的主要问题是管理上的怀疑."如何按类别进行测试(并花费大量时间这样做)会让我们进入一个稳定的系统?这是一个很好的理论,它在现实生活中不起作用".出售这个的任何提示?

legacy refactoring project-management

21
推荐指数
2
解决办法
5767
查看次数

重写遗留代码

我的部门目前负责维护一个相当大的COBOL代码库.我们想知道如何添加新功能以满足业务需求.COBOL程序员现在很难找到,我们也认为使用Java或C#等更现代的语言可以提高工作效率.

我们认为我们有四种选择:

  1. 从头开始重写所有内容,将旧应用程序留给自己,直到它准备好被替换
  2. 从头开始重写所有内容,让一些人维护旧应用程序,以便在构建新应用程序时满足新的业务需求
  3. 用现代语言编写所有新功能,并找到一些方法将新代码与旧功能集成.
  4. 继续维护旧的应用程序.

您认为我们最好的选择是什么?为什么?

legacy refactoring maintenance cobol

18
推荐指数
5
解决办法
3720
查看次数

C++单元测试遗留代码:如何处理#include?

我刚刚开始使用#include指令为具有大型物理依赖性的遗留代码模块编写单元测试.我一直在处理它们的一些感觉过于繁琐的方法(提供空标题来打破长#include依赖列表,并使用#define来防止编译类)并且正在寻找一些更好的策略来处理这些问题.

我经常遇到几乎每个头文件都复制一个空白版本的问题,以便将我正在测试的类分开,然后为需要的对象编写大量的存根/模拟/伪代码取而代之,因为他们现在尚未定义.

谁知道一些更好的做法?

c++ legacy unit-testing

17
推荐指数
1
解决办法
2838
查看次数

了解和修改大型项目

我是一名新手程序员,作为我项目的一部分,我必须修改一个包含数百个类的开源工具(用java编写).我必须修改它的重要部分以满足项目的需要.在过去的一个月里,我一直在努力尝试阅读代码,试图找出每个类的功能,并试图从头到尾找出管道.

80%的课程都有不完整/缺失的文件.剩下的20%是构成该工具的通用API的那些.一个月的代码阅读刚刚帮助我理解了基本架构.但我无法弄清楚我需要为我的项目做出的确切更改.有一次,我开始修改部分代码,很快就做了很多改变,我再也记不住了.

一位朋友建议我尝试写下类层次结构.是否有更好的(标准?)方式来做到这一点?

java legacy

17
推荐指数
3
解决办法
3454
查看次数

测试旧版PHP Spaghetti代码?

我从开发人员那里继承了一个相当大的,自制的,php4 + MySQL,电子商务项目,他们在写作时自学了编程和html.(我会感到不寒而栗,除非他们能够从头开始做这么多事情,这真是令人印象深刻.)我的工作是保持它并以新功能推进它.

代码的功能取决于$_SESSION数据和其他全局状态结构,然后这些结构会影响代码的流程以及通过require语句显示站点的哪些部分.当我去年接受它时,我的第一个任务是将所有重复内容抽象为单独的文件,这些文件包含在require语句中,并且还从"显示"或输出代码中删除了大部分"逻辑"代码,但我无法删除这一切.我已经将代码转移到了我可以使用的函数中,但这仍然非常有限.类和方法现在肯定是不可能的.

所有测试都是手动/视觉完成的.我想开始自动化一些测试,但我根本不知道从哪里开始.函数的单元测试非常简单,但函数中的代码很少,而且大部分都非常简单.我看phpUnitDbUnit,但所有的实例以及关于它们的讨论集中在类和方法.

那么,除了项目中最琐碎的部分之外,我还有哪些选项可以开始实施单元测试?

php legacy phpunit unit-testing

17
推荐指数
2
解决办法
3101
查看次数

Python:使用附加的输入和输出文件提供和解析与外部程序之间的数据流

问题: 我有一个设计糟糕的Fortran程序(我无法更改它,我坚持使用它)从stdin和其他输入文件中获取文本输入,并将文本输出结果写入stdout和其他输出文件.输入和输出的大小非常大,我想避免写入硬盘驱动器(慢速操作).我编写了一个函数,迭代几个输入文件的行,我也有多个输出的解析器.我真的不知道程序是否首先读取所有输入然后开始输出,或者在读取输入时开始输出.

目标: 拥有一个为外部程序提供所需功能的函数,并在输出来自程序时解析输出,而无需将数据写入硬盘驱动器上的文本文件.

研究: 使用文件的天真方式是:

from subprocess import PIPE, Popen

def execute_simple(cmd, stdin_iter, stdout_parser, input_files, output_files):

    for filename, file_iter in input_files.iteritems():
        with open(filename ,'w') as f:
            for line in file_iter:
                f.write(line + '\n')


    p_sub = Popen(
        shlex.split(cmd),
        stdin = PIPE,
        stdout = open('stdout.txt', 'w'),
        stderr = open('stderr.txt', 'w'),
        bufsize=1
    )
    for line in stdin_iter:
        p_sub.stdin.write(line + '\n')

    p_sub.stdin.close()
    p_sub.wait()

    data = {}
    for filename, parse_func in output_files.iteritems():
        # The stdout.txt and stderr.txt is included here
        with open(filename,'r') as f: …
Run Code Online (Sandbox Code Playgroud)

python legacy io asynchronous

16
推荐指数
2
解决办法
1660
查看次数

为什么颠簸存放?

为什么BMP图像是颠倒存储和零填充的,因此它们是四字节对齐的?

windows legacy image bmp

15
推荐指数
1
解决办法
6584
查看次数

16位C编译器是如何工作的?

C的内存模型,使用指针算法和所有,似乎模拟平面地址空间.16位计算机使用分段存储器访问.16位C编译器如何处理这个问题并从C程序员的角度模拟一个扁平的地址空间?例如,下面的代码在8086上编译成大致的汇编语言指令?

long arr[65536];  // Assume 32 bit longs.
long i;
for(i = 0; i < 65536; i++) {
    arr[i] = i;
}
Run Code Online (Sandbox Code Playgroud)

c legacy x86 assembly 16-bit

14
推荐指数
4
解决办法
1952
查看次数

清理大型遗留Java项目

我被指派在一个庞大的Java项目上做一些工作,并且几个迭代开发人员的影响是显而易见的.没有标准的编码风格,格式,命名约定或类结构.这是我和Javadoc一起上课的好日子,单元测试是一个快乐的白日梦.

到目前为止,我们这个项目的人已经"融入",适应我们正在进行的任何类别的现有惯例,但现在是时候强加一些秩序和一致性.

这是一项艰巨的挑战,我正在寻找人们可能对此类任务提出的任何建议.是否有任何特别有效的策略,或者需要注意的陷阱?尝试是一个好主意吗?

编辑添加:我不想给人一种项目不好的印象 - 它实际上是设计稳固而且写得很好.它只是感受它的年龄和维护的必然性......

java legacy formatting refactoring code-structure

14
推荐指数
2
解决办法
2001
查看次数

Visual Studio 15 __imp___iob,__ imp___pctype,__ imp___mb_cur_max

我正在尝试使用在visual studio中使用mingw编译的库.但是,我收到以下链接器错误:

错误LNK2001:未解析的外部符号__imp___iob

错误LNK2019:函数中引用了未解析的外部符号__imp___pctype

错误LNK2019:函数中引用了未解析的外部符号__imp____mb_cur_max

错误LNK2001:未解析的外部符号_fprintf

我能够通过链接与legacy_stdio_definitions.lib来修复_fprintf错误,如下所示:未解析的外部符号__imp__fprintf和__imp____iob_func,SDL2.

但是,我不知道如何解决其他三个未解决的外部问题.我怎样才能解决这个问题?这些库在Visual Studio 2013下完美运行.

编辑:

好的,这是一个更新.我将libmsvcrt.a从mingw lib文件夹移动到Visual Studio中,然后将其添加到链接器设置中.现在它似乎正常工作.

c++ legacy linker stdio visual-studio-2015

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