11.1.2.2 使用不可变数据结构

本文探讨了使用不可变数据结构进行编程的优点,特别是在处理集合时如何避免意外修改,以及使用不可变类型如IEnumerable<T>来增强代码的安全性和可推断性。

11.1.2.2 使用不可变数据结构

 

为了演示了以不可变风格,写相同的代码,但不一定必须使用函数式列表;即使使用标准的 List<T> 类型,我们一样能够避免修改集合。然而,不幸的是,要确保不意外修改列表,可能很难。

处理不允许修改的类型,有更好的方法。可以使用真正不可变类型,比如,第三章的FuncList<T>,或者 .NET Framework 中的 ReadOnlyCollection<T>;即使使用 IEnumerable<T>,一样可以得到良好的安全保障;可用于枚举任何集合类型的元素(包括可变的和不可变的),但不给提供任何直接的方式,修改底层集合;如果我们打算从其他线程修改集合,仍然可能有意想不到的结果,但并非这个例子中的情况。

我们使用IEnumerable <T> 实现同样的例子。LoadPlaces 和 PrintLongest方法变化不大,因此,这里就省略了;PrintMultiWord 方法更有意义:因为IEnumerable <T> 类型是不可变的,所以,前面的 RemoveAll策略,就不能再用了。此前,我们用这个方法从集合中删除所有单字地名,副作用使这个方法更难推断。如果我们想使用不可变类型,得到同样的结果,必须更加明确,如清单11.5 所示。

 

清单11.5 使用IEnumerable<T> 实现 PrintMultiWord (C#)

IEnumerable<string> PrintMultiWord(IEnumerable<string>names) {

  varnamesSpace = names.Where(s => s.Contains(" "));     [1]

  Console.WriteLine("Withspace: {0}", namesSpace.Count());

  returnnamesSpace;     [2]

}

 

处理不可变数据结时,是不能修改集合的,因此,该方法首先创建一个新的集合,只包含有多字的地名[1]。我们也实现了前面显式实现的副作用,所以,这个方法现在返回新的集合。当然,这不是真正的副作用,就是返回值。它实现了相同的结果,使调用者能够使用多字地名列表,如果他们想用的话[2]。

我们第一个例子是在所有的地名中找到最长的,第二个例子(输出“NewYork”)返回包含个空格的最长地名。清单11.6 是使用新的函数来实现这两个例子。

 

清单11.6 输出最长和多字最长地名(C#)

IEnumerable<string> places =

  LoadImmutablePlaces();

 

PrintMultiWord(places);

PrintLongest(places);     [1]

IEnumerable<string> places =

  LoadImmutablePlaces();

 

var placesSpace =

  PrintMultiWord(places);    [2]

PrintLongest(placesSpace);    [3]

 

现在,我们已经更明确地进行了修改,就不要对结果有所不同而感到奇怪了。在左侧的版本中,输出“Grantchester”[1],而选择包含空格的最长地名的版本,则输出“NewYork”。

清单11.6 还表明,使用不可变数据类型,可以让推断程序,并决定哪些重构是有效的更容易。在左侧的例子中,我们可以改变PrintMultiWord 和PrintLongest 的顺序,输出结果仍然相同(只是顺序相反);在清单11.6 的右侧,就不能改变调用的顺序,因为值placesSpace 是第一次调用的结果[2]。

因此,重构函数式代码时,可以更容易跟踪计算的依赖关系。我们可以看到,如果一个函数以其他调用的结果作为参数值,说明这个函数依赖于其他调用。因为,这在代码中是明确可见的,我们不可能犯意外重构的错误,由于错误修改的代码将不能通过编译,这在使用单元测试时也是非常有用的。

一、项目背景与意义 1.1项目背景 1.2项目意义 二、灌装系统的模型选择与构建 2.1机器人模型选择 2.2输送机构 2.3灌装机其他相关模型 三、灌装模型搭建与连接 3.1 模型搭建 3.2合适模型连接 四、电气自动化设备的选择设计 4.1 PLC 控制系统的选择 4.2 传感器的选择 五、工作站的smart组件选择 5.1灌装机的smart组件 5.2输送机构的smart组件 5.3搬运机器人的smart组件 5.4机器人把手smart组件 5.5运用到的所有smart组件 六.工作站I/O信号的设计与连接方式 6.1工作站逻辑 6.2程序设计 6.3机器人程序编写 九.设计过程 9.1 需求分析 9.2 方案设计 9.3 各个部分详细设计 9.4 模型搭建与仿真 9.5 设备制造与安装调试 十、设计过程中遇到的问题及解决方案 10.1 灌装精度问题 10.2 设备运行稳定性问题 10.3 控制系统编程问题 十一、总结 11.1 项目成果 11.2 不足之处 11.3 未来展望 参考文献 致谢 根据我提供的以上。帮我写出一套完整的关于瓶装饮料的灌装系统的设计的论文。其中用到的软件是Rob studio 6.08版本。机器人模型用ABB IRB2600。根据这个机器人来写,并且要根据这个软件内提供的东西来编写。并且不要太复杂,电子元件不要太复杂,传感器什么的不要太复杂。就用到一些专科大学用能用到的传感器。普遍用到的。来搭建一套完整的模型跟理论。理论也不要太过复杂,不然看不懂。特别是smart组件要很详细一点,能在软件里找到的。其中一些数据化的东西就不用了,不用弄那么多数据简单一点。不要看不懂。大部分就用大学的书里来用,并且还要分页。加目录。加要点,加步骤。有图片的就加图片,有代码的就加代码,并且代码是能运行的,能放在软件里运行的,搭配里面的元件,还有模型。内容尽可能稍微的能简化就简化。不要长篇大论一大堆。并且里面的原件。能在
最新发布
04-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值