Project Springfield是一个用于在软件中查找关键安全错误的模糊测试服务。微软Springfield团队首席软件工程经理William Blum介绍了他们团队如何利用F#来构建云服务。

简洁性经常被认为是F#的主要优点之一。Blum提供了一些Project Springfield相关的数据:

为了移除一些旧的依赖,我们将一个Perl脚本移植成F#程序,代码量减少了37%。在另外一个工作中,我们将1338行PowerShell脚本移植到F#只需要489行(小了2.7倍)。在这两种情况下,除了代码量的减少,最终的F#程序还在日志记录、可读性和可靠性方面得到了改进(部分由于静态类型检查的原因)。

Jet的软件工程师Rachel Reese在F#的简洁性方面持有相同的观点,她在“为什么电子商务公司选择F#”中提到:

所以,我们开始构建两种方案:C#方案和F#方案,来比较他们的效果。最后,我们选择坚持使用F#。主要原因在于F#使我们能够以更少的代码提供相同的功能,这显然更容易维护并减少了错误。

代码正确性也常常被Springfield团队和F#用户提到。例如,空引用,也被称为“十亿美元的错误”,在F#中是不允许的。在F#中,缺失的数据使用Option类型表示,其中值可以是Some valueOfAVariable或None。

可区分联合并不局限于Option类型,它们也可以表示复杂的对象,然后在模式匹配表达式中使用。下面的代码段演示了一个事件类型和调度它的函数。Blum解释说,代码被授权处理所有情况,因为它是由编译器执行的。

type CustomerId = System.Guidtype EventType =| MsgType1 of CustomerId| MsgType2 of CustomerId * string * int| MsgType3 of CustomerId * string * int option// 用模式匹配来处理信息
let dispatch msg =match msg with| MsgType1 -> ...| MsgType2 -> ...| MsgType3 -> ...

F#还增加了使用类型提供程序验证动态数据源的可能性。类型提供程序支持对数据源(如SQL数据库或JSON)在编译时完成验证,而不是在执行时。

Springfield采用动态分配计算资源的方式,因此需要在运行时生成JSON参数文件,这是一个容易出错的任务。使用F#类型提供程序,我们可以在编译时静态验证我们生成的模板参数是否有效。因为我们的ARM模板不断发展,这极大地加快了开发和调试过程。

Springfield团队还采用了F#来编写脚本。REPL环境F# Interactive提供了一种在没有预先编译的情况下执行F#脚本的方法,这是脚本语言的一个预期功能。

F#脚本的另一个优点是静态类型检查,这对脚本语言来说是不寻常的!实际上,这将大大节省调试时间。IDE中的智能感知功能会立即发现错误(如变量名称中的拼写错误或输入错误)。重构代码也会更加方便。这与我们团队以前采用的PowerShell脚本的脆弱性形成鲜明对比。

原文地址:http://www.infoq.com/cn/news/2017/01/fsharp-project-springfield

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

微软Project Springfield团队的F#使用心得相关推荐

  1. 从卓越工程的角度看微软中国开发团队的成长 (一)

    在进入正题以前,我们来想象一下人类祖先在石器时代后期开始种植农产品的情景.最早发现农作物可以种植的人类祖先可能不小心把种子掉在地上,第二年春天雨季后发现长出了植物并结出果实,而秋天的收获激励他们有意识 ...

  2. WindowsForm如何实现类似微软project软件的甘特图?

    在管理软件研发过程中,特别是涉及项目管理或者生产计划方面,都需要一款类似微软project的控件对项目下的分解任务进行图形展示(甘特图).下面介绍一下在WindowsForm下如何实现类似微软proj ...

  3. 青铜器RDM与微软Project计划进度管理对比分析

    详细从功能.系统性.研发知识管理支撑.分级计划体系.系统开放性.扩展性.安全部署方便性对比分析微软Project与青铜器RDM之间的差别. # 比较项目 青铜器RDM MS Project Serve ...

  4. 微软Project Server 2016正式版下载:支持项目组合管理-搜狐

    微软Project Server 2016正式版下载:支持项目组合管理-搜狐 微软Project Server 2016正式版下载:支持项目组合管理-搜狐 posted on 2016-06-13 1 ...

  5. Agile 正式升级为 Project ,打造团队卓越交付能力

    PingCode Agile (敏捷开发管理)子产品正式升级为 project (项目管理). 此次升级,我们在敏捷开发的基础上增加了对瀑布开发的支持. 除此以外,伴随着 PingCode 从刚发布时 ...

  6. 微软拼音输入法团队博客搬家通知

    因为Windows Live Spaces即将关闭,微软拼音输入法团队博客将迁往CSDN,地址如下: http://blog.csdn.net/mspinyin CSDN博客平台是一个面向IT专业技术 ...

  7. 开发以及团队管理方面的心得总结

    本人有四年的工作经验,大学里也有不少项目经验,现在分享一些做事以及团队管理方面的心得总结: 开发方面的经验 在我看来,开发工作可以从如下几个角度去看: 1.不确定性的减少过程 就像以前华罗庚所说的读书 ...

  8. 关于团队管理的一些心得体会

    从单打独斗到并肩作战再到团体作战,踏上工作岗位一年来,笔者实现了这样的初级转变.笔者忽然深深地感觉到,自身已然不是最初的独立战斗,而是逐步走向了团队合作,并且这种团队合作在项目开发过程中愈发凸显其重要 ...

  9. Failed to clean project: Failed to delete F:\x\x\target\xx\xxx.jar

    前言: 我们在开发maven项目的时候,会经常开发打包,执行maven的指令:clean.install等.当有的时候我们执行maven的clean指令时,控制台会报如标题的一个错误,这篇文章讲解下怎 ...

最新文章

  1. SAP HUM事务代码HUMO里显示内层和外层HU信息
  2. ARC下带CF前缀的类型与OC类型转换
  3. [云炬ThinkPython阅读笔记]2.9 术语表
  4. memcache在ThinkPHP中的使用1---PHP下安装memcache
  5. php如何解释xml,PHP – 如何解析这个xml?
  6. LeetCode 2104. 子数组范围和(单调栈)
  7. python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例
  8. 大学c语言电脑考试判卷,全国计算机等级考试判卷的玄机
  9. SpringBoot 集成 阿里的 FastJson
  10. 数据结构概念及连续存储数组的算法演示
  11. 【MCVRP】基于matlab模拟退火算法求解带多种容量的车辆路径规划问题【含Matlab源码 918期】
  12. 图邻接表拓扑排序算法c语言完整,在用邻接表表示图时,拓扑排序算法时间复杂度为()...
  13. 如何在 Codeforces 上出题?
  14. 2021总结:躺平的一年
  15. Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机设备的各种固件信息如DeviceID或者SerialNumber等(C++)
  16. 程序员必备编辑器软件
  17. python excel数据分析画直方图 饼状图_Excel数据可视化应用(直方图、折线图、饼状图)...
  18. 4.25 使用图标集功能标识指定范围的数据 [原创Excel教程]
  19. 利用黑客手段一台手机“变”出千万台,新型诈骗技术曝光
  20. 电子设计应用超声波测距仪的设计

热门文章

  1. CMD、AMD、commonJs 规范的写法
  2. 独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!
  3. nginx对websocket的支持及uliweb chatroom的测试
  4. 谈谈关于MVP模式中V-P交互问题
  5. asp.net 得到上一页地址
  6. 我将 20 年前开发的操作系统迁移到 .NET 6,竟然成功了!
  7. C# 使用阿里云发送短信
  8. Dapr牵手.NET学习笔记:Actor一个场景
  9. 讲师征集| .NET Conf China 2021正式启动!
  10. FastTunnel - 打造人人都能搭建的内网穿透工具