我即将开始计划我们的代码库的重大重构,我想得到一些问题的一些意见和答案(我已经看到很多关于类似主题的讨论,例如/sf/ 108141/how-do-do-do-working-very-messy-legacy-code, 用于大规模重构的策略,但我有一些具体的问题(在底部):
我们开发了一个复杂的应用 有大约25名开发人员在使用代码库.到目前为止,该产品的总人数约为150年.目前的代码库是一个用ant构建的单一项目.我正在着手的项目的高级目标是将代码库模块化为其各种基础架构和应用程序组件.目前各种逻辑组件之间没有良好的分离,因此很明显,任何模块化工作都需要包含一些API定义并进行严格的解决以实现分离.质量标准很低 - 几乎没有测试,并且绝对没有测试作为构建过程的一部分运行.
另一个非常重要的一点是,该项目需要与活跃的产品开发和发送给客户的版本并行进行.
项目目标:
我的想法和问题:
我的部门目前负责维护一个相当大的COBOL代码库.我们想知道如何添加新功能以满足业务需求.COBOL程序员现在很难找到,我们也认为使用Java或C#等更现代的语言可以提高工作效率.
我们认为我们有四种选择:
您认为我们最好的选择是什么?为什么?
我刚刚开始使用#include指令为具有大型物理依赖性的遗留代码模块编写单元测试.我一直在处理它们的一些感觉过于繁琐的方法(提供空标题来打破长#include依赖列表,并使用#define来防止编译类)并且正在寻找一些更好的策略来处理这些问题.
我经常遇到几乎每个头文件都复制一个空白版本的问题,以便将我正在测试的类分开,然后为需要的对象编写大量的存根/模拟/伪代码取而代之,因为他们现在尚未定义.
谁知道一些更好的做法?
我是一名新手程序员,作为我项目的一部分,我必须修改一个包含数百个类的开源工具(用java编写).我必须修改它的重要部分以满足项目的需要.在过去的一个月里,我一直在努力尝试阅读代码,试图找出每个类的功能,并试图从头到尾找出管道.
80%的课程都有不完整/缺失的文件.剩下的20%是构成该工具的通用API的那些.一个月的代码阅读刚刚帮助我理解了基本架构.但我无法弄清楚我需要为我的项目做出的确切更改.有一次,我开始修改部分代码,很快就做了很多改变,我再也记不住了.
一位朋友建议我尝试写下类层次结构.是否有更好的(标准?)方式来做到这一点?
我从开发人员那里继承了一个相当大的,自制的,php4 + MySQL,电子商务项目,他们在写作时自学了编程和html.(我会感到不寒而栗,除非他们能够从头开始做这么多事情,这真是令人印象深刻.)我的工作是保持它并以新功能推进它.
代码的功能取决于$_SESSION数据和其他全局状态结构,然后这些结构会影响代码的流程以及通过require语句显示站点的哪些部分.当我去年接受它时,我的第一个任务是将所有重复内容抽象为单独的文件,这些文件包含在require语句中,并且还从"显示"或输出代码中删除了大部分"逻辑"代码,但我无法删除这一切.我已经将代码转移到了我可以使用的函数中,但这仍然非常有限.类和方法现在肯定是不可能的.
所有测试都是手动/视觉完成的.我想开始自动化一些测试,但我根本不知道从哪里开始.函数的单元测试非常简单,但函数中的代码很少,而且大部分都非常简单.我看phpUnit和DbUnit,但所有的实例以及关于它们的讨论集中在类和方法.
那么,除了项目中最琐碎的部分之外,我还有哪些选项可以开始实施单元测试?
问题: 我有一个设计糟糕的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) 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) 我被指派在一个庞大的Java项目上做一些工作,并且几个迭代开发人员的影响是显而易见的.没有标准的编码风格,格式,命名约定或类结构.这是我和Javadoc一起上课的好日子,单元测试是一个快乐的白日梦.
到目前为止,我们这个项目的人已经"融入",适应我们正在进行的任何类别的现有惯例,但现在是时候强加一些秩序和一致性.
这是一项艰巨的挑战,我正在寻找人们可能对此类任务提出的任何建议.是否有任何特别有效的策略,或者需要注意的陷阱?尝试是一个好主意吗?
编辑添加:我不想给人一种项目不好的印象 - 它实际上是设计稳固而且写得很好.它只是感受它的年龄和维护的必然性......
我正在尝试使用在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中,然后将其添加到链接器设置中.现在它似乎正常工作.
legacy ×10
refactoring ×3
c++ ×2
java ×2
unit-testing ×2
16-bit ×1
assembly ×1
asynchronous ×1
bmp ×1
c ×1
cobol ×1
formatting ×1
image ×1
io ×1
linker ×1
maintenance ×1
php ×1
phpunit ×1
python ×1
stdio ×1
windows ×1
x86 ×1