在将代码从一种语言转换为另一种语言时,如何避免大型 switch 语句和/或正则表达式

本文关键字:语言 何避免 大型 switch 语句 正则表达式 代码 转换 一种 另一种 | 更新日期: 2023-09-27 17:56:35

我必须将几百个用Java编写的测试用例转换为C#代码。目前我能想到的只是定义一组正则表达式,尝试在一行上匹配它,并根据哪个正则表达式匹配执行操作。

任何更好的主意(这仍然很臭)。

from 和 to 的示例:

爪哇岛:

Request request = new Request(testRunner)
request.setUsername("userName")
request.setPassword("password")
log.info(request.getRequest())

C#

var request = new LoginRequest(LoginParams);
request.Username = "userName";
request.Password = "password";
var LoginResponse = Account.ExecuteCall(request, pathToApi);

在将代码从一种语言转换为另一种语言时,如何避免大型 switch 语句和/或正则表达式

我尝试转换的源代码来自 SoapUI,所涉及的脚本位位于一个巨大的 XML 文件的 TestSteps 中。此外,它们中的大多数只是形成某种请求并检查特定的响应,因此不应该有太多类型要实现。

我最终做的是定义一个基类 (Map),它有一个 Pattern 属性、一个成功指示器和成功匹配后生成的代码行。在某些情况下,某一行可以简单地替换为另一行,但在其他情况下(setUserName),我需要从原始脚本中提取内容以放入c#代码中。在其他情况下,一行可能会替换为多行。转换全部在匹配函数中定义。

public class SetUserName : Map
    {
        internal override string Pattern { get { return @"request.setUsername'(""(.*)""')"; } }
        public override void Match(string line)
        {
            Match match = Regex.Match(line, Pattern);
            if (match.Success)
            {
                Success = true;
                CodeLines = new Code<CodeLine>
                {new CodeLine("request.Username = '"" + match.Groups[1].Value + "'"")};
            }
        }
    }

然后,我将映射放在按出现次数排序的列表中,并循环遍历每行脚本:

foreach (string scriptLine in scriptLines)
            {
                string line = Strip(scriptLine);
                if (string.IsNullOrEmpty(line) || Regex.Match(line, @"^'s+$").Success)
                {
                    continue;
                }
                Map[] RegExes =
                {
                    new Request(), 
                    new SetUserName(), 
                    new SetPassword(), 
                    new RunRequest()
                };
                foreach (Map map in RegExes)
                {
                    map.Match(line);
                    if (map.Success)
                    {
                        codeList.AddRange(map.CodeLines);
                        break;
                    }
                }
            }