谈谈LINQ的缺点

简介:

概要:

·LINQ的实质是什么

·LINQ的问题是将复杂的问题简单化,让简单的问题复杂化

·LINQ喧宾夺主:

- Lambda的抽象能力和描述能力大于LINQ

扩展方法给程序员带来的好处也是强于LINQ

·目前C#中的Lambda和扩展方法是半完成的半吊子状态

 

上面这些观点我以前的随笔中也出现过,这次乘着讨论LINQ的东风,详细深入的讨论一下。

 

1 LINQ的实质是什么

在远古时代,编程等于数据结构加算法,在现今时代,编程等于实体加策略。LINQ是一种接近于自然语言的针对Collection的策略(叫delegate也好,Functor也好)组合的描述。

- LINQ可能(非可以!)节省代码量

- LINQ可能(非可以!)具备更加的可读性

- LINQ仅限于对Collection的操作

 

2 LINQ的问题是将复杂的问题简单化,让简单的问题复杂化

对于简单的策略组合问题,Lambda加上静态方法以及Collection的原有方法,可以提供和LINQ一样简单的、可读性一样好的解决方案。据说MSDN上不提倡直接用LINQ命名空间下的扩展方法,不过我觉得在大多数情况下直接用这些扩展方法比直接用LINQ更直接明了。

对于复杂的策略组合问题,LINQ是有优势的,可以将复杂的集合操作简单化。

问题在于:

i)在程序开发中,绝大部分对Collection的操作都是简单操作,这些操作LINQ相比Lambda+现有方法+扩展方法并没有优势

ii)少部分对Collection的复杂操作一般来说都是需要封装的,对外提供简单的接口调用。这些部分,用LINQ会有优势。不过,LINQ的描述能力还是有限的,很多更复杂的操作,LINQ描述不了。对于我来说,这样的需求已经好几个项目没遇上过了,遇上的话,用硬编码所花的时间也可以接受,不必要花时间去学LINQ

 

3LINQ的喧宾夺主问题

LINQ的光芒将Lambda表达式和扩展方法给掩盖住了,有点喧宾夺主的味道。如果让我来区分几个之间的区别,Lambda表达式和扩展方法应该属于战略层面的扩展,LINQ属于战术层面的。

先看Lambda表达式,Lambda表达式天生就是描述策略组合的,它的可读性和LINQ差不多,它的描述能力却比LINQ强大很多,它和图灵机是等价的,而LINQ背后的关系数学的计算能力是很有限的。

再看扩展方法。不知道大家是否还记得这个词:AOP。现实中,AOP的讨论大多集中于实做成面而不是思想层面。从思想层面来说,AOP就是将相关的东西通过某种方式集中的展现与处理。比如说,我们在IDE中,输入一个变量,再输入一个“.”,那么关于这个变量的操作就集中的展现给我们任由我们选择,这一点我觉得也应该属于AOP

在编码当中,很多时候我们需要对一个类进行修饰,这些修饰类一多的时候,很难集中处理,我们经常忘记有哪些修饰类,修饰类之间的公用也不好处理。扩展方法使我们能够以AOP的范式来对类和对象进行修饰。在IDE中,我们一打“.”,这些修饰就AOP的展示给我们了。扩展方法还可以有一些更激进的应用,只不过微软目前没给我们。

 

4C#目前Lambda表达式和扩展方法的不足之处

目前C#Lambda表达式处于太监状态:不能推演类型。这样一来,撰写复杂的策略操作组合时需要写很长很长,嵌套一层又一层的类型定义,如此在复杂的策略组合时,使用Lambda表达式就很费事了。真不知道M$怎么想的,难道是给F#留路子?

扩展方法的遗憾之处是没法对属性进行扩展,我不熟悉CLR底层实现,但如果能对属性进行扩展,然后使用某种机制使扩展方法和扩展属性在反射层面也能被当作一般属性和一般方法进行处理就更好了。这样的话,几乎全部的对类的修饰都可以通过扩展方法来进行。倒是向动态语言靠拢了。恩,等4.0再看看。

 

俺的选择:

结合以上讨论,俺在工作中是放弃应用LINQ了。主要觉得花费那时间去学习,所节省的时间未必有学习花的时间多。Lambda表达式和扩展方法倒是用的挺多。

俺迫切需要动态代理功能。别人都是AOP需要,俺是在用泛型时需要。

比如,Winform下的 ToolStripComboBox  ComboBox 类,很多方法和属性名称一样,我需要取出一些值,将这些值绑定到ToolStripComboBoxComboBox上。这些值可能有1000多个,因此只在***BoxItem中绑定最常见的几个,然后再加上一条“选择其它”。为此,我需要写两份几乎一模一样的代码,邪恶啊。。。。。。ToolStripComboBox  ComboBox 没有公共接口,不用反射没法搞啊,用反射。。。,俺还是复制粘贴吧。

俺需要这样的一种动态代理:

假定有一个接口:

     public   interface  TInterface
    {
        String A { 
get set ; }
        String B();
    }

 

一个类

复制代码
     public   class  ClassA
    {
        
public  String A {  get set ; }
        
public  String B()
        {
            
return  String.Empty;
        }
    }
复制代码

 

和一个类工厂:

复制代码
     public   sealed   class  TypeTemplate
    {
        
public   static  T Create < T > (Object instance)  where  T :  class
        {
            
        }
    }
复制代码

 

这个代理类可以用一个动态生成的类的实例将ClassA实例打包一下,使其适应Tinterface。这样来弥补C#的泛型不能实现编译时多态的问题,来减少代码的重复,可以充分发挥出泛型的威力了。

更进一步,如果动态类与被代理的类的属性和方法签名不一致的话,能够手动添加之间的映射关系,实用性就更强了。

关于策略的组合,设计模式中策略模式是一种做法。泛型编程中泛型是另一种做法。Lambda表达式是另外一种做法。目前C#的泛型、Lambda深入应用的话,总是缺点什么。不爽。

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2009/01/06/1369945.html如需转载请自行联系原作者


xiaotie 集异璧实验室(GEBLAB)

相关文章
|
5月前
|
XML JSON 前端开发
前端深浅拷贝各有哪些方法,优缺点
前端深浅拷贝各有哪些方法,优缺点
43 0
|
5月前
|
XML 开发框架 .NET
C# | Linq基本功 —— 必学的必熟的10个方法
Linq(Language Integrated Query)是C#语言中的一种查询语言,它提供了一种统一的方式来查询和操作各种数据源,如集合、数据库、XML等。Linq的出现使得开发者能够以一种更简洁、更直观的方式来处理数据,提高了代码的可读性和可维护性。
81 0
|
6月前
|
自然语言处理 前端开发 安全
当被问到你使用过iframe吗?有哪些优点和缺点?
当被问到你使用过iframe吗?有哪些优点和缺点?
144 0
|
7月前
|
设计模式 架构师 Java
深扒!用6部分讲完Java性能调优:多线程+设计模式+数据库
Java性能调优 Java性能调优,是一个老生常谈的话题。可能有些人觉得没用,一些细小的地方没有好修改的,改与不改对于代码的运行效率有什么影响呢? Java性能调优不单单是学一门编程语言那么简单,没有办法通过直线式的思维去掌握并运用,对架构师的技术和深度都是有较高的要求的。互联网的时代,一个简单的系统囊括了应用程序、数据库、操作系统、网络等很多技术,如果线上一旦出现什么问题的话,可能就要去协调多方面的组件去进行优化,这又将是一个问题。
50 0
深扒!用6部分讲完Java性能调优:多线程+设计模式+数据库
|
9月前
|
Web App开发 JavaScript 前端开发
前端优化的几种方法和底层原理
前端优化的几种方法和底层原理
|
Arthas 缓存 算法
如何写出高性能代码(二)巧用数据特性
同一份逻辑,不同人的实现的代码性能会出现数量级的差异; 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升;同一份代码,也可能在不同处理器上运行也会有几倍的性能差异;十倍程序员 不是只存在于传说中,可能在我们的周围也比比皆是。十倍体现在程序员的方法面面,而代码性能却是其中最直观的一面。
152 0
如何写出高性能代码(二)巧用数据特性
|
存储 供应链 安全
【高并发】信不信?以面向对象的思想是可以写好高并发程序的!
最近,有小伙伴留言,现在大部分开发都是面向对象开发,那如何以面向对象的方式写好并发程序呢?那好,今天我们就来聊聊这个话题。
219 0
|
API 开发者 C#
带你读《More Effective C#:改善C#代码的50个有效方法》之二:API设计
本书围绕一些关于C#和.NET的重要主题,包括C#语言元素、.NET资源管理、使用C#表达设计、创建二进制组件和使用框架等,讲述了最常见的50个问题的解决方案,为程序员提供了改善C#和.NET程序的方法。本书通过将每个条款构建在之前的条款之上,并合理地利用之前的条款,来让读者最大限度地学习书中的内容,为其在不同情况下使用最佳构造提供指导,适合各层次的C#程序员阅读。
|
SQL 存储 JSON
【自然框架】之数据访问 —— 再小的类库也需要设计。
  以前也写过几篇关于数据访问的,这里是最新的总结。麻雀虽小五脏俱全,数据访问也许不起眼,但是也要好好的设计一翻。从2004年开始用自己的数据访问,一直到现在,经历过两次大的改版,随着需求的变化,也增加了不少的功能,小修小改那就更多了。
1006 0