oam 纯度_我编程中的纯度:Go中的函数
oam 纯度
在Javascript世界中,纯函数经常被大肆宣传,这可能是由于前端应用程序中的状态丰富。 尽管纯函数有其缺点(即带来不便,可能存在大量参数列表),但我认为应尽可能合理地使用它们,并且我想关注Go中的纯函数。
什么是纯函数?
根据Wikipedia所述 ,Pure函数具有以下属性:
- 对于相同的参数,其返回值是相同的(局部静态变量 , 非局部变量 ,可变引用参数或来自I / O设备的输入流无变化)。
- 它的评估没有副作用 (本地静态变量,非本地变量,可变引用参数或I / O流不会发生突变)。
这意味着作为开发人员,我知道两件重要的事情:
- 当我调用一个纯函数时,每次都会得到相同的精确结果
- 调用纯函数后,我的程序将处于与调用前相同的状态(时间会流逝,并且我将已分配函数的结果)
由于这些特性,纯函数使应用程序简单。 众所周知,简单的应用程序通常会更快,更易于测试和调试,并且更不易出错。
Go(golang)中的示例
totalCounted :=map [ string ] int {}func countNamesInText (text string ) {total := 0const name = getNameFromDatabase()for _, word := range strings.Split(text, " " ) {if word == mention {total++}}totalCounted[name] = total
}
此功能不纯,原因有两个。 让我们检查每个。
1.通过调用countNamesInText()改变程序状态
我们应该通过return语句返回数据,而不是将全局变量变异为“返回”数据给调用者的方法。 我们可以假设这样做是因为在程序的其他地方存储计数映射是个好主意,但是最好在计数功能之外处理状态管理:
func countNamesInText (text string ) int {totalCounted := 0const name = getNameFromDatabase()for _, word := range strings.Split(text, " " ) {if word == mention {totalCounted++}}return totalCounted
}
更好的是,此功能更“纯净”,因为它不会更改应用程序的状态。
2.数据库参数
我们的函数仍然不纯正,因为从数据库中检索了影响函数调用结果的“名称”值。 为了使我们的函数具有确定性,该值应改为作为参数传递。
目前,如果我们编写了测试:
func TestCountNamesInText (t *testing.T) {assert.Equal(t, 2 , countNamesInText( "this word here" ))
}
它不能始终如一地工作。 如果未设置数据库,或者数据库被篡改,我们的测试将失败。 这使它成为一个不好的测试,并且由于功能不纯而我们写了不好的测试。
让我们进一步净化一下:
func countNamesInText (text, name string ) int {totalCounted := 0for _, word := range strings.Split(text, " " ) {if word == mention {totalCounted++}}return totalCounted
}
我们的功能是纯洁的! 现在我们可以进行良好的测试:
func TestCountNamesInText (t *testing.T) {assert.Equal(t, 1 , countNamesInText( "this word here" , "this" ))
}
如果我们包括状态管理和数据库调用在内,现在我们的应用程序看起来将是什么样子:
totalCounted :=map [ string ] int {}
name := getNameFromDatabase()
totalCounted[name] = countNamesInText( "some name in here" , name)
谢谢阅读!
莱恩·瓦格纳@wagslane
在Qvault学习: https ://classroom.qvault.io
先前发表于 https://qvault.io/2019/10/30/purity-in-my-programming-please/
翻译自: https://hackernoon.com/purity-in-my-programming-pure-functions-in-go-c21m3u2z
oam 纯度
oam 纯度_我编程中的纯度:Go中的函数相关推荐
- 前端_网页编程 Form表单与模板引擎(中)
目录 ... ... (续上篇) 四.模板引擎的基本概念 1.定义 2. 优点 五.art-template模板引擎 1.art-template模板引擎介绍 2. art-template的安装 3 ...
- javascript函数式_如何以及为什么在现代JavaScript中使用函数式编程
javascript函数式 by PALAKOLLU SRI MANIKANTA 通过PALAKOLLU SRI MANIKANTA In this article, you will get a d ...
- java中能构成循环的语句_《编程导论(Java)#183;3.2.4 循环语句》
本文全然复制<编程导论(Java)·3.2.4 循环语句>的内容.除[]中的说明文字.请阅读和比較其它编程教材. 我知道.假设我是一个刚開始学习的人,<编程导论(Java)>非 ...
- python库文档的错误_自己编程中遇到的Python错误和解决方法汇总整理
开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析,并持续更新,方便以后查询,学习. 知识在于积累嘛!微笑 +++++++++++++++++++++++++++++++++ ...
- 机器学习中决策树的随机森林_决策树和随机森林在机器学习中的使用
机器学习中决策树的随机森林 机器学习 (Machine Learning) Machine learning is an application of artificial intelligence ...
- 响应式编程 函数式编程_函数式编程的基本原理简介
响应式编程 函数式编程 After a long time learning and working with object-oriented programming, I took a step b ...
- latex 表格中虚线_如何识别和修复表格识别中的虚线
latex 表格中虚线 When documents are digitalized via scanning or via photo, the image quality can suffer f ...
- 数据科学家访谈录 百度网盘_您应该在数据科学访谈中向THEM提问。
数据科学家访谈录 百度网盘 A quick search on Medium with the keywords "Data Science Interview" resulted ...
- 前端_网页编程 Form表单与模板引擎(下)
目录 续上一篇 6. 模板引擎的实现原理 6.1 正则与字符串操作 6.1.1 基本语法 6.1.2 分组 6.1.3 字符串的replace函数 6.1.4 多次replace 6.1.5 使用wh ...
最新文章
- 中国第三代半导体行业应用动态与十四五发展格局展望报告2022版
- ITK:复制复合变换CompositeTransform
- endnote能自动翻译吗_自动挡和手自一体有啥区别?从外表能看出一辆车是哪种变速箱吗?...
- 权限细粒度管理(转)
- 苹果手机投屏软件_苹果手机怎么投屏到电脑上?支你一招
- CCKS 2018 | 最佳论文:南京大学提出DSKG,将多层RNN用于知识图谱补全
- Hbase面试 描述 Hbase 中 scan 和 get 的功能以及实现的异同.
- ajax:前后端json传值写法
- attention机制的几种方法
- android+tv+直播源diy,目前HDP直播自定义节目源
- EDA技术实用教程 | 复习九 | 数据选择器的行为级描述
- imx6 rtl8821cs wifi驱动调试
- 第二单元 用python学习微积分(十六)定积分
- safari遮罩无效
- Python书写格式
- 能源物联网及其关键技术
- faster-RCNN tensorflow-gpu环境配置及安装出现的问题
- 信用评分卡DAY8-9
- 【已解】英雄联盟lol撸啊撸“寻找对局”按钮无法点击,开不了赛解决方法
- 迁移selenium脚本迁移后出现unknown error: DevToolsActivePort file doesn‘t exis