【问题标题】:C#/LINQ/Select Case: Is this a code smell?C#/LINQ/Select Case:这是代码异味吗?
【发布时间】:2012-06-06 14:43:57
【问题描述】:

我有以下代码 -> 类似Select case using LINQ - 这不是实际代码 [从互联网上挑选]。 只是尝试使用 LINQ 显示 Select Case 概念。 在我的代码中,基于 条件 我正在创建新的 List 对象

Int32[] numbers = new Int32[] { 1, 2, 1, 3, 1, 5, 3, 1 };

var numberText =
(
    from n in numbers
    where n > 0
    select new
    {
        Number = n,
        Text = 
        (
            n == 1 ? "One" :
            n == 2 ? "Two" :
            n == 3 ? "Three" : "Unknown"
        )
    }
);

但是,here 页面说 - “用多态性替换条件”。

那么,问题是这种实现是否是代码异味,是否应该始终严格避免?在循环遍历集合和有条件地创建新对象时,LINQ 似乎是一个显而易见的选择。可能是错的?

【问题讨论】:

  • 但是参考页面说如果条件取决于类型,则用多态性替换条件。此条件取决于值,而不是类型,因此页面不适用。
  • 除非您打算将 整个 32 位有符号整数集的英文 ASCII 表示嵌入到您的代码中,否则我会说这是一种非常难闻的气味 ;)
  • 想想未来,你的条件会增长到 10 或更多。所以你的 switch 语句会增长太多,使 linq 看起来丑陋和复杂。
  • 如果你有一个处理数字到单词的函数,它可能会更容易阅读代码。然后,您可以使用 switch 语句。我不确定编译器优化器是否会处理它,但它可能会产生更快、更紧凑的代码,而不是嵌套条件。
  • @zenwalker:那么,无论您是通过 switch、Linq 还是 if-else 来实现条件逻辑——>所有这些实现都有问题吗?问题与 LINQ 无关。问题是,是否每次都将所有此类逻辑转换为某种形式的多态实现?它更多的是一个概念性的 OO 相关问题,而不是严格的具体实现问题。

标签: c# linq refactoring


【解决方案1】:

您发布的文章是正确的,但该文章根本不适用于您的查询示例。条件语句确实有其用途。

在示例中,整个方法(也可能是整个对象)根据对象的一个​​单一值改变其行为(它甚至被命名为_type,这表明了该目的)。这确实是多态性的一个例子,因为你可以用不同的类来代表每种类型,而不是字段_type,这样就不需要这样的 switch 语句。

但在您的情况下,这只是从一个值到另一个值的转换。
它不会改变整个对象的行为。
我可以考虑实现一些将条件逻辑移出查询主体的转换器,但除此之外,代码很好。

【讨论】:

  • ....你到底说了什么...这是什么答案?这甚至是如何试图回答这个问题的?懒惰...需要很多改进
  • @Botz3000:: 但是,比如说,根据条件,如果您正在创建新的 List 对象怎么办?实际上,我对这些东西有点困惑。
  • @AngshumanAgarwal 我不明白你的意思。您想将它分配给属性 Text 吗?或者返回 List<string> 作为结果的一部分?您链接到的文章并没有说您必须用多态性替换所有条件语句。它只是展示了一个很好的例子,当它可能适合使用多态性而不是条件时。在像您的示例这样的查询中使用条件很好,并且没有代码异味。
【解决方案2】:

存在根本区别。 LINQ 是一个 API,它允许您查询集合(正如您在问题中所展示的那样)。 switch(或其他条件)语句用于控制程序流程。

当您有很多基于某种类型控制程序流的条件语句时,您所指的页面正在讨论重构代码 - 在这种情况下,它表明您可能希望用一些多态性替换所有条件语句。所以在这种情况下,有一种代码味道。但是在 LINQ 语句中使用条件是可以的——可能有很多方法来构建你的 LINQ——有些会比其他的表现更好,有些会比其他的更好,但我不会说在 LINQ 中使用条件是一种代码味道。

【讨论】:

  • 但这更像是一个评论而不是一个答案。
  • @RobertMS::但是,无论您是通过 switch 还是 Linq 或 if-else 实现条件逻辑 --> 所有这些逻辑都是错误的吗?问题与 LINQ 无关。问题是是否每次都将所有此类逻辑转换为多态实现?它更多的是一个概念问题,而不是一个特定于实现的问题。
  • @AngshumanAgarwal:我认为没有人会主张用一些多态性替换任何和所有条件。使用 If 或 Swtich 是可以的 - 但有时还有其他更好的方法来做事,正如您在问题中的引用所指出的那样。
猜你喜欢
  • 2018-11-23
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多