Linq是否对.NET程序员产生麻木的作用?


36

大约一年前,当人们开始问如何使用jQuery检索查询字符串等绝对疯狂的事情时,我们很多人开始在jQuery中看到这种现象。(jQuery)和语言(JavaScript)之间的区别显然已被许多程序员所忽略,并导致在不必要的地方编写了许多不合适的,费解的代码。

也许这只是我的想象,但我发誓我开始看到人们要求使用Linq做类似疯狂的事情的问题数量激增,例如按一定顺序查找范围。我无法克服Linq扩展对于解决该问题有多么不恰当,但更重要的是,作者只是认为理想的解决方案将涉及Linq而没有实际考虑(据我所知)。似乎我们正在重复历史,滋生了无法分辨语言(C#/ VB.NET)和库(Linq)之间区别的新一代.NET程序员。

是什么导致这种现象?只是炒作吗?喜tend倾向?Linq是否已经获得了魔术般的声誉,在这里您不必说出正确的咒语,而不必实际编写代码?我对这些解释不满意,但我真的想不出其他任何东西。

更重要的是,这确实是一个问题吗?如果是,那么帮助这些人开悟的最佳方法是什么?


6
+1表示“假设理想的解决方案将涉及Linq,而无需实际考虑”。真的超出了我。
Jaco Pretorius

1
Linq很慢...

2
@Pierre:您以什么理由提出这一主张?
亚罗诺(Aaronaught)2010年

5
@梅森:那是一个显然不知道他们在做什么的人写的绝对可怕的基准。标杆基准 匈牙利符号?Linq版本甚至没有做同样的事情,它尝试迭代每个结果而不是首先停止。更不用说,整个前提是愚蠢的,正如在今天热门问题中一再讨论的那样
亚罗诺(Aaronaught)2010年

3
而且,顺便说一下,@ Mason,Linq 内置了许多优化。对于几乎所有可以优化的方法,它首先都会寻找支持该优化方法的接口。对于其他基于集合的方法(例如Equijoins),它将创建哈希表。它不会为您优化代码但也不会使您的代码变慢。实际记录中的大多数实际减速情况都是由于与Linq无关的lambda / closures。
Aaronaught

Answers:


52

这基本上是因为编程从根本上来说很困难。它需要很多逻辑的,结构化的思想,而很多人只是不知道该怎么做。(或者根本无法做到,这取决于您听谁的声音。)

诸如LINQ和jQuery之类的东西使某些常见的数据操作任务变得非常容易。对于那些知道我们在做什么的人来说,这很棒,但是不幸的副作用是它降低了门槛。对于不知道自己在做什么的人来说,开始编写代码并使事情正常进行变得更加容易。然后,当他们遇到现实时,发现他们的简单,高抽象水平的技术根本不适合他们的根本困难时,他们就迷路了,因为他们不了解构建库的平台。

您的问题是在正确的轨道上,但是就像关于暴力视频游戏的多年争论“使孩子们变得暴力”一样,它的链接方向也倒退了。简单的编程技术不会使程序员变得愚蠢。他们只是吸引愚蠢的人来编程。实际上,您对此无能为力。


30
+1表示“简单的编程技术不会使程序员变得愚蠢;它们只是吸引愚蠢的人参与编程。”
史蒂文·埃弗斯

1
LINQ的一大优点是它允许我以功能性方法对解决方案进行原型设计。然后,一旦有了无错误的解决方案,就可以将其用作优化命令式版本的测试平台。如果任务很简单,如应用单个过滤器,我什至不会打扰。
ChaosPandion

4
我仍然怀疑LINQ会吸引不称职的程序员-从我所看到的来看,这似乎是新手最难理解的概念之一-但这似乎是迄今为止最好的答案。
亚罗诺(Aaronaught)2010年

1
您应该在最后一句话上加上版权。好吧,先生。
AJ Johnson

1
滑稽。对我来说,LINQ并不是一个特别容易掌握的概念。如果您正在做任何细微的事情,那么您很快就需要停止思考方向盘并开始理解变速箱。我在看你的羊肉!
Brian MacKay

13

对我来说,这是新的玩具现象。新的东西出现了(LINQ),现在每个开发人员都想使用它。

他们将LINQ视为锤子,每个问题都是钉子。谁在乎用另一种方法更简单?LINQ必须是答案!就像当每个人都在使用XML一样!配置文件?XML。存储数据?XML。等


5
不想在这里开始进行XML辩论,但是值得指出的是XML实际上在这两个方面都很擅长。这并不总是最佳的 -如果不需要结构化配置文件,那么KVP会更好;如果不需要跨应用程序兼容性,那么二进制格式显然会更好地用于存储/序列化。但是我不认为XML是一个很好的例子,因为XML倾向于发现它仅在次优而不是完全不合适的领域中使用。
Aaronaught

3
+1:值得花些时间来扩展工具,以了解在学习技术时可以将多少个问题打成钉子状。
史蒂文·埃弗斯

+1:此类魔术锤的其他示例是jQuery(如问题中所述)和正则表达式。并不是说这些事情不好,实际上它们确实很有用,但是它们并不能解决所有问题。
Tim Goodman 2010年

13
我认为“ LINQ是一把锤子,每个问题都是钉子”的比喻将它推得太远了。我想说LINQ是如此好用,以至于当您的工作中很大一部分涉及钉子时,您都可能进入凹槽,而不会注意到只是用螺丝钉锤了。即使您不是一个糟糕的程序员。
Carson63000

@Aaronaught:另一方面,对我来说,通过长带宽名称使用XML对于通过低带宽和不太可靠的无线电链路进行数据传输而言似乎不是最佳选择。再说一遍,这也是我对该产品的数据库设计的看法。
David Thornley,2010年

10

我认为LINQ在使用更实用的方法解决问题方面为C#提供了非常好的机会。我们不应该仅仅因为我们已经有了可行的解决方案就放弃一种新的问题解决方式。

来自大量的SQL背景,我喜欢在C#中使用基于集合的逻辑来更好地描述操作意图的选项。

那说; 情境为王,任何事情都可以滥用。


谁在解雇?我一直在使用Linq,我只是担心我看到人们使用它(或尝试使用它)来解决显然是迭代的且不是基于集合的问题的次数。
Aaronaught 2010年

我非常习惯于尝试解决用SQL编写所需的问题,并使用基于集合的逻辑代替游标来解决。工具滥用总是会发生,但是我想至少如果他们编写的LINQ代码不佳,而不是程序代码不佳,那么.NET的后续版本至少可以并行化它。
dotjosh 2010年

2

LINQ和jQuery是最新的“玩具”,开发人员喜欢炫耀他们如何使用最新的东西做事。


我同意这一说法。我不确定是否可以解释这种特殊现象。提出这些问题的人似乎并不是炫耀的对象,尽管这将有助于解释为什么其他程序员尝试按要求回答问题而不是提倡更明智的方法。
亚伦诺特,2010年

@Aaronaught-是的,我想我想的更多是为什么人们使用这种方法回答问题。
Dan Diplo 2010年

2

如果您正确使用Linq并了解其内幕,您会发现各种新的前沿编程技术。

因此,如果您深入考虑这些增强功能,那么我认为它使您成为更好的程序员。给定的程序员实际上是否这样做,不是Linq的错。

可以为对象关系映射器设置相同的参数。有人真的再针对数据库表编写原始SQL查询吗?:)


9
嘿,我写原始SQL ... 嗅探
Aaronaught

2
如果您知道自己在做什么,那么原始SQL是最好的选择。
Fosco 2010年

1
+1为“使您成为更好的程序员”参数。理解linq尤其是支持linq的方法肯定可以提高我对一些非常有用的编程概念的理解。
John M Gant

1
我认为有人冒犯了ORM与原始SQL评论。不是我 我同时使用了这两种语言,并且我认为这句话是嘲讽的。
亚罗诺(Aaronaught)2010年

1
我永远不会相信我的复杂数据库查询对ORM编写的废话的信任,这对简单的东西很好,但是对于报告类型查询却很麻烦。同样,在一个知道自己在做什么的人的手中,ORM是一件好事,在一个懒于理解数据库的人的手中,这是灾难。
HLGEM 2010年

1

这些疯狂的事情中的一些是因为人们使用了错误的锤子,而另一些则是因为他们正在构建一个真正优雅的超级锤子,但是它们遇到了一些需要克服的怪异细节。

例如,如果您看到一个有关使用linq生成动态linq来针对非动态linq的问题(十分之九),那么这个人要么只是好奇(如果可能),要么吠叫了错误的树,但其中有一些您可以用这种方法解决的事情很难解决,否则就不合理。

我将这些问题分为两个部分:

  1. 能做到吗,如果是这样的话
  2. 应该这样做,有风险还是更好的选择

我发现我几乎总是按此顺序进行操作。它可以回答问题,还可以帮助您更好地解释潜在的替代方案。


0

我不知道会对开发人员产生任何麻木的影响,但请看这里,了解介意工具/语言对费率的影响。谈论降低门槛!


0

我同意梅森·惠勒的观点。但是,尝试通过对“序列”进行操作来解决https://stackoverflow.com/questions/3762202/get-range-of-integers-with-linq并非完全疯狂 。问题在于Java和.Net的迭代器不支持所有3种操作:当前值,下一个值和移至下一个。Clojure可以同时完成这3个操作,我怀疑在Clojure中更容易做到这一点。Python也有协同例程,我想尝试破解它。http://clojure.org/sequences http://www.try-clojure.org/

实际上,如果输入是无限序列(例如http://oeis.org/A007401),那么只有懒惰才是唯一的方法。


“ Linq”不一定意味着“迭代器”,也不一定意味着“懒惰”-实际上,Linq的大部分实际上是关于表达式树的。如果需要,您可以轻松地用闭包实现自己的3值或N值聚合,而在C#中根本不需要太多代码。当人们不知道如何实际执行操作,甚至不知道如何开始操作,而只是寻找存在于System.Linq命名空间中的魔术时,麻烦就来了。
亚伦诺特2011年

@Aaronaught ...'''“ Linq”不一定意味着“迭代器”,也不一定是“懒惰”'''-嗯,Linq看起来像SQL,但是这种语法糖编译成实际的IL代码,如果反编译的话,看起来就相当于一串IEnumerable [<T>]钩在一起。这些东西是懒惰的,并使用枚举器,在其他语言中将其称为迭代器。但是,是的,问题在于LINQ使编码看起来很容易,不合格的人可以尝试一下。有些人可能仍然会成为体面的程序员。如果C#是他们的第一语言,并且完全是菜鸟,那么他们正在使用一种大语言。
工作

当然,Linq到对象(不是Linq到SQL,Linq到Entities,Linq到DataSet或Linq的任何其他分支)都是基于迭代器和延迟执行的,但这一切都在幕后。迭代器块和yield语句在Linq之前就存在,委托也是如此。闭包与Linq在同一版本中发布,但是很少有纯“ Linq”操作实际上需要捕获局部变量。问“如何使用Linq [完全迭代的操作/功能的描述]?” 对Linq本身(这意味着要做什么)和语言本身都表现出极大的无知。
亚罗诺(Aaronaught)2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.