重构这个/减少LOC的好方法?

时间:2012-09-26 17:09:09

标签: c# refactoring character switch-statement

我有这段代码:

switch (currentLetter)
{
    case 'A': return 'B';
    case 'B': return 'C';
    case 'C': return 'D';
    case 'D': return 'E';
    case 'E': return 'F';
    case 'F': return 'G';
    case 'G': return 'H';

    case 'a': return 'b';
    case 'b': return 'c';
    case 'c': return 'd';
    case 'd': return 'e';
    case 'e': return 'f';
    case 'f': return 'g';
    case 'g': return 'h';
}

我想到了许多方法来改变它,但我不确定选择哪种方式。我可以用(char)(currentLetter + 1)替换所有返回,使用带有ASCII值的if语句来确定范围,然后执行(char)(currentLetter + 1),使用Enumerable.Range.Contains然后查看值是否在范围内,替换用if等转换

这段代码不会在其他任何地方重复出现,我不确定这是不是最好的方式,因为代码的读者对于正在发生的事情非常清楚,他们不需要思考字符代码,算术等等。此外,永远不会再有任何字符添加到case语句中,因此它不会变得笨拙。

不确定我是应该保留原样还是更改它。

4 个答案:

答案 0 :(得分:5)

离开它。

代码中的代码清晰度代码不会在整个代码库中复制/粘贴,通常比“优雅”解决方案更可取,因为可能有其他人可能最终需要维护它(或者你自己试图记住你正在做的事情。稍后。

如果你正在寻找迭代器类型的函数 - 这里有一个关于SO的函数:How to find out next character alphabetically?

答案 1 :(得分:1)

使用

return (char)(currentLetter + 1);

如果您需要进行范围测试

if ("ABCDEFGabcdefg".Contains(currentLetter)) {
    return (char)(currentLetter + 1);
}
throw new ArgumentOutOfRangeException(
    "Letter in the range 'A'-'G' or 'a'-'g' expected.");

立即可见,返回字母表中的下一个字母而不检查一长串案例。它也不容易出错。


更新:char被认为是C#中的数字类型,可以隐式转换为至少16位宽的其他数字类型。您甚至可以对它们应用递增和递减运算符。因此,存在没有铸造的较短解决方案:

return ++currentLetter;

注意:这会更改currentLetter的原始值,但由于char不是引用类型,如果currentLetter是方法参数,这应该不是问题。此外,必须使用预增量运算符,因为旧值将使用后增量运算符返回!

答案 2 :(得分:0)

使用ASCII代码和描述性方法名称,以便将来的开发人员清楚。甚至将它转换为扩展方法。即使你目前没有计划在其他地方改变或使用它,但并不意味着你将来不会。

答案 3 :(得分:0)

这只是一个品味问题。怎么样:

if (currentLetter >= 'A' && currentLetter <= 'G'
  || currentLetter >= 'a' && currentLetter <= 'g')
{
  ++currentLetter;
  return currentLetter;
}

这假设currentLetter是一个本地变量(它没有被当前方法之外引用的匿名函数捕获),因为我增加了它。