《编程导论(Java)·3.1.2 方法》之 副作用
4. 副作用
在一些语言如Pascal中,子程序被分成两种:函数和过程。尽管Java没有强制性地要求将方法区分为命令和函数。然而这样的差别对于良好地设计程序有非常大的帮助[1]。
首先说明一个概念:副作用(side effect)。副作用通常是针对操作(表达式)而言的,一个操作/表达式有“副作用”是指在对该表达式求值时,会改变程序的一个或多个数据,以致再次对该表达式求值时。可能会得出不同的结果。其实。Java的4种表达式语句如赋值、自增自减、方法调用、对象创建都可能带来副作用。
这里讨论方法的副作用。一个方法的运行,假设在返回一个值之外还导致某些外部“状态”发生变化,则称该方法产生了副作用。这里所谓“状态”发生变化,能够是实例域或静态变量被改动、方法的实參被改动(Java 中不会出现这样的情况。可是实參为引用时,其指向的对象可能被改动从而产生副作用)、将数据传递给显示器、打印机或存入文件里等等。
当然,方法内部的表达式也会出现副作用。假设它只影响局部变量而不影响外部状态,则方法没有副作用。基于副作用概念。定义两个术语:
² 有返回值并且没有副作用的方法称为函数(function)。
² 没有返回值的方法必定有副作用,除非它的方法体是空的或者方法没有意义。所以,没有返回值的方法、有返回值但有副作用的方法称为过程(procedure)或命令(command)。
简言之。有副作用的方法称为过程。
如此严格地定义出函数的概念,是由于函数使得系统的状态稳定,函数的行为easy预測。
更进一步,假设函数是纯粹的函数(pure function,纯函数)——它的输出值依靠和只依靠其输入、对于同样的输入总是返回同样的值,(由于纯函数的纯粹和无副作用)对纯函数的调用就行被一个值代替(或者说,将方法视为一个值),这就是函数式编程语言中著名的引用透明(referentialtransparency)特性。
例程 3‑3纯函数 package semantics.method;
public class SideEffectsDemo{
private static int x = 0;
//纯函数(pure function)
public static int times(int i,int j){
return i * j ;
}
//非纯函数
public static int m(int i,int j){
return i * j +x;
}
}
在函数式编程语言(functionalprogramming language)如Haskell[2]中,尤其强调避免副作用。
当然了,全然不产生副作用的编程语言是没有不论什么用处的。比如数据显示和存入文件等等副作用都是必要的。强调无副作用的Haskell 语言。使用一种技术将它们分离出来,用一种安全的方式单独运行。
Java是命令式面向对象语言,但可以借鉴函数式语言的长处,也期待Java中增加重要的函数式语言的特性。随着Java 8的公布,引入的λ表达式(Lambda Expressions)表明。Java開始大力引入函数式语言的特性。(They enable you to treat functionality as a method argument, or code as data.)
|
练习3-5:何谓方法、函数、纯函数? 解释副作用的含义。 |
|
练习3-6:实现方法,求f(x)=x^3 + 3x+1。注:书中x^3表示x*x*x. |
《编程导论(Java)·3.1.2 方法》之 副作用的更多相关文章
- 《编程导论(Java)·2.1.3改写(override)》
<编程导论(Java)·2.1.3改写(override)>,收集override内容. 方法改写(method overriding)是指对于父类定义的一个实例方法,同意子类提供自己的实 ...
- 《编程简介(Java) ·10.3递归思想》
<编程简介(Java) ·10.3递归思想> 10.3.1 递归的概念 以两种方式的人:男人和女人:算法是两种:递归迭代/通知: 递归方法用自己的较简单的情形定义自己. 在数学和计算机科学 ...
- 《编程导论(Java)·1.1.2 颠倒的世界(柏拉图法则)》
假设你读<编程导论(Java)·1.1.2 颠倒的世界(柏拉图法则)>感到无趣,请尝试评价这个段子. 3. Classes Classes drive me crazy. That mig ...
- 《编程导论(Java)·3.3.2 按值传递语义》
不要受<Java编程思想>的影响,计算机科学中的术语--按引用传递(pass-by-reference).不要搞成自说自话的个人用语. 这些术语也不是专门针对Java的,你不应该从某一本J ...
- 《编程导论(Java)·1.4.1 范式》
这个楼主,是我的学生么?2013年写的! 嗯."编程范式或许是学习不论什么一门编程语言时要理解的最重要的术语".这句话早在2005年出版<Java程序设计>(宋中山,严 ...
- 《编程导论(Java)·3.2.4 循环语句》
本文全然复制<编程导论(Java)·3.2.4 循环语句>的内容.除[]中的说明文字.请阅读和比較其它编程教材. 我知道.假设我是一个刚開始学习的人,<编程导论(Java)>非 ...
- 《编程导论(Java)·9.3.1回调·3》回调的实现
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yqj2065/article/details/31441221 接<9.3.1Java回调 · ...
- Java多线程编程核心技术---Java多线程技能
基本概念 进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据结构在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的独立单位.线程可以理解成是在进 ...
- paip.批处理清理java项目冗余jar的方法
paip.批处理清理java项目冗余jar的方法 在myeclipse中开发的java项目遇到jar包冗余情况,如何删除项目中的冗余jar包啊?项目很大jar包一百多个. 2010-09-14 14: ...
随机推荐
- 解决android的键盘弹出时,html页面的高度被压缩
如果元素的高度是用100%表示,那么,安卓的键盘弹出时,高度会发生变化,导致布局混乱,所以最好给高度设置像素高度 $("html,body").height(window.inne ...
- CAD使用SetxDataString写数据(com接口)
主要用到函数说明: MxDrawEntity::SetxDataString 写一个字符串扩展数据,详细说明如下: 参数 说明 [in] BSTR val 字符串值 szAppName 扩展数据名称 ...
- 判断Exe(DLL)和符号文件是否匹配---验证模块和符号文件是否匹配的工具和方法
当我们进行程序调试时,有时调试器会直接告诉你符号文件不对,或则显示出的调用栈不对,当你怀疑符号文件不匹配时,如何确定呢? 如果是用windbg调试,请用 !chksym 模块名比如,匹配的时候 不匹 ...
- 雷林鹏分享:PHP Secure E-mails
在上一节中的 PHP e-mail 脚本中,存在着一个漏洞. PHP E-mail 注入 首先,请看上一章中的 PHP 代码: if (isset($_REQUEST['email'])) { // ...
- 全国高校绿色计算大赛 预赛第二阶段(Python)
第1关统计分数的麻烦 class Task: def get_lost_scores(self, scores): s = "" index = [1 for i in range ...
- LBE_登录Demo
目录 服务器 最小资产库创建 entity配置 实体的Python实现 创建第一个空间Space 让entity进入空间Space 客户端(unity) 生成客户端SDK 实现Client部分验证 验 ...
- 反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例
背景 今天在日常数据库检查中,发现一SQL运行时间特别长,于是抓取出来,进行优化. 优化前: 耗时:503s 返回:0 SQL代码 SELECT * FROM MM_PAYABLEMONEY_TD P ...
- http2提升效率的几个点
1.二进制传输,消息的解析效率更高 2.头部数据压缩,传输效率更高 3.多路复用,可以让请求并发执行 4.服务器推送,可以主动推送数据到浏览器 http2加载图片demo:https://http2. ...
- Nginx出现403 forbidden (13: Permission denied)报错的四种原因
一.由于php-fpm启动用户和nginx工作用户不一致所致 php-fpm启动用户配置位置 nginx工作用户配置位置 二.不存在在文件,可能是文件路径有误,可以查看nginx错误日志来判断 三.缺 ...
- 第十一节:pandas统计函数
1.pct_change()计算增长比例 2.cov()协方差 3.corr()相关系数 4.rank()数据排名 5.numpy聚合函数