11.1 重构函数式程序

重构是许多现代开发方法的一个主要部分。在一些语言中,这种技术也支持集成开发环境(IDE),比如,Visual Studio 中的C# 编辑器。大多数重构技术是为面向对象范式而开发的,但是,我们将从函数的角度来讨论。

重构

重构是修改源代码的过程,改善设计,但不改变其含义。重构的目标是使代码更具可读性,在未来更容易修改或扩展,或者改进其结构。一个简单的重构例子是重命名方法,使名字更具描述性;另一个例子是,把一段代码转换成方法,实现重用,以避免代码重复。

有了重构,我们首先写出能运行的代码,然后,再使代码更“干净”。把这两项任务分开来执行,简化了测试,因为重构不会影响应用程序的行为。有些改变相当简单,比如,重命名(特别是有了工具的帮助),而还有一些可能需要更周到的考虑。

如果改变两个语句的顺序之后,代码的行为方式还会相同吗?使用有副作用的命令式代码,必须仔细审查这两个语句;而函数式编程使代码的推理容易,所以,重构也就变得更容易了。在这一节,我们会有几个示例,但先从消除重复代码的函数式重构开始。

时间: 2024-12-16 23:22:15

11.1 重构函数式程序的相关文章

第十一章 重构和测试函数式程序

第十一章重构和测试函数式程序 本章介绍 ■重构函数式程序 ■使用不变性推理代码 ■为 F# 程序写单元测试 ■使用延迟值缓存结果 这本书的主题之一就是,函数编程理如何使解代码更容易理解,只需要通过阅读就可以:特别是在需要修改陌生程序,或者通过组合现有函数实现行为,或者重构现有的代码时,尤为重要.函数式编程更容易重构,缘于清晰度和模块化:可以改善代码,并且有信心这种改变不会破坏程序的其他部分. 正如在函数式编中的很多事情一样,修改代码而不改变其含义的思想,与数学密切相关,因为不改变表达式含义的操作

11 函数和函数式编程 - 《Python 核心编程》

?? 什么是函数 ?? 调用函数 ?? 创建函数 ?? 传入函数 ?? 形参 ?? 变长参数 ?? 函数式编程 ?? 变量的作用域 ?? 递归 ?? 生成器 11.1 什么是函数? 函数是对程序逻辑进行结构化或过程化的一种编程方法. 函数可以以不同的形式出现. declaration/definition          def foo(): print 'bar' function object/reference    foo function call/invocation      

1.4.2.1 阅读函数式程序

我们在清单 1.1 中看过一个示例,就是使用了不可变类型,我们的结论是,不可变类型使代码更具可读性.在本节,我们将考虑两段代码,可以用在我们函数式游戏中. 清单 1.8 中有两个示例,都涉及两个游戏角色(player 和 monster).第一个示例说明怪物[1] [ 原文中的 AI,应该就是这个 1 ]如何移动一步,然后,判断玩家是否正处于危险之中,第二示例演示如何射击. Listing 1.8 Code snippets form a functionalgame (C#) var move

[原创译书] JS函数式编程 2.3 函数式程序员的工具集

?? Functional Programming in Javascript 主目录第二章 函数式编程基础上一节 与函数共舞 函数式程序员的工具集 如果你仔细看了到目前为止出现过的示例代码,你会发现这里面的一些方法不太熟悉. 它们是map().filter()和reduce()函数,它们对任何语言的函数式编程都至关重要. 它们可以让你不必使用循环和语句,写出更简洁的代码. map().filter()和reduce()函数组成了函数式程序员工具集的核心部分,这个工具集包括一系列纯的. 高阶的函

《重构--改善既有代码的设计》总结or读后感:重构是程序员的本能

此文写得有点晚,记得去年7月读完的这本书,只是那时没有写文章的意识,也无所谓总结了,现在稍微聊一下吧. 想起写这篇感想,还是前几天看了这么一篇文章 研究发现重构软件并不会改善代码质量 先从一个大家都有的经历说起吧. 刚开始学编程时,比如,要统计数字出现的次数,我们会这么定义变量 int i=0;//统计次数 老师看了说,代码要有可读性,见名知意; 于是,我们把它改成 int count=0; 后来才知道,原来这么一手这就是重构的第一式,重命名 (eclipse快捷键 alt+shift+R,最近

c++11改进我们的程序之垃圾回收(一)

c#和java中有自己主动垃圾回收机制,.net执行时和java虚拟机能够管理分配的堆内存,在对象失去引用时自己主动回收,因此在c#和jva中,  内存管理不是大问题.c++语言没有垃圾回收机制,必须自己去释放分配的堆内存,否则就会内存泄露. 我相信大部分c++开发者都遇到过内存泄露的问题,而查找内存泄露的问题往往要花大量的精力.要解决这个让人头疼的问题可  以採取一些办法,最有效的办法是使用智能指针!使用智能指针就不会操心内存泄露的问题了,由于智能指针能够自己主动删除删除分 配的内存. 智能指

如何用微服务重构应用程序

在决定使用微服务之后,为了将微服务付诸实践,也许你已经开始重构你的应用程序或把重构工作列入了待办事项清单. 无论是哪种情况,如果这是你第一次重构应用程序,那么您和您的团队必将在某个时刻面临一个显而易见的问题:如何重构应用程序以实现微服务? 这也正是这篇文章要思考和探讨的. 重构基础 在讨论如何将重构转化为微服务之前,退后一步,仔细观察微服务的内容和时间是很重要的.以下两个要点将会对任何微服务重构策略产生重大影响. 重构=重新设计 将一个单体式的应用程序重构为微服务,与重新设计一个基于微服务的应用

【重构学习】11 大型重构

好了,前面所有的都是很简单的例子,现在开始的是大型重构. 对于大型重构来说,情况复杂多变,耗时也会很长,前面的简单重构大多是在一个小时内可以完成,但是对于大型重构来说可能需要几个月,甚至数年.如果是一个运行中的系统,重构起来只能每天一点点去慢慢重构. (恕我直言,在国内恐怕这样的公司也很少.所以我们要自己养成随时重构的习惯,不要挖坑给自己埋最好.没谁能给你这么长时间重构,特别当你是个低端程序员的时候.你得相信,你所有偷懒的举动,都会给你以后的工作带来麻烦.除非你明天走人了,那么你的锅可能就给我背

《使用 C++11 编写 Linux 多线程程序(转载收藏)》

转载自: http://www.ibm.com/developerworks/cn/linux/1412_zhupx_thread/ 本文讲述了如何使用 C++11 编写 Linux 下的多线程程序,如何使用锁,以及相关的注意事项,还简述了 C++11 引入的一些高级概念如 promise/future 等. 前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web