现在读动物书,有一种崇敬的感觉。上一节讲述了JavaScript中重构的概念是什么,应该如何选择、学习和使用JavaScript,以及测试对于重构的重要性;中间描述了重构的目标、需要注意的结构和一些值得注意的地方;最后提到了异步、模式和函数式编程的一些思想。可以这样描述:有一个密室,给你一些物品,然后用上帝的视角告诉你这些物品的作用,以及你可以选择或参考的路线,包括分析你可能走错路线了,最后告诉你怎么走比较好看。比较感人的部分之一是:相信你的代码,不要害怕测试,遵循一些特定的规范和模式,你就可以重构你的代码。如果你愿意学习一些新思想,你的代码会更好。漂亮,你的项目会更加健壮,你的技术(包括思路)会有质的飞跃。Introduction下图是一本书的介绍(摘自网上商城):Excerpts以下是文章的部分节选。个人觉得值得学习和思考的地方很多,当然也有个人理解的成分。(有些专业术语就不具体介绍了,因为太多了。。。)第一章:什么是重构?当我们在测试时,我们有足够的信心重构代码并更改实现。如果没有这些测试,我们就会将我们真正关心的行为(输入和输出)置于风险之中。性能(和其他非功能方面)是我们决定围绕其创建期望和测试的次要关注点。过去20年一个流行的比喻是技术债务。高质量的代码一般有以下几个原则:SOLID:单一职责原则、开闭原则、里氏代换原则、接口隔离原则、依赖倒置原则。DRY:不要做重复的事情。KISS:保持简单直接。GRASP:通用责任分配软件模式。YAGNI:你不需要它。将人类可读性视为质量重构探索第2章:您使用哪种JavaScript?我应该使用哪个框架?这是JavaScript开发者经常问的问题,也可能是新开发者最大的问题,“我应该学习哪种语言?”受框架限制的工作方式可以给程序员一种他们真的无所不知的感觉。用夸大的甚至自相矛盾的要求来描述一份工作是无济于事的。当谈到JavaScript时,有太多的框架、平台和最终不同类型的代码,您可能都编写过,所以某种形式的问题一次又一次地出现。最终,您无法学习所有内容。如果您的工作或目标确实需要某些技能,请先花时间在这些技能上。如果你心中没有特定的工作,那就去参加聚会,寻找朋友和导师并跟随他们。或者,如果你只是想学习一些你感兴趣的东西,选择一些看起来很酷的东西,然后深入挖掘,继续前进,并希望在某个时候精通这些技术。您可以跨语言、框架、测试库或工具应用相同的过程(按工作要求、您的朋友正在使用的内容以及您认为很酷的内容进行筛选)。在所有这一切中,偶尔挖掘一下,如果你原谅一些粗鲁的建议,记下钱在哪里。“看起来很酷”听起来可能很模糊,但确实如此。对我来说,这意味着找到最新或最令人费解的技术。我不太可能学会解决同一个问题的14种变体。对于一些人来说,酷意味着新潮。对于其他人来说,这意味着受欢迎或有利可图。如果你不知道“看起来很酷”对你来说意味着什么,那就用一些可能性来解决这个问题,而不是花太多时间考虑选择哪一个。术语框架被太当真了。第三章:关于最后一个参考的测试。测试不是问题。这种现象表明团队规模较小或经验不足,领导力不足。不幸的是,如果你在一个鲁莽的团队中(程序员只是堆砌代码而不考虑质量和测试),最有可能的结果是沮丧和不可预测的破坏(以及不可预测的时间)。“立即离开这支糟糕的球队”并不是唯一的答案,因为在这种情况下可能还有其他好处和制约因素。但一些注重质量的项目往往具有更好的稳定性(更少的推翻)、更好的补偿和更多的学习机会。任何正常的老板或客户都不会拒绝对软件正常运行的任何验证。就像伊索寓言里的狐狸,没有抓到葡萄,就说葡萄一定是酸的。如果确保软件质量的测试很难,那么它一定不重要,对吧?面对生活中您无法控制的遗憾和失望可能会有所帮助,但如果不认识到测试的好处,您就无法以截然不同的方式编写代码。葡萄不酸,不要像狐狸那样,你可以找个梯子来实现。测试的主要目的是对代码有信心。这种信心不是凭空而来的。它是由于看到错误和抵制更改的代码而产生的怀疑而形成的。信心是测试什么和如何测试的最佳指标。了解测试的最大原因是帮助您在查看代码库时培养信心和怀疑态度。每种测试方法都包含三个阶段:设置、断言和回收。第4章:测试实践在TDD(测试驱动开发)中,可以使用红/绿/重构循环测试代码,换句话说:“测试失败,测试成功,优化”。在任何情况下,保持gitcommit命令之间的步骤较小,以便您可以轻松回滚到干净的版本。第5章:基本重构目标返回此内容将提供比仅返回undefined更多的信息和更好的界面。理想情况下,副作用应尽可能少,如果必须存在,则应尽可能隔离。IIFE没有名称,也无法寻址。类具有更多构成独特构造的属性,而不仅仅是构造函数的“语法糖”。JavaScript在OOP上加倍努力,函数式编程可能是JavaScript的“未来”,但至少OOP也是未来。最小化块(复杂性和代码行)。尽量减少条目总数。多使用显示输入。使用真实且有意义的返回值而不是副作用。尽量减少甚至消除副作用。第6章:重构基本结构重命名可能是一件大事。注释有时可以用作文档,甚至可以创建外部文档。“提取”是一种特定类型的“引入”,有时它比功能更合适。谨防变量提升。“forin”有点像我们的for和while循环,但我们不处理索引更新,因此您可以将其视为“forindexin”。for...in中的索引不保证是有序的。任何可枚举的属性都会被枚举,数组可以从别处继承“可枚举”属性。在for...in循环中修改数组会导致混淆。Chapter7:RefactoringFunctionsandObjectMapping(Map)是为了实现更轻量级的“keysandvalues”。WeakSet和WeakMap以及它们的“强”版本之间的主要区别在于它们不能被迭代(没有forEach函数)。他们没有得到容器大小的参考。WeakSet不能存储原始类型的数据。他们“弱”地管理他们的密钥。也就是说,当键没有引用时,它可以被垃圾回收。当使用“弱”形式时,您放弃了轻松理解内部内容或将函数应用于整个集合的能力。你得到的是对内存泄漏和隐私的控制。建议将if中多个布尔值的判断放到一个函数的返回值中。尽量减少全局变量的范围,最好设计我们的API。第8章:层次结构重构要构建逻辑层次结构,请尽可能隔离。构造函数往往在原型上做事,所以用处不大,可以用对象字面量和工厂函数代替。考虑Is-A和Is-Just-A。第9章:重构为面向对象的模式状态模式的核心是愿意将可能被认为“属于”一个对象的部分移动到另一个对象中。OOP(面向对象编程)有一种趋势,即优先考虑层次结构而不是委托对象。装饰器主要表现在为已有的接口(实例)添加属性。外观(以对象字面量的方式定义)看起来很简单,但缺点是不易维护。第10章:重构异步将“回调地狱”变成流式API,这种风格称为CPS(连续传递风格)。Promises的价值在于它们改变了接口,而这些可能是您想要测试的地方。第11章:功能重构在FP(声明式编程)中,我们应该尽量强调描述程序应该做什么,而不是应该如何做。纯函数的优点是幂等性,即当作用域足够小且无法改变时,你始终可以相信输入相同的参数,返回的结果是相同的。另一个好处是没有副作用。柯里化、函数组合是个好主意。希望每个人都能成为自己心中的老大!
