【问题标题】:Good way to refactor this/reduce LOC?重构这个/减少 LOC 的好方法?
【发布时间】:2012-09-18 09:16:01
【问题描述】:

我有这个代码:

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 语句中,因此不会变得笨拙。

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

【问题讨论】:

  • 有点冗长,但很清楚。如果它只在一个地方使用,我会保持原样。您可能会花费更多的时间来减少 LOC(并且可能会降低可维护性/可读性),而不是节省 LOC 的价值。

标签: c# refactoring character switch-statement


【解决方案1】:

离开它。

当可能有其他人最终可能不得不维护它(或以后你自己试图记住你在做什么)。

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

【讨论】:

  • @TonyHopkinson 也许优化和美学之间存在差异(取决于优化的定义)。我认为原始发布者清楚地知道它不会[显着地]改变他的代码的性能,但也许他觉得它看起来不太好。
  • 对我来说看起来不错,我可以阅读和理解它,这意味着它比我见过的许多代码都领先。它满足了我所有的审美需求,如果我能负担得起离婚,我会嫁给它。在我的职业生涯中,我对更改工作代码以使其看起来更漂亮变得非常怀疑。大多数时候,这一原则的支持者都非常聪明,非常危险。
  • @Tony ...我同意重构工作代码,但如果这是新代码,Olivier 的解决方案简单易读,并且考虑到索引边界作为实现。如果字母需要换行 (z=>a),我链接的旧 SO 答案提供了修复,这样也可以很好地工作。我应该问一下“g”处的停止是否是序列的结尾,或者它是否包含所有字母字符。
【解决方案2】:

使用

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 是方法参数,这应该不是问题。此外,必须使用前自增运算符,因为旧值将与后自增运算符一起返回!

【讨论】:

  • 与其他 SO 线程一样...当 currentLetter 为 'z' 时会发生什么?
【解决方案3】:

使用 ASCII 代码和描述性方法名称,以便未来的开发人员清楚。甚至把它变成一个扩展方法。即使您目前没有改变或在其他地方使用它的计划,也不意味着您将来不会。

【讨论】:

    【解决方案4】:

    这只是口味问题。怎么样:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2010-09-19
      • 2019-10-26
      • 2015-03-30
      • 1970-01-01
      相关资源
      最近更新 更多