We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
单纯的函数更容易阅读与理解。所有函数的依赖关系都在其定义中,所以更容易看到。单纯的函数功能往往很小而且只做一件事。它们不使用this,这个一直是混乱的源头。
Chaining是被用来简化多个方法一个接一个的应用于对象的技巧
让我们来比较下两种风格: 过程式和函数式。在函数式风格中,我使用列表操作的基本方法,filter()和map()。然后把他们连在一起。
我们拿任务的收集举例。一个任务有id,desc, completed(boolean), type
// Imperative style var filteredTask = []; var task, i; for(i = 0; i < task.length; i++) { task = tasks[i]; if (task.type === "RE" && !task.completed) { filteredTask.push({id: task.id, desc: task.desc}); } } // Functional style function isPriorityTask(task) { return task.type === "Re" && !task.completed } function toTaskViewModel(task) { return {id: task.id, desc: task.desc} } var filteredtask = tasks.filter(isPriorityTask).map(toTaskViewModel);
注意filter() 和 map() 的回调是用的以揭示意图命名的纯方法
在之前的例子中,我使用了无参数风格构造函数。无参数是通过减少不必要的参数来提高可读性。想一下如下代码
tasks.filter(task => isPriorityTask(task)).map(task => toTaskViewModel(task));
无参数风格是没有参数的:
tasks.filter(isPriorityTask).map(toTaskViewModel);
接下来,我想了解如何提高代码的可读性并且重用现有的功能。在此之前,我们需要一个新的函数
偏函数应用是指将多个参数修复为一个函数的过程,这是从泛化到专业化的一种方式
对于偏函数应用,我们可以使用流行库比如 underscore.js 或者 lodash.js 中的 partial(),bind() 方法也能实现偏函数应用
假设我们想要重构以下过程式编程,改为更易读的函数式编程
var filteredTask = []; var task, i; for(i = 0; i < tasks.length; i++) { task = tasks[i] if (task.type === 'NC') { filteredTask.push(task) } }
就像我说的,这次我们想创建一个通用的函数可以用来任意类型的过滤。isTaskOfType() 是一个通用的函数。 bind() 被用来创建一个新的判定函数 isCreateNewContent(),可以过滤特定的类型
判定函数是一个将一个项目作为输入,并根据项目是否满足条件来返回true/false的方法
function isTaskOfType(type, task) { return task.type === type; } var isCreateNewContent = isTaskOfType.bind(null, 'NC'); var filteredTasks = tasks.filter(isCreateNewContent)
注意判定函数,它有一个表达其意图的名称。当我读到 task.filter(isCreateNewContent)时,我清楚的理解我正在选择什么样的任务
我们拿购物清单来举一个新的例子。我们需要计算总金额以及水果的总金额。以下是过程式编程风格
var totalPrice = 0, fruitsPrice = 0, i, line; for (i = 0; i < shoppingList.length; i++) { line = shoppingList[i]; totalPrice += line.units + line.price; if (line.type === 'fruits') { fruitsPrice += line.units * line.price; } }
在这种情况下完成函数式编程,我们需要使用reduce()来计算总金额
reduce()方法用来累计计算集合所有的值为一个值
就像我们之前那样,我们创建一个回调所需要的新方法,并且给他们一个揭示意图的名称:computePrice()和areFruits().
function computePrice(totalPrice, line) { totalPrice += line.units * line.price; return totalPrice } function areFruits(line) { return line.type === 'fruits' } var totalPrice = shoppingList.reduce(computePrice, 0) var fruitsPrice = shoppingList.filter(areFruits).reduce(computePrice, 0)
将函数编程应用于列表操作将会按以下步骤中断操作: filter, map, reduce, sort。同时,它将要求你定义新的单纯小函数去支持这些操作
结合函数式编程和赋予揭示意图的名称能够很大提高代码的可读性
原文地址: Make your code easier to read with Functional Programming
The text was updated successfully, but these errors were encountered:
No branches or pull requests
1. Chaining(链式)
让我们来比较下两种风格: 过程式和函数式。在函数式风格中,我使用列表操作的基本方法,filter()和map()。然后把他们连在一起。
我们拿任务的收集举例。一个任务有id,desc, completed(boolean), type
注意filter() 和 map() 的回调是用的以揭示意图命名的纯方法
2. Point-free style(无参数风格)
在之前的例子中,我使用了无参数风格构造函数。无参数是通过减少不必要的参数来提高可读性。想一下如下代码
无参数风格是没有参数的:
3. Partail Application(偏函数应用)
接下来,我想了解如何提高代码的可读性并且重用现有的功能。在此之前,我们需要一个新的函数
对于偏函数应用,我们可以使用流行库比如 underscore.js 或者 lodash.js 中的 partial(),bind() 方法也能实现偏函数应用
假设我们想要重构以下过程式编程,改为更易读的函数式编程
就像我说的,这次我们想创建一个通用的函数可以用来任意类型的过滤。isTaskOfType() 是一个通用的函数。 bind() 被用来创建一个新的判定函数 isCreateNewContent(),可以过滤特定的类型
注意判定函数,它有一个表达其意图的名称。当我读到 task.filter(isCreateNewContent)时,我清楚的理解我正在选择什么样的任务
4. Reduce
我们拿购物清单来举一个新的例子。我们需要计算总金额以及水果的总金额。以下是过程式编程风格
在这种情况下完成函数式编程,我们需要使用reduce()来计算总金额
就像我们之前那样,我们创建一个回调所需要的新方法,并且给他们一个揭示意图的名称:computePrice()和areFruits().
总结:
将函数编程应用于列表操作将会按以下步骤中断操作: filter, map, reduce, sort。同时,它将要求你定义新的单纯小函数去支持这些操作
结合函数式编程和赋予揭示意图的名称能够很大提高代码的可读性
原文地址: Make your code easier to read with Functional Programming
The text was updated successfully, but these errors were encountered: