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

java转换为c#

由于各种原因,我最近完成了一个将复杂的财务应用程序从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遍历Dictionary时没有按合同对Dictionary进行排序(也存在OrderedDictionary ),它似乎仍可以保留插入顺序。 HashMap并非如此,并且由于元素的顺序对于结果HashMap ,因此我们发现了难以调试的差异。 解决方案是用确实保留顺序的LinkedHashMap替换HashMap所有实例。

6.不要过早重构

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

结论

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

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

java转换为c#

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

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

相关文章

计算机专业去荷兰还是瑞典,给申请计算机专业的同学几点建议

计算机专业想来是广大美国研究生申请的热门专业, 这里所说的热门,不光指招生人数多, 就业前景优势也是无容置疑的。广大申请者的硬件条件无外乎分为以下几种情况:1、托福80,GRE 3002、托福90 GRE3153、托福100&#xf…

为何某些公司不允许使用C++STL

点击蓝字关注我们最初开始禁用 C STL,是因为早期项目编码实践中留下的惯例,被后来的程序员继承下来。老项目中这种选择尤其地多。不过如果有人将其上升到公司行为在不同项目中全面禁用 STL,则没有必要,而且我倾向于做这种决定的人…

支持向量机python代码_Python中的支持向量机SVM的使用(有实例)

除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类。因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm。 一、导入sklearn算法包 skleran中集成了许多算法,其导入包的方式如下所示&#xff…

swarm:pending_WildFly Swarm:使用Java EE构建微服务

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

html中引入js柱状图,Echarts.js 图表在layui中的引用

添加部分源码,可以使layui使用第三方插件的方法引入,代码以下://打开源码,将代码头部的代码(function (global, factory) {typeof exports object && typeof module ! undefined ? factory(exports) :typeof define function && define.amd ? define([expo…

C++ 23将引入标准库模块支持,编译速度提升10倍

点击蓝字关注我们虽然模块是 C 20 的主要卖点,但与 C 20 不同的是,C 23 的标准库也将实现模块化。从标准库开始,模块有望改善编译速度和 C 开发者组织代码的方式。C 是丹麦计算机科学家 Bjarne Stroustrup 创建的编程语言,由 ISO …

python刷题_11.学习Python,刷题才能让你感受到快(差)乐(距)!

猜数字游戏可用一个简单的while循环来实现。 其中 随机数 的生成在第4篇介绍过, 键盘输入在上一篇介绍过 import random result round(random.random()*100) while result ! guess: guess int(input()) if guess>result: print(大了!) elif guess print(小了!)…

java jigsaw_Java 9和Project Jigsaw如何破坏您的代码

java jigsawJava 9迫在眉睫,它将带有完整的Project Jigsaw 。 在我从OpenJFX邮件列表的最近讨论中得知它可能会破坏现有代码之前,我并没有对此给予太多关注。 这对于Java非常不寻常,因此引起了我的兴趣。 我阅读了该项目的JEP和一些相关文章…

C语言的万能“三板斧”

点击蓝字关注我们作为嵌入式工程师,写一个效率高效,思路清晰的C语言程序是我们的终极目标。那么,怎样才能写好这样的程序呢?首先,我们要用C语言的思维方式来进行程序的构架构建;其次,要有良好的…

武汉城市职业学院计算机分数线,武汉城市职业学院历年分数线 2021武汉城市职业学院录取分数线...

一、2019年武汉城市职业学院各省录取分数线及录取位次统计表1、武汉城市职业学院2019年在福建录取分数线如下:文科录取批次高职专科301分,最低录取位次为68896名、理科录取批次高职专科229分,最低录取位次为130149名;2、武汉城市职业学院2019…

aws sqs_在Spring中将AWS SQS用作JMS提供程序

aws sqs最近AWS公布了新的客户端库,它实现了JMS 1.1规范 ,并使用他们的简单队列服务 (SQS)作为JMS提供者 (见杰夫巴尔的帖子在这里 )。 在我的文章中,我将向您展示如何设置Maven项目以使用Sprin…

openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断

编者注:单片机串口接收不定长数据时,必须面对的一个问题为:怎么判断这一包数据接收完成了呢?常见的方法主要有以下两种:1.在接收数据时启动一个定时器,在指定时间间隔内没有接收到新数据,认为数…

java 多线程性能_Java中多线程的性能比较

java 多线程性能Java中有多种用于多线程的技术。 可以通过同步关键字,锁或原子变量来并行化Java中的一段代码。 这篇文章将比较使用synced关键字ReentrantLock,getAndIncrement()以及执行get()和compareAnd…

C语言贪吃蛇小游戏 | 源码

点击蓝字关注我们该程序已经在VS2019上验证过了&#xff0c;可以直接运行。程序目录程序里就只有一个test.cpp文件&#xff0c;也就是说大家可以先创建工程&#xff0c;然后直运行效果C语言学习资源汇总【最新版】源码#include<stdio.h> #include<stdlib.h> #inclu…

东华大学计算机学院讲座单,计信学院成功举办2018级专业导师面对面系列讲座活动...

为帮助大一新生尽快适应大学生活&#xff0c;了解专业&#xff0c;掌握知识&#xff0c;计信学院积极响应学校号召&#xff0c;成立由教授、博士组成的专业导师团队&#xff0c;为各专业开展系列专业知识讲座。自10月17日晚7点至10月26日下午4点&#xff0c;各专业导师面对面系…

python 控制有线网卡_Python 使用指定的网卡发送HTTP请求的实例

需求: 一台机器上有多个网卡, 如何访问指定的 URL 时使用指定的网卡发送数据呢? $ curl --interface eth0 www.baidu.com # curl interface 可以指定网卡 阅读 urllib.py 的源码, 追述到 open_http –> httplib.HTTP –> httplib.HTTP._connection_class HTTPConnectio…

C函数指针别再停留在语法,得上升到软件设计

点击蓝字关注我们经常有朋友问到底如何在C程序中采用面向对象编程?如何让模块之间松耦合&#xff1f;......其实究其原因还是没有把C语言与软件设计很好的联系起来。这里跟大家找了一些内容&#xff0c;相信认真看完全文多多少少会有你想要的答案&#xff1a;正文部分&#xf…

spring默认缓存管理器_使用Spring的缓存管理器缓存Web内容

spring默认缓存管理器在这篇文章中&#xff0c;我想向大家展示如何使用Spring的CacheManager&#xff0c; Cacheable和JMX批注来缓存和管理Web内容的缓存的基础知识。 想象一下一个网上商店&#xff0c;它从远程WCMS&#xff08;Web内容管理系统&#xff09;获取一些内容&#…

计算机软件选修课选什么好,大学值得选的“选修课”,一点不比专业课差,能选上最好认真听...

原标题&#xff1a;大学值得选的“选修课”&#xff0c;一点不比专业课差&#xff0c;能选上最好认真听文/小哈你是怎样对待你的选修课的&#xff1f;以前经常听学长学姐们说过这样一句话&#xff0c;“上大学之后&#xff0c;专业课选逃&#xff0c;选修课必逃”。不知道大家是…

自动化运维 python 批量监控服务器_1、python自动化运维——监测服务器状态

监测服务器状态 获取系统性能信息 1、CPU信息&#xff1a; Linux操作系统的CPU利用的几个部分&#xff1a; User Time;SystemTime;Wait IO;Idle psutil.cpu_times() psutil.cpu_times().user psutil.cpu_count() 2、内存信息 psutil.virtual_memory() #查看内存完整信息 psutil…