描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121387074
• 学习模块化设计的要素,包括应用是怎样被使用的以及哪些部分应该放在接口中。
• 设计模块内部结构来保证你的代码易读且意图清晰。
• 通过重构代码、控制和消除状态来降低代码复杂性。
• 利用现代JavaScript的特性编写整洁的代码并降低复杂性。
• 在前端和后端JavaScript应用开发中使用十二要素应用原则(Twelve-Factor App Principals)。
本书是作者Nicolás Bevacqua所写的探索JavaScript架构的系列书之一,探讨了软件复杂性的基本原理,以及如何在JavaScript中应用这些原理开发具有高可维护性和可读性的模块化应用。书中给出了很多简明直接的建议和实例。全书从模块化思维开始,深入浅出地探讨了模块化的原则、如何设计模块,以及代码模块化的实践等,还介绍了应用的开发方式以及开源原则。阅读本书,你能掌握模块化JavaScript开发,使模块化在实际生产中产生真正的价值。本书中的大部分建议、思考和指导都不是JavaScript特有的,因此本书不仅仅适合使用JavaScript和ES6的开发者和爱好者阅读,只要对编写易读、易维护、可扩展性强的模块化代码感兴趣的人,都不妨读一读。
前言 VIII
第 1 章 模块化思维 1
1.1 模块化思维简介 1
1.2 模块化简史 3
1.3 模块化设计的好处 11
1.4 模块化粒度 13
1.5 模块化 JavaScript 的必要性 15
第 2 章 模块化原则 19
2.1 模块化设计的要点 21
2.2 CRUST 原则:一致、弹性、
明确、简单和小巧 35
第 3 章 模块设计 47
3.1 构建模块 47
3.2 CRUST 原则 56
3.3 修剪模块 63
第 4 章 内部构造 71
4.1 内部复杂性 71
4.2 重构复杂代码 76
4.3 像熵一样的状态 95
4.4 数据结构为王 102
第 5 章 模块化模式与实践 109
5.1 利用现代 JavaScript 109
5.2 组合与继承 121
5.3 代码模式 127
第 6 章 开发的方法与哲学 137
6.1 安全的配置管理 137
6.2 显式依赖管理 143
6.3 作为黑盒的接口 145
6.4 构建、部署与运行 146
6.5 无状态 149
6.6 开发与生产的平等性 152
6.7 抽象问题 154
关于作者 157
关于封面 157
尽管印刷机已经问世很久了,但出版图书仍然是一件颇具挑战性的工作。通常,得有一位或几位作者勤勉地写作,还要有一位内容编辑协助作者,将他们的想法转化成不至于太枯燥且可读性更好的作品。如果这本书与技术或商业有关,则需要更加谨慎——要邀请有技术背景的审校者和密切关注相关主题的专家,找出稿件中关于技术定义或解释的严重错误。当然,文字编辑也不能少,他们是确保文字以及语法正确的最后一道防线。然而,到目前为止,我们仅仅谈了最浅层的东西:上面提及的所有角色主要处理书的内容,而一本书的制作过程还包括其他许多方面。比如,要有排版人员负责版式设计,保证图书有好的印刷效果,尽量避免代码出现孤行和折行的情况;要有人负责设计封面;还必须有人审核初稿的目录,然后作者才能与出版社签订合同。此外,还要有人监督印刷之前的整个过程,其通常被称为“生产流程”。一旦这些书印刷出来,还需要把它们发行出去。最后,图书上架开始售卖。有人购买它并开始阅读。图书产品的购买和交易过程甚至可以写成一本书。
整个过程复杂得令人难以置信。不过,对参与其中的每个人来说,事情却不是很复杂。比如作者,仅仅是每天写几百字而已。那么,复杂性去哪儿了呢?对整个过程进行这样的划分是有原因的:我们人类不擅长处理高复杂性的事项,对于出版图书或其他商业项目来说,将其分解为单个职责(比如“写作”“润色文字”“审校技术问题”“改正语法错误”“排版”,或“图书发行”),能简化复杂项目参与者的工作,让流程变得更简单。
出版图书仅仅是一个例子——其实对任何事情都可以这么处理。从你桌上选一样物品,随便选什么都行,思考它是怎么来到你桌上的。接着,把目光放远,想一下:它是怎么生产出来的?由什么制成?有多少人参与了它的制作、组装、打磨,并将它送到商店?你选的这个东西是水果吗?有多少人参与果树的种植、灭虫、修剪枝叶、打包果实,再把它送到商店?
我们身边充斥着各种复杂性,软件也不例外。从微观的层面来看,存在物理常量所框定的局限性,比如光速、比特、硬件、中断调用、汇编语言等;而从宏观层面来看,你可能会看到比如一个巨型技术部门,处理从查询到支付的整个过程。我们开发者和所负责的项目就身处在这些复杂性中。
平时,我们不太可能会停下来思考日常事物和交互中的复杂性,因为这样做会使人寸步难行。相反,我们把解决方法隐藏在抽象的接口之后,以至于我们的大脑就认为它们是接口。其中一些接口很好地映射到被抽象出来的实现中,让人觉得好用。而另一些则不然,它们让人觉得疑惑和沮丧。软件也是这样。我们不用考虑整个系统,实际上我们打交道的那些东西都被封装在接口里,而这些接口比其背后的具体实现更易理解和使用。
目标读者
这本书面向专业开发者、业余爱好者、掌握一定 JavaScript 和 ES6 知识的人。
这些开发人员以及对易读、易维护、可扩展性强的模块化编程(甚至不限于 JavaScript 语言)感兴趣的人,都可以从本书中受益。
为什么要使用模块化 JavaScript
刚开始我是抱着试着玩的心态接触 Node.js 的,但不知不觉喜欢上了 JavaScript。与此同时,我发现了开源并且爱上了这种实践。与 C# 封闭的环境对比,Node.js 的开源生态让我在怎样写出更便于他人使用的健壮代码方面找到了新的视角和乐趣。在这个背景下,我发现自己喜欢思考怎样定义接口,谁会使用接口,还有如何让用户有更多时间做其他事而不是花时间弄明白我们想让他做什么。
本书旨在提供一种友好的方法来帮助人们编写出好的模块化代码。并不是说 JavaScript 模块特别难写,而是说我们要遵循合理的设计实践来恰当地分配简单性和灵活性,以便用户在多数情况下可以依赖于简单且足够灵活的模块,同时保证内部复杂性是可控的——这并不是一件简单的事情。我
曾经在 JavaScript Application Design 一书和 Pony Foo 博客里零散地写过一些最佳应用设计的内容。但我一直渴望出版一本全面讨论如何分析、设计、编写模块化代码的书籍。
尽管找不到哪本书是从 JavaScript 的角度专门阐述这个主题的,不过我能很容易地找到涉及模块化代码主题的书籍,例如 Steve McConnell 所著《代码大全》(Microsoft Press)或者 Robert C. Martin 所著的《代码整洁之道》
(Prentice Hall),并在 JavaScript 开发工作中使用这些书中所教授的知识。本书试图让你把注意力从别人认为你应该做什么上移开,让你能够自己总结应该做什么以及为什么做,而不是强迫你接受一些虚伪的定义“整洁代码” 的所谓法则。
本书不会直接讲怎么编写模块化代码,而是试图阐明模块化体系结构背后的基本原理和 JavaScript 模块化的历史,以便于你更好地理解模块化编程的意义和益处。
市面上有很多关于应用设计的书籍,但关于模块化应用设计并没有太多的参考资料,更不用说模块化 JavaScript 应用设计了。所以,这本书应运而生。尽管本书中大部分的建议、思想和教导都不是专门针对 JavaScript 的,但是本书在阐述时聚焦于 JavaScript,这意味着你将学习如何编写模块化 Web 应用程序,而在此过程中也会记住那些使 Web 成为独特的平台以及让JavaScript 在许多方面都很特别的奇异功能。
本书没有采用长篇大论深入分析具体例子,而是希望你能够尝试应用书中的方法来解决自己项目中的问题,并且通过权衡各种方法的优缺点,最终实现目标。对于软件来说,不存在一刀切的通用解决办法,经常需要你自己做出判断,决定怎么写代码。所有的软件需要与其场景相适应,如果你做过任何软件开发或发行的工作,那么你肯定很清楚把同一个软件硬塞进不同的执行环境有多难。
正如 Practical Modern JavaScript 一样,这本书目标在于一点点地建立一个基线。在通过 Practical Modern JavaScript 一书学习最新的语言特性之后,我们借助这本书来学习模块化设计思想。这种增量的、模块化的方法在两本书中无处不在。
本书的结构
第 1 章讨论 JavaScript 语境下模块化编程的演变,从早期直接在 onclick 属性中嵌入的 JavaScript,到 CommonJS,最后到原生 ECMAScript 模块。然后,介绍编写自包含代码的好处,以及在系统的每个级别(服务、应用程序、组件、模块、函数、块等)都这么做的好处。
第 2 章涵盖了模块化设计的要点,为你打下一个基础,让你能在这个基础上编写对 API 层面友好的模块,并且知道这个模块会被如何(在所有可能的情况下)使用、其职责是什么,以及哪些部分属于接口。
第 3 章的大部分内容都是在帮助你理解要解决的各种问题,以及如何在解决那些问题的同时密切关注模块及其接口的演变,并且在等待清晰的模式出现前尽量不要进行抽象。本章刺破表象,让你将自己的上下文应用到待解决的问题上,启发你对文档、错误处理,以及遵循自己的推理等主题的最佳实践的思考。
第 4 章讨论内部复杂性、紧耦合,以及如何权衡框架和约束(convention)的优点。这一章的大部分篇幅都在讨论通过重构代码来降低复杂性的各种方法,然后讨论与复杂性相关的状态的作用,以及如何降低复杂性。数据结构也非常重要,因为在控制复杂性时,选择正确的数据结构虽然具有挑战性,却可以带来巨大的回报。
第 5 章专门讨论 JavaScript,详细介绍了如何利用现代语言结构来编写简洁的程序。这一章还研究了继承和组合等模式,进而引出如何根据实际用例来做正确的选择的讨论。最后,我们也梳理了经典模式,例如解释什么是模式、对象工厂、事件触发和 JSON 消息传递。
第 6 章描述了身经百战的模块开发人员是如何思考的,涉及安全问题和依赖关系管理、构建和集成过程、接口和抽象,以及对模块设计的建议和最佳实践。
就算你已经很了解 JavaScript 模块化历史,至少也应该浏览一下第 1 章中对历史的回顾。如果你是那种喜欢跳着看书的人,我建议你从头到尾阅读完所有章节,因为这本薄书更像是一本故事书,讲述了合理的程序应该是什么样子的而非给出一堆具体的操作步骤。
致谢
本书最终得以完成要感谢很多人的帮助。首先是 Virginia Wilson,她是本书的主要内容编辑和 O’Reilly 的 Modular JavaScript 系列负责人。她能洞察那些最重要的事情,并且在我的写作时间紧张、写作速度放缓时给予充分的理解,总是保持非常积极的态度。
技术审校者们也非常棒。Mathias Bynens 主要负责检查我关于 ECMAScript 规范的描述是否标准。Ingvar Stepanyan 似乎总是准备抓住机会对我的书进行技术评审,他总是提供独到的见解,让我对内容的描述更清晰、所举的例子更全面。我非常感激他的工作。Adam Rackis 为该系列图书的技术审校提供了很大帮助,他总能对需要修正的地方提出有理有据的意见,使其改后变得更充实或更清晰。
如果没能提到 2016 年在 Indiegogo 众筹平台上支持 Modular JavaScript 系列图书的所有人,那将是我的疏忽。在这些书只是一个想法时,谢谢你们对我的信任,从一开始就激励我,让我有了极大的热情。如果我们有机会见面,一起喝啤酒吧,我来买单。以下所列姓名无特定先后顺序:
Aaron Endsley, Aaron Hans, Aaron Olson, Aaron Wells, Adam Rackis, Adi
Purnama Mutiara, Adrian Li, Adrian Rand, Agustin Nicolas Polo, Alan
Chandler, Alasdair Shepherd, Alejandro Nanez, Alexis Mills,
评论
还没有评论。