《AngularJS深度剖析与最佳实践》推荐序
这是一本具有强烈ThoughtWorks项目风格的书。书中打造的实战项目,完全遵循了ThoughtWorks工程实践,一步一步从最初的Skeleton通过快速迭代逐步丰富项目的骨肉,并在这个过程中抽丝剥茧地展现了AngularJS的诸多特性与技巧,如循循善诱的导师一步步指导着你从AngularJS的小工走向专家。
这里所谓的“专家”不仅仅是指你对AngularJS的诸多技巧尽皆了然于胸,能够挥洒自如地运用于项目开发中——若能如此,不过是“唯手熟尔”的工匠罢了。真正的专家需要从大处着手,挖掘这门技术背后隐含的设计思想与哲学,换言之,需要知其所以然;却又不偏废细节,锱铢必较每个变量函数的命名格式,使代码臻于完美,并从中提炼出能够推而广之的最佳实践。
从知其所以然入手,书中的整个第五章《背后的原理》加强了内容的深度,使得本书不致于沦落为一本Example Step by Step。书中通过对MVVM模式的阐释,解释了Angular的设计原理与启动流程,并给出了Angular开发的注意事项。书中写道:
MVVM模式的要点是:以领域Model为中⼼,遵循“分离关注点”设计原则。这也是Angular的模型驱动思维与jQuery的DOM驱动思维的显著差异。所以我们在做Angular开发的时候应该谨记以下两点:
- 绝不要先设计你的页⾯面,然后⽤用DOM操作去改变它
- Directive不是封装jQuery代码的“天堂”
又例如细节之处,本书作者仿佛是拈着针尖在跳舞,刻绘着细节纤毫毕现;又佐以代码,论证有理有据;阅读时,真好像是你和雪狼、破狼在一起结对编程呢。例如书中在提及对服务访问对象(SAO)的封装时,给出了这样两段代码:
angular.module('app').controller('ReaderCreateCtrl', function ReaderCreateCtrl($resource) {
var vm = this;
var Reader = $resource('/api/readers/:id', {id: '@id'});
vm.submit = function(form) {
Reader.save(form);
};});
封装后:
angular.module('app').controller('ReaderCreateCtrl', function ReaderCreateCtrl(Reader) {
var vm = this;
vm.submit = function(form) {
Reader.save(form);
};});
仅仅是寥寥几行代码的区别,却体现了作者对于代码可读性的执着追求。如此内容在书中俯拾皆是。作者对整洁代码的敏感度,就好像水银温度计对气温的感知一般,哪怕是一刻一毫都能准确感知,进而在展开的文字叙述中潜移默化地影响着读者;尤其针对初学者,作者从一开始就为他(她)们展示了什么是AngularJS之美,什么是代码之美,什么是设计之美,就好似建立了AngularJS世界的“潜规则”,入了这个圈,你需得如此如此这般这般,否则就得荆棘一路步履蹒跚。而那些优秀的工程实践例如测试驱动开发,面向模型编程,迭代的演化,一次只做一件事情的行为准则,则完全融化在文字的血液中,浓缩为简单朴实的词语,天然地点缀在整本书中,和风细雨,润物细无声。
我与本书的一位作者破狼相交甚深,虽然一直未有机会共同战斗在一个项目,却也有许多机会彼此沟通各自对设计的理解。在面向对象设计、领域驱动设计、架构设计等诸多方面,我们抱有相同的设计态度,可谓志同道合。问道技术,譬如饮酒论文,酒酣耳热时,得聆佳音,当浮一大白,人生乐趣大抵如此。虽然我对前端技术所知了了,但阅读此书,颇有许多论点刚好击中我的腑肺,那种如寻觅到知己一般的快乐,真可以说是阅读之余的额外收获了。我喜欢此书的朴实,他们没有去构架飘渺高深的理论,没有浮夸地吹嘘AngularJS是如何如何的优秀,在前端开发中所向披靡。技术人写文章,常常没有卖弄,只是踏实地表达对技术的一己之得,得到的却是字字铮铮的金石之音。
显然,这是一本工程师写给工程师阅读的书,我只可惜这本书的出版,来得有点晚了。
是为序。
- 【选择题】Java基础测试四(15道)
- GO语言并发编程之互斥锁、读写锁详解
- GO语言标准错误处理机制error用法实例
- spring框架复习大纲【面试+提高】
- Go语言中的Array、Slice、Map和Set使用详解
- go的websocket实现原理与用法详解
- go语言base64加密解密的方法
- Go语言轻量级线程Goroutine用法实例
- Go语言的队列和堆栈实现方法
- Go语言使用sort包对任意类型元素的集合进行排序的方法
- TiDB 源码阅读系列文章(五)TiDB SQL Parser 的实现
- [go语言]吐槽:怎么样实现支持并发访问的数据集合更好?
- 利用缓冲信道来实现网游帐号验证消息的分发和等待
- Buffered channel、slice和mutex的简单性能测试
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 第十一章 http标准库和其他标准库
- 第十一章 运用广度优先搜索走迷宫
- 第十三章 go实现分布式网络爬虫---单机版爬虫
- 第十五章 并发版爬虫第二版 -- 完结
- 第十六章 分布式爬虫--准备工作
- go 搭建并行处理管道
- 新一代基于大数据的管理信息系统(MIS)报表需求开发
- 3. docker-compose实战--ghost app
- 2.1 Kubernetes--Pod
- 3. Kubernetes集群安装
- macOS VirtualBox 桥接模式 设置静态ip 且能和联网
- 重新初始化k8s master节点
- 5.k8s基本命令汇总
- 6. k8s + jenkins 实现持续集成(完)
- 7. 复制k8s Node节点 并重新初始化k8s-nodes2节点 (k8s连载)