代码之家  ›  专栏  ›  技术社区  ›  Anthony Pegram

扩展方法中的lambda什么时候做得太多?

  •  7
  • Anthony Pegram  · 技术社区  · 14 年前

    我意识到这部分是主观的,但我对社区意见普遍感到好奇,并且还没有成功地找到解决这个问题的现有问题。

    我正在和一位同事就L2EF查询中的特定select语句进行某种宗教性的辩论。

    .Select(r =>
    {
        r.foo.Bar = r.bar;
        r.foo.Bar.BarType = r.Alpha;
        if (r.barAddress != null)
        {
            r.foo.Bar.Address = r.barAddress;
            r.foo.Bar.Address.State = r.BarState;
        }
        if (r.baz != null)
        {
            r.foo.Bar.Baz = r.baz;
            if (r.bazAddress != null)
            {
                r.foo.Bar.Baz.Address = r.bazAddress;
                r.foo.Bar.Baz.Address.State = r.BazState;
            }
        }
        return r.foo;
    })
    

    Caveats:

    • 这是实体的Linq
    • 这是 之后 数据库中已执行并返回的工作
    • 输入参数 r 是匿名的

    就我个人而言,我认为(a)select子句不应该改变值,它应该只是投影。他的反驳是,他没有改变任何东西,他只是确保所有的东西都在数据库查询的结果中正确初始化。其次,我认为一旦他开始进入完整的代码块并返回语句,是时候定义一个方法,甚至是 Func<T, U> 并不是所有这些都是内联的。这里的复杂因素是,输入也是匿名的,所以需要定义一个类型。但是,如果不是具体的话,我们仍然在讨论一般的观点。

    那么,lambda表达式什么时候做的太多?你在沙地的什么地方画模糊的线?

    6 回复  |  直到 14 年前
        1
  •  2
  •   Jon Hanna    14 年前

    我的第一本能是同意你,主要是在规模和复杂性问题上。

    但是,它在一个上下文中使用,在该上下文中,它将作为.NET代码以外的其他代码(尤其是如果它被转换为SQL查询的一部分)执行,我将对它更加宽容。

    所以,这就是我画模糊线的地方,也是我再次移动它的原因。

        2
  •  1
  •   Steve Michelotti    14 年前

    我也同意在投影中使用select()。我宁愿看到使用“let”关键字提前进行检查,这样select()中的投影就可以保持干净。这将使select()能够引用使用“let”设置的变量。

        3
  •  1
  •   Richard Anthony Hein    14 年前

    我个人认为这不是一个很长的lambda表达。我想你将来会看到更复杂的嵌套羔羊。尤其是像RX这样的东西。

    至于状态变化…好吧,这里他只是在初始化值。我只关心它是否将状态分配给lambda之外的某个变量,但这都是r的初始化,所以对我来说似乎很好。

        4
  •  1
  •   Tj Kellie    14 年前

    在我看到困扰我的东西之前,我不得不盯着它看一会儿。

    1. 这需要重构。

    2. 我花了那么长时间才读懂lambda的意图。

    我不确定我是否能站在你对选择者工作的定义的一边,但我同意越短你能保持一个lambda越好。如果非常需要在db fetch之后进行初始化,请将其中断以便重新使用。

        5
  •  0
  •   Brian Mains    14 年前

    你必须考虑到你的其他选择…有没有更好的地方来解释这个逻辑?不管是哪种方式,您都要循环通过LINQ中的每个实体,或者foreach循环来完成额外的工作…除非你想把它重构成你自己的扩展方法,否则我会说,如果它有效的话就离开它。

    从视觉上看,它没有那么凌乱,所以这是一个优点。或者,您可以看到let关键字(基本上是子查询)是否为您购买了其他东西。

        6
  •  0
  •   Kirk    14 年前

    lambda的长度一点也不困扰我。但是当您在select语句中分配一个值时,我同意这种肮脏的感觉。我将把初始化的内容分解成一个刚好在select语句下面的语句。