山西建设注册中心网站,wordpress category id,常熟经济技术开发区人才网,自己做的微课上传到哪个网站由于各种原因#xff0c;我最近完成了一个将复杂的财务应用程序从C#xff03;转换为Java的项目。 港口的原因大部分是非技术性的#xff0c;相反#xff0c;这是有关企业的一项战略举措。 这是一次有趣的经历#xff0c;我在此过程中吸取了一些经验教训#xff0c;可以… 由于各种原因我最近完成了一个将复杂的财务应用程序从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库的工作方式。 这些假设并不总是正确的有时我会付出沉重的代价进行调试在这种情况下如果我在原始译文中更加谨慎就永远不会有问题。 花时间阅读要翻译的类的CAPI绝对值得。 我发现在使用Date和DateTime对象时这一点特别重要。 花时间学习Visual Studio IDE也是值得的。 并行调试时如果您知道如何正确使用IDE从长远来看将节省时间。 4.使用Java 8 除了使用Java 8的所有显而易见的原因这是Java的最新版本所以为什么不使用它……之外Stream API也可以很好地映射到CLinq。 语法略有不同例如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