将25k行C#转换为Java的经验教训

由于各种原因,我最近完成了一个将复杂的财务应用程序从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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark K-Means

K-Means(K均值) 介绍 K-Means是被应用的最广泛的基于划分的聚类算法,是一种硬聚类算法,属于典型的局域原型的目标函数聚类的代表。算法首先随机选择k个对象,每个对象初始地代表一个簇的平均值或者中心。对于剩余的每个…

【APICloud系列|30】苹果MAC电脑取消辅助功能-语音识别

方法:快捷键 “commandF5”即可。 原因是不小心出现这个辅助功能,导致我进入苹果商店输入密码不能正常切换大小写,快捷键 “commandF5”就可以正常使用

kail利用msf工具对ms17-010(永恒之蓝)漏洞入侵渗透Win7

kail利用msf工具对ms17-010(永恒之蓝)漏洞入侵渗透Win7 前言: 提到操作系统漏洞,大家肯定听说过耳熟能详的永恒之蓝(MS17-010)了,他的爆发源于WannaCry勒索病毒的诞生。 该病毒是不法分子利用…

mysql 删除版本信息_linux 删除mysql

写作背景明天项目上线,今天晚上在客户的机房进行网站的部署,在安装mysql的时候出现了一个问题,就是死活安装不上,说已经存在mysql,最后分析错误信息才知道,原来是centos 6.3 自带安装了mysql 5.1,因为我是通…

微信连接WIFI并关注公众号的方法

分享一个改造路由器来实现微信连wifi关注公众已经成为一种高效的引流方法。 前提是先有自己的路由器、认证的公众号(服务号或订阅号)、开通过门店小程序。 1.进入公众号后以此选择“微信连wifi”→“设备管理”→详情,拿到公众号的三个参数…

《你的灯亮着吗》读后感1

《你的灯亮着吗》这本书主要讲了几个实际的问题,在还没读这本书时对这本书有一定的了解,所以在读这本书时也是有一定的目的,在这本书中可以学到好多的东西,在作者分析问题和解决问题中我们可以找到好多新奇的思路。 我已读这本书有…

kali利用msf工具对ms08-067漏洞入侵靶机(win xp2)

kali利用msf工具对ms08-067漏洞入侵靶机(win xp2) 漏洞简介 MS08-067漏洞将会影响Windows 2000/XP/Server 2003/Vista/Server 2008的各个版本,甚至还包括测试阶段的Windows 7 Pro-Beta。 如果用户在受影响的系统上收到特制的 RPC 请求&…

tomcat mysql如何优化_Tomcat+Mysql高并发配置优化讲解

1.Tomcat优化配置(1)更改Tomcat的catalina.bat将java变成server模式,增大jvm的内存,在文件开始位置增加setJAVA_OPTS-server -Xms1024m -Xmx2048m -Xss512K -XX:PermSize128m-XX:MaxPermSize256msetCATALINA_OPTS-server -Xms512m -Xmx512m如下图&#x…

DEV控件中GridView中的复选框与CheckBox实现联动的全选功能

最初的界面图如图1-1(全选框ID: cb_checkall DEV控件名称:gcCon ): 要实现的功能如下图(1-2 1-3 1-4)及代码所示: 图1-2 图1-3 图1-4 O(∩_∩)O哈哈~ 不要着急哦,看清…

CSDN转载别人文章的操作

说在前面 对于喜欢逛CSDN的人来说,看别人的博客确实能够对自己有不小的提高。有时候看到特别好的博客想转载,但是不能一个字一个字的敲,一张图片一张图片的截图,这样怪麻烦也浪费时间。这时候我们就想转载别人的博客,那…

分享我工作10年收藏的程序员技术网站

其实很多程序员最头疼的事情,就是找学习资料或面试题,我这里,就给大家推荐一些,我赞了6年的优质技术网站,都是我精心挑选的,涵盖:4个算法网站,7个调优排错工具网站,4个问答社区,4个教程网站,4个代码协作平台,都是大家学习IT路上的好帮手,对技术提升有很大帮助,而…

WildFly Swarm:使用Java EE构建微服务

“完美无缺,不是在没有其他可添加的东西时,而是在没有其他东西要带走时实现的” Antoine de Saint-Exupery 法国作家安托万德圣艾修伯里 ( Antoine de Saint-Exupery )的这句话是为了证明通常少花钱多。 对于建筑师,艺…

python编程头文件_python头文件的编程风格

python头文件的编程风格发布时间:2020-09-03 10:23:25来源:亿速云阅读:96作者:小新小编给大家分享一下python头文件的编程风格,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!本文主…

《Code:The Hidden Language Of Computer Hardware and Software》 ——笔记

怎么由逻辑电路实现二进制的加法 首先二进制的加法可以拆解为两个步骤:加与进位。 加法01001110进位01000101加这一步骤可以由异或门来完成,进位这一步骤则可以用与门来完成。 但是由这两个逻辑门只能组成一个半加器,输入2个值,输…

关于一个域名下如何更换网站

说明:建立在有域名、服务器、两个网站的基础之上。 背景: 原来的网站采用的是微企点建站的方式,对于那种拖拉拽不懂编程的人用的,现在自己开发一个更为强大的功能性网站,想把这个新网站替换掉原来的网站,…

图像存在hadoop比在mysql中_比较SQL数据库和Hadoop

鉴于Hadoop是一个数据处理框架,而在当前大多数应用中数据处理的主力是标准的关系数据库,那又是什么使得Hadoop更具优势呢?其中一个原因是,SQL(结构化查询语言)是针对结构化数据设计的,而Hadoop最初的许多应用针对的是文…

搭建xss-platform平台

这篇更详细,对蓝莲花的XSS有更详细的说明 https://blog.csdn.net/weixin_50464560/article/details/115360092 https://bbs.secgeeker.net/thread-1519-1-1.html 搭建xss-platform平台 一直想搭在公网搭建自己的XSS平台用来验证XSS漏洞,使用别人的平台…

如何获取电脑网站(手机网站)支付宝支付的配置信息(appid、商户私钥、支付宝公钥)

需求:想在网站接入支付宝支付。现在的网站基本分为PC端和手机端。 明确工作目标:appid、商户私钥、支付宝公钥以及回调地址。 电脑PC端支付宝支付获取配置信息步骤如下: 1.登录支付宝开放平台 (传送门),使用企业认证的支付宝账户或者个人认证的支付宝账号扫码登录。…

get--ip

public string GetIp() { Regex reg1 new Regex("(\\d).(\\d).(\\d).(\\d)"); return reg1.Replace(GetRealIp, "*.$2.$3.$4"); } /// <summary> /// 获取用户的IP地址 /// </summary> public string GetRealIp…

9针串口定义测试方法_一些定义–测试技术9

9针串口定义测试方法我认为我即将结束有关测试技术的博客系列&#xff0c;感觉好像已经过去了。 对我来说更清楚的一件事是&#xff0c;测试方法仍处于起步阶段&#xff0c;因此是开发人员之间争执或讨论的明确来源&#xff0c;这是一件好事。 我怀疑我们正处于职业发展史上的某…