由于各种原因,我最近完成了一个将复杂的财务应用程序从C#转换为Java的项目。 港口的原因大部分是非技术性的,相反,这是有关企业的一项战略举措。

这是一次有趣的经历,我在此过程中吸取了一些经验教训,可以分享这些经验。

1.在现有系统上构建语言中立的测试。

我将从最重要的一课开始。 移植系统时,由于任何原因它可能是任何端口,因此必须具有确定该端口是否成功的标准。 最好的方法是围绕原始系统构建一整套测试,这些测试可以“ 无需更改导出”到新系统。 因此,例如,如果要将系统从Java迁移到不支持JUnit的其他语言,则没有一套JUnit测试是不好的。 我不能过分强调测试的更改从字面上可以从旧系统复制到新系统而无需干预的重要性,这是多么重要。

JUnit测试的另一个问题是它们通常与现有的实现紧密地联系在一起。 由于将要重写实现,因此测试无法在实现之间移植。

我们选择的并且非常有效的策略是使用Cucumber测试。 几乎所有语言都有Cucumber的绑定,IDE(至少是IntelliJ和Visual Studio都)很好地支持了Cucumber,此外,该测试是人类可读的。 这样,您可以让非技术用户参与测试的准备工作,以准备端口。 (顺便说一句,我们试图通过记录旧系统所做的所有事情并围绕这些需求构建测试来让用户定义新系统的需求,但这不足为奇,这并不奇怪。基于构建测试用例要好得多而不是尝试为新系统发明它们!)。

使用Cucumber确实是成功的,每当系统之间存在差异时,我们都会创建一个新的测试。 到完成时,我们已经有了大约1000种方案,我们对新系统的正确性充满信心。 它为我们提供了坚实的基础,我们需要继续开发新系统中的其他功能和重构。

2.尝试并使尽可能多的翻译自动化。

当面对超过25k行的C#时,考虑将每行手动翻译成Java是一件非常艰巨的任务。 幸运的是,那里提供了非常有用的工具。 我们使用的产品来自有形软件解决方案 。 花了几百美元,它实际上节省了数百个工时。 它无论如何都不是完美的,但是它将为您提供Java代码的结构(部分允许C#中的类的代码被拆分成多个文件),并做出了使您可以使用Java的相当不错的尝试。

在我们的案例中,几乎没有任何生成的代码可以实际编译,但这确实是一个很好的起点。 我的类比是OCR的早期尝试。 您可以扫描文档,但是当您在编辑器中打开文档时,您会发现许多未正确识别的单词带有红色下划线。 这是要遍历所有红色底线并弄清楚单词应该是什么的问题。 自动翻译产生的代码大同小异,当它被导入IDE时,会出现许多编译器错误。 有时自动化会留在原始C#中,并说无法自动完成翻译。 值得称赞的是,该工具总是偏于保守,它从未对所产生的Java犯错,这一点很重要。

3.不要着急翻译

运行自动翻译后,您需要返回代码并手动修复编译错误。 如果我有时间,我将花费10倍以上的时间来确保对代码所做的每个更改都是绝对正确的。 由于我不是C#专家,所以有时我会假设C#库的工作方式。 这些假设并不总是正确的,有时我会付出沉重的代价进行调试,在这种情况下,如果我在原始译文中更加谨慎,就永远不会有问题。 花时间阅读要翻译的类的C#API绝对值得。 我发现在使用Date和DateTime对象时,这一点特别重要。

花时间学习Visual Studio IDE也是值得的。 并行调试时,如果您知道如何正确使用IDE,从长远来看将节省时间。

4.使用Java 8

除了使用Java 8的所有显而易见的原因(这是Java的最新版本,所以为什么不使用它……)之外,Stream API也可以很好地映射到C#Linq。 语法略有不同,例如Java使用'->'和C#使用'=>' ,但是使用Java 8的新功能确实有助于保持代码的可比性,这在进一步调试时都很有帮助。

5.注意意外行为

语言的某些功能是您不应该依赖的,但可能会完全一样。 让我举一个我花了太多时间的例子来说明。 C#代码使用的是Dictionary ,代码生成器将Dictionary正确翻译为HashMap 。 两者都是无序地图。 然而,尽管Dictionary是无序的合同(还有一个OrderedDictionary )当迭代通过Dictionary似乎保留插入顺序。 HashMap并非如此,并且由于元素的顺序对于结果HashMap ,因此我们发现了难以调试的差异。 解决方案是用确实保留顺序的LinkedHashMap替换HashMap所有实例。

6.不要过早重构

从代码生成器生成的代码不是很漂亮。 实际上,这看起来非常恐怖,几乎违反了有关命名约定等的所有规则。随着时间的流逝,它很容易整理。 抵制这种诱惑,直到所有单元测试都通过为止。 您以后总是可以整理一下。 重构(甚至重命名)可能会引入错误,尤其是在定义上您不熟悉的代码库中。 同样,您可能决定在某个地方重新运行代码生成器,并且所有整理工作最好都需要合并,最糟糕的是浪费时间。

结论

即使您不太熟悉C#,将相当复杂的程序从C#转换为Java也并非不可能。 使用正确的工具和技术,并严格进行可靠和可重复的测试,将对您的项目成功产生重大影响。

翻译自: https://www.javacodegeeks.com/2015/05/lessons-learnt-translating-25k-line-of-c-into-java.html

将25k行C#转换为Java的经验教训相关推荐

  1. java转换为c#_将25k行C#转换为Java的经验教训

    java转换为c# 由于各种原因,我最近完成了一个将复杂的财务应用程序从C#转换为Java的项目. 港口的原因大部分是非技术性的,而是对相关企业的一项战略举措. 这是一次有趣的经历,我在此过程中吸取了 ...

  2. java转换为c#_C#vs Java哪一个更快? 将25k C#转换为Java(2)

    java转换为c# 在上一篇文章中,我描述了如何将25k行C#转换为Java以及从该练习中学到的教训. 我收到以下问题: 顺便说一句很棒的文章. 移植代码后,性能与C#版本相比如何? 改写系统的动机之 ...

  3. C#vs Java哪一个更快? 将25k C#转换为Java(2)

    在上一篇文章中,我描述了如何将25k行C#转换为Java以及从该练习中学到的教训. 我收到以下问题: 顺便说一句很棒的文章. 迁移代码后,性能与C#版本相比如何? 改写系统的动机之一是使系统变得更快, ...

  4. 现代化历险记:策略+将COBOL转换为Java的示例

    在Keyhole Software,我们在很大程度上是一家现代化公司. 我们拥有一些顾问,他们专门研究将旧的代码迁移到新的,翻新的残旧代码库,并为大多数已经被供应商锁定的企业设计更光明的未来. 作为这 ...

  5. java 读取图片给 matlab_如何将MATLAB图像处理程序转换为java?

    将Matlab代码转换为Java代码有几个一般的缺陷.我将Matlab转换成C代码,所以我的建议来自于这些经验. >如果你在Matlab中使用for循环,一般来说,你做错了.添加矩阵(图像等)是 ...

  6. cobol和java_现代化历险:策略+将COBOL转换为Java的示例

    cobol和java 在Keyhole Software,我们在很大程度上是一家现代化公司. 我们有一些顾问,专门研究将旧的代码迁移到新的,翻新的残旧代码库,并为大多数已经被供应商锁定的企业设计更光明 ...

  7. java高深技术总结_一名25K以上的高薪Java程序员总结出的技术以及学习技能

    原标题:一名25K以上的高薪Java程序员总结出的技术以及学习技能 总所周知,Java是目前使用最为广泛的网络编程语言之一. 它具有简单,面向对象,稳定,与平台无关,解释型,多线程,动态等特点. 一般 ...

  8. 转]一个计算机专业学生几年的Java编程经验汇总

    1. 关于动态加载机制?? 学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分.很多人都能背出来Java语言的特点,所谓的动态加载机制等等.当然概念往往是先记住而后消化的 ...

  9. JAVA编程经验汇总 (载)

    1. 关于动态加载机制?? 学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分.很多人都能背出来Java语言的特点,所谓的动态加载机制等等.当然概念往往是先记住而后消化的 ...

最新文章

  1. 芯灵思Sinlinx A64开发板 Linux内核等待队列p
  2. 【代码托管】如何使用Git工具托管本地代码到GitHub(也许是最简单易懂的图文教程)【含 Git+第三方工具TortoiseGit+中文语言包 百度云盘资源】
  3. php的json_encode实例,php json_encode()函数返回json数据实例代码
  4. 深度学习总结:用pytorch做dropout和Batch Normalization时需要注意的地方,用tensorflow做dropout和BN时需要注意的地方,
  5. 富士康工业互联:生产口罩优先用于内部防疫 预计对经营业绩影响较小
  6. Idea 中使用Lombok 编译报找不到符号
  7. 【深入理解JS核心技术】13. 什么是高阶函数
  8. 2008年12月12号,星期五晴。为人父,却不能尽父责,为人夫,却不能尽夫责。这种痛楚什么时候才能结束。
  9. OB0202 obsidian kanban插件使用
  10. springboot+shiro+nutz+beetl + mysql
  11. App推广及游戏推广,如何才能大规模起量
  12. 二叉平衡树的算法复杂度笔记
  13. CPU巨型机,大型机,中型机,小型机和微型计算机中央处理器都称为CPU、MPU(微型化的CPU,在微机中CPU=MPU)、MCU和SOC
  14. python自动化ppt_python自动化办公手册之python操作PPT
  15. 数学建模国赛论文怎么写?
  16. 人工智能芯片龙头之一gti概念股_AI芯片相关股票有哪些?AI芯片概念股票龙头一览...
  17. 《哪吒》票房破25亿,我用AI分析了它20W+评论数据
  18. python大数据好不好学_大数据好学吗?想转行大数据??
  19. 关于adsl宽带猫的一个奇怪问题
  20. 哈工大+讯飞推出:高效预训练模型压缩方案GRAIN

热门文章

  1. JS中对象创建的五中方式
  2. 用赫夫曼树进行文件的压缩
  3. @ResponseBody导致的返回值中文乱码
  4. ddm模型公式_简单判断目前行情——从股利贴现模型切入
  5. windows为什么把linux打败了,快二十年了,人们为什么还是没有抛弃 Windows 转向 Linux?...
  6. synchronized原理_Java并发编程 -- synchronized保证线程安全的原理
  7. Spring boot(九):定时任务
  8. spock测试_将Spock 1.3测试迁移到Spock 2.0
  9. aws eks_在生产中配置和使用AWS EKS
  10. javafx按钮设计风格_Java,JavaFX的流畅设计风格按钮,切换按钮和工具提示