【发布时间】:2018-01-17 00:05:30
【问题描述】:
我是函数式编程的学生。我仍在让自己摆脱旧的可变突变习惯。但有时我会卡住。好的,那么问题来了——假设我们有以下闭包
const bookShelf = () => {
let books = []
const listBooks = () => books
const addBook = (book) => {
books = books.concat(book)
return function removeBook() { books = books.filter( b => b !== book ) }
}
return {addBook,listBooks}
}
const { addBook, listBooks } = bookShelf()
const removeMobyDick = addBook('Moby Dick')
const removeWalden = addBook('Walden')
removeWalden()
console.log(listBooks()) // ["Moby Dick"]
请注意,我有一个发生变异的对象:书籍。
我的问题是,我怎样才能重构这段代码,使书籍是不可变的,但我达到了相同的最终结果。如果需要,请随意使用像 Ramda 这样的函数库。我在这里的天真想法是以某种方式使用递归来传递书籍的新值,然后将该版本传递回去。似乎有点过头了,所以我想向这个领域更博学的人寻求帮助。
感谢您的洞察力!
【问题讨论】:
-
首先我会将
addBook和removeBook拆分为两个函数。我认为这是一个糟糕的设计,因为要删除一本书,您必须参考删除它的函数。如果我想删除 N 本书,那么我必须 N 引用removeBook函数。 -
对于
addBook,返回一个包含添加的书的新数组。removeBook也一样
标签: javascript ecmascript-6 functional-programming immutability ramda.js