【发布时间】:2021-06-22 11:10:48
【问题描述】:
我有一个函数,它返回一个字符串,其中包含对象正在查看的坐标和方向。 但我真的不喜欢函数的长度,我想缩短它。我不知道我能做些什么来缩短它。有人可以帮我吗?
函数如下所示:
public string Execute(string text)
{
var letters = text.ToCharArray().ToList();
foreach (var letter in letters)
{
if (letter == 'R')
{
switch(direction)
{
case "N":
direction = "E";
break;
case "E":
direction = "S";
break;
case "S":
direction = "W";
break;
case "W":
direction = "N";
break;
}
}
if (letter == 'L')
{
switch (direction)
{
case "N":
direction = "W";
break;
case "E":
direction = "N";
break;
case "S":
direction = "E";
break;
case "W":
direction = "S";
break;
}
}
if (letter == 'M')
{
switch (direction)
{
case "N":
positionY++;
break;
case "E":
positionX++;
break;
case "S":
positionY--;
break;
case "W":
positionX--;
break;
}
}
if (letter == 'B')
{
switch (direction)
{
case "N":
positionY--;
break;
case "E":
positionX--;
break;
case "S":
positionY++;
break;
case "W":
positionX++;
break;
}
}
}
return $"{positionX}:{positionY}:{direction}";
}
This Text Down here 只是一个无用的文本,所以我可以提交我的问题,因为我的代码太长并且 Stackoverflow 将问题识别为主要是代码,所以我必须编写更多没有代码括号的文本才能提交问题.您不必阅读此文本,因为它没有任何目的。
【问题讨论】:
-
寻找模式,并想办法在算法中使用它们。例如,对于
R和L,看起来直接顺时针或逆时针旋转。您可以编写一个小函数来启用它(使用方向字符串数组(您可以环绕)并且您的代码在数组中向左或向右移动)。同样,对于M和B,您以固定模式将位置偏移+1或-1。将该逻辑重构为一个能够计算出规则的函数。 -
使用以旧值作为键,以新值作为值的字典。 Dictionary
lDict = new Dictionary () { { "N", "W" }, { "E", "N" }, { "S", "E" }, { " W", "S" } }; dict = lDict[dict]; -
在我看来,这正是正确的做法。尽管这可能是“智能”解决方案的更多代码行,但它是最容易维护和理解的。到目前为止,对于此处提出的所有其他解决方案,如果您或其他人以后必须更改它,您将很难过。相反,每个人都会立即理解简单的“切换”方法。
标签: c# refactoring simplify