InfoQ

新闻

是该放弃loop语句的时候了吗?

作者 Jonathan Allen译者 张海龙 发布于 2008年4月14日 上午1时54分

社区
.NET
主题
编程
标签
C#,
函数式编程

随着LINQ、扩展方法和增强后的匿名代理的加入,许多算法已不再需要进行显式的循环了。在一篇名为“如果你正在使用loop语句,那你就做得不正确”的发贴中,Chuck Jazdzewski探讨了C#的一些可能未来

Chuck Jazdzewski引用了他的大学教授在讲APL时的一句话作为贴子的开头。APL是60年代主要面向矢量和矩阵操作的语言,尽管loop语句也存在于其中,但通常是用不着的。Chuck写到:

它与LINQ相似,如果你正在使用loop语句,那你就做得不正确。我后来做了许多原型开发,我强迫自己使用LINQ,不是我不喜欢它,相反,我真的很喜欢LINQ,但对loop语句的使用习惯已经在我的心里扎了根,所以我不得不想办法让自己停止这种习惯,强迫自己用LINQ的方式去思考。每次当我试图使用loop语句去处理一个collection或一个array时,我就会问自己:能不能在这里使用LINQ来替代呢?那些拥有数据库背景知识的程序员们在使用LINQ时,就像鸭子下水一样自在,他们就是以结果集和矢量计算的方式来思考,而我还不是,但我也差不多快达到那种境界了。

尽管Chuck非常依赖于LINQ表达式和那些扩展方法,但他并没有彻底放弃loop语句。例如,他在IEnumerable扩展方法中就使用loop语句来隐藏调用函数的复杂性。在示例函数Reduce中就是这么做的,这一函数将一个成员列表和与其相匹配的邻近成员进行组合,而匹配的标准和如何对它们进行组合,则是由传入的一个匿名函数来完成的。经过这样的实现,其它人就无须再来编写相似的函数了。

Chuck例举的代码是想创建一个函数,获取一个具有名为“Whitespace”或“keyword”的文本的序列,然后对它们应用某些风格。最后,他的函数就简化到只有三条查询语句:

  • 将whitespace区域与预设的区域合并
  • 为所有的范围映射风格
  • 合并相邻的范围,并使用相同的风格

尽管大多数评论者都对此给予肯定,但也并不是所有人都认为应该这么做。Holger Flick写到:

我认为标题应该改为“如果你正在使用loop,那当别人读到你的代码时就不用去分析就可以读懂”:)

别误会我的意思,我是经常使用LINQ的,也很喜欢它。然而,在这种情况下要想领会代码的意思很困难,更别说要使用它!恕我直言,我宁可写一个多行的 if 语句来代替一行的实现方法。

未来的C#编程会彻底放弃使用loop吗?如果真是那样的话,它会是件好事吗?

查看英文原文Is it time to abandon loops?

没有回复

回复

独家内容

程立谈架构、敏捷和SOA实践

支付宝首席架构师程立在本文分享了支付宝技术架构的发展,对架构的认识,成功架构的特点,如何避免架构设计的失败,以及在敏捷和SOA方面的实践等。

Emmanuel Bernard谈Bean验证规范

InfoQ有幸采访到了Emmanuel Bernard,向其了解Bean验证框架及专家组正在寻求的社区参与的更多相关信息。

通过索引器简化C#类型信息访问

作为一个有别于Java、Ruby等语言的一个特性,C#可以用索引器(Indexer)将类型本身以对象数组的形式供外部使用。同时,把索引器和LINQ结合使用倒是一个非常不错的组合,索引器做接口、LINQ完成内部检索逻辑,客户程序在无需记住具体方法名称的前提下,按照键值检索即可,索引器内部则依托LINQ to系列的基础,提供对各种异构数据源的访问。

产品负责人成功之道

Scrum中,产品负责人这个角色具有很大的影响力,能够带来很高的价值。但要想运用得当,可没那么轻而易举。如果做得好,就可以在客户和开发者之间建立更为融洽的关系,并能够增加组织的竞争优势。

硝烟中的Scrum和XP

在本书中,作者Henrik Kniberg讲述了他在一年的时间里,带领40人的团队实施Scrum的过程。他们试过了多种团队尺寸(3~12人)、sprint长度(2~6星期),定义“完成”的不同方式,不同的backlog格式,各种测试策略,在多个Scrum团队之间进行同步的多种方式。他们还尝试过XP实践——持续集成、结对编程、测试驱动开发等等,还试过了把XP跟Scrum组合。

软件开发中的准时化生产

准时化生产(Just In Time)是精益生产(Lean Production)和丰田生产系统(Toyota Production System)中的概念,敏捷开发与准时化生产中的很多观点和实践是一致的,精益思想作为精益生产背后的指导思想也正在积极地影响着软件开发领域,向其中不断注入创新与活力。

Tapestry for Nonbelievers

I. Drobiazko和R. Zubairov合作撰写了一篇文章,详细介绍Apache Tapestry 版本5——一个面向组件web框架。文章向读者展示了创建组件方法,并谈到了Tapestry中的IoC以及Ajax的相关特性。

ESB拓扑方案

在本文中,Adrien Louis讨论了两种基于ESB的SOA拓扑方案的优缺点:单个公司级ESB vs. 彼此互联的“部门级”ESB系统。Adrien讨论了每种方案对管理、业务监测、治理、可靠性和编配等问题的影响。