热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

副作用是编程头号敌人!如何剥离它?spin

随着时间的推移,我注意到一种设计启发式方法,它极大地帮助了我完成无数项目。这种启发式的地方在于它在概念上易于理解和应用,但它自然会引导您更接近函数式编程。事实上,这与Haskell



随着时间的推移,我注意到一种设计启发式方法,它极大地帮助了我完成无数项目。
这种启发式的地方在于它在概念上易于理解和应用,但它自然会引导您更接近函数式编程
事实上,这与 Haskell 处理 IO 的方式非常相似。它也是 React 等现代 Web/UI 框架的核心理念。
 
为了说明这一点,让我们看一个例子:
你正在处理一个涉及安排未来用户通知的事情:有一些输入需要考虑,比如用户喜欢的时间和时间的推移;你已经决定提前一周安排它们;你需要定期安排新的通知,但你也可能需要删除或重新安排现有的通知。
 

对于未来一周的每一天foreach
  是否没有安排通知?if
    现在就生成并安排(副作用!)。
  否则,应该重新安排吗?else
    删除现有的通知(副作用!)。
    生成并安排新的通知(副作用!)。


 
在这个ifelse例子中,我们在进行处理的同时也在修改世界。
副作用本质上并不坏:事实上,它们是编写软件的全部意义所在。如果你的代码没有效果,就不会有人使用它。

不过,还是要问问自己,你怎么能把这些副作用保存到最后?
归根结底,办法就是建立一些数据,描述需要采取的任何行动。

对于未来一周的每一天foreach
  是否没有安排通知?if
    在输出中添加一些数据,描述一个新的通知
  否则,是否应该重新安排?else
    在输出中添加一些数据描述如何删除该通知
    并添加更多关于如何安排其替换的数据




这段伪代码输出:

[{action: "remove", notificationId: 4},
 {action:
"create", time: "some ISO8601 time"}]



然后你会把这些数据交给另一个更简单的函数,由这个更简单的函数来执行这些副作用。
 
诚然,这种启发式方法将导致你做一些额外的工作,但也有很多好处。其中。

首先,它创造了一个自然边界,对测试非常有用。上面的伪代码中的逻辑(如 "否则,是否应该重新安排?")实际上可能相当复杂。

在系统中,决定实施什么变化的逻辑往往比实施上述变化的逻辑要复杂得多。通过划定这个边界,你可以获得编写更少的艰巨的测试的好处。要模拟的东西更少,而且很容易为数据写断言。

第二,调试变得更加容易。能够问一个系统要做什么,并在它开始执行之前收到其计划的完整快照,这真的很神奇。这对于更复杂的功能来说尤其如此,例如与外部系统的同步。

最后,这种方法使你能够轻松地进行分层转换。使用上面的例子,假设你的通知调度器应该避免某些假期。你可以写一个简单的函数,接收一个调度行为的列表,并过滤掉任何发生在特定日期的行为。


 


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • 解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因
    本文介绍了解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因。其中包括修改包名、解决service name重复、处理jar包冲突和添加maven依赖等解决方案。同时推荐了一个人工智能学习网站,该网站内容通俗易懂,风趣幽默,值得一看。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 【MEGA DEAL】Ruby on Rails编码训练营(97%折扣)限时特惠!
    本文介绍了JCG Deals商店提供的Ruby on Rails编码训练营的超值优惠活动,现在只需29美元即可获得,原价为$1,296。Ruby on Rails是一种用于Web开发的编程语言,即使没有编程或网页设计经验,也能在几分钟内构建专业的网站。该训练营共有6门课程,包括使用Ruby on Rails进行BDD的课程,使用RSpec 3和Capybara等。限时特惠,机会难得,赶快行动吧! ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 随着前端技术的发展,越来越多的开发者开始使用react、vue等web框架,但很少有人深入理解这些框架的源码。然而,这些框架底层都是由原生的javascript构建而成。对于初学前端的人来说,可能会认为javascript很容易上手,但实际上只是因为它被高度封装了。与能够使用封装类的人相比,能够理解框架原理的人则处于另一个层面。本文将深入剖析jquery源码,探寻框架底层的原理,帮助读者更好地理解web框架的运行机制。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 程序员_阿里Antd藏圣诞节彩蛋 程序员被离职
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了阿里Antd藏圣诞节彩蛋程序员被离职相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
沈晓燕-东东
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有