反对for行动

Francesco Cirillo于不久前发起了“反对if行动”,受此影响,Matthew Podwysocki也用这种方式提出了自己的声明,即“反对for行动”。

\

Matthew Poswysocki生活在华盛顿特区,作为微软的高级咨询师,维护或参与了诸多社区活动(如DC ALT.NET讨论组),并致力于推广各种敏捷实践。这次他提出,在代码中应该尽量使用和构建可以进行组合的函数,而不是显式的循环语句(包括for、foreach和while)。

\

Matthew认为,通过循环来实现的功能往往可以分为以下三种情况:

\
  1. 查询(映射、过滤等等) \\
  2. 聚合(求和、计数等等) \\
  3. 进行一些有副作用(Side Effect)的操作(读取文件、发送消息等等) \

Matthew看来,使用for循环来处理“查询”和“聚合”时,最大的问题在于将关注点放在了如何做(How)而不是做什么(What)。他举了一个例子,“找出100以内所有质数”,并给出了一个实现:

\
var numbers = Enumerable.Range(1, 100);\var output = new List\u0026lt;int\u0026gt;();\\foreach(var number in numbers)\    if(IsPrime(number)) output.Add(number);
\

Matthew认为:

\
\

这里的问题在于我们很难将现有逻辑与另一个操作进行组合,因为这里的实现涉及了“怎么做”。我们应该使用.NET 2.0以上版本中的泛型及延迟加载的特性进行函数式的构造。这样可以带来“声明式(declarative)”的感觉,而关注点就只有“做什么”了:

\
\
var primes = Enumerable.Range(1, 100)\    .Where(x =\u0026gt; IsPrime(x));
\

Matthew提出,应该尽量避免在一个循环中进行多种操作,这样会为代码的可读性和维护性带来负面影响。而在Martin Fowler的Refactoring站点中,拆分循环内部逻辑的重构方式被命名为“Split Loop”。Matthew认为较好的方式是将逻辑进行组合,例如求出“100以内质数的数量”便可以这样实现:

\
var primesCount = Enumerable.Range(1, 100)\    .Where(x =\u0026gt; IsPrime(x))\    .Count();
\

对于产生副作用的情况,Matthew引用了Eric Lippert对于“为什么IEnumerable\u0026lt;T\u0026gt;没有ForEach扩展方法”的回应。Eric认为,引入IEnumerable\u0026lt;T\u0026gt;的ForEach扩展方法事实上带来了副作用,而违背了IEnumerable\u0026lt;T\u0026gt;的设计初衷。此外,ForEach还会形成闭包,可能会造成一些难以发现的引用问题。

\

Matthew并没有赞同这种说法,不过它对这个看法表示理解。他认为,如果是使用C#进行编程,使用foreach来遍历一个IEnumerable没有太大问题。不过在F#中,最好还是使用iter或iteri方法进行遍历。关于这点,他使用F#交互命令行进行了演示:

\
\u0026gt; let flip f y x = f x y\- [1..10]\-   |\u0026gt; List.map((*) 2)\-   |\u0026gt; List.filter(flip (%) 3 \u0026gt;\u0026gt; (=) 0)\-   |\u0026gt; List.iter(printfn \"%d\");;\6\12\18\\u0026gt; [1..10]\-   |\u0026gt; List.map((*) 2)\-   |\u0026gt; List.filter(flip (%) 3 \u0026gt;\u0026gt; (=) 0)\-   |\u0026gt; List.iteri(printfn \"%d\\t%d\");;\0       6\1       12\2       18
\

社区中有人认为,这个行动的目的是希望在面向对象编程环境中融入部分函数式编程的理念。C# 3.0引入了Lambda表达式,将高阶函数在.NET中的应用切实地推广开来。同时,其他平台也在进行着类似的改变。例如最近颇受好评的Scala语言也引入了函数式编程特性。

\

你对for的使用有何看法,并且对函数式编程的看法如何?

\
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值