拯救一切强迫症 - 读《编写可维护的 JavaScript》(一)

本文写于 2020 年 4 月 24 日

我在小学的时候就有接触过编程,所以读大一的时候 C 语言还算是轻车熟路。自然会有很多同学给我看他们的代码,麻烦我帮助他们找一找 bug。

我代码拿到手的第一件事儿是啥?

重排代码格式!(相信大家基本上大学学 C 语言都用的是 VC++,并没有代码自动格式化功能,现在我极力推荐 prettier 进行自动格式化)

通常我看到的代码都是这样的:

if (wl && wl.length) {
for (i = 0, l = wl.length; i < l; ++i) {
p = wl[i]
type = Y.Lang.type(r[p])
if (s.hasOwnProperty(p)) {if (merge && type == 'object') {
Y.mix(r[p], s[p])
} else if (ov || !pinr) {
r[p] = s[p]
}
}
}
}

这种代码人类几乎没有办法读懂!

老话说得好:代码是给人读的,只是偶尔给机器看一下。

让我们来重置一下缩进:

if(wl && wl.length){
for(i=0, l=wl.length; i < l; ++i) {
p = wl[i];
type = Y.Lang.type(r[p]);
if(s.hasOwnProperty(p)){
if(merge && type == 'object'){
Y.mix(r[p], s[p]);
} else if (ov || !(pinr)){
r[p] = s[p];
}
}
}
}

代码瞬间变得易于阅读了!

01 缩进

接下来我们来看一看书中对于缩进的观点。

使用制表符缩进

每一个缩进层级都代表一个单独的制表符。也就是一个制表符一个缩进,两个制表符两个缩进,以此类推。

他的好处在于,编辑器可以直接修改制表符的长度,可长可短,随心所欲。

但是缺点在于系统对于制表符的解释不一样。我们在 windows、macOS、Linux 中看到的制表符可能都不一样。

使用空格缩进

有几种做法:2 个空格表示一个缩进、4 个空格表示一个缩进、8 个空格表示一个缩进。

很多团队经常会选择 4 个空格,因为这是一种折中的方案。

在文本编辑器中,我们可以配置在敲击 tab 时,自动插入 n 个空格,这样,不管在哪里打开,代码都会是一样的。

我们看一些著名团队的选择——

制表符:

  • jQuery
  • Dojo

空格:

  • Dauglas Crockford 使用 4 个空格字符的缩进;
  • Sprout Core 使用 2 个空格的缩进;
  • Goolge 的 JavaScript 使用 2 个空格的缩进。

作者个人推荐使用四个空格作为一个缩进层级。

无论如何,选择了其中一种,就一直用下去,千万不要在一个文件里混用!

02 语句结尾

作者认为应该加分号,但是我个人不喜欢加分号。

JS 又一个叫做 Automatic Semicolon Insertion 机制,叫做自动分号插入机制。但是 ASI 的规则非常非常的复杂,所以我们很难预料他会在哪里插入分号,包括 jQuery、Google、Dojo 都是推荐使用分号结尾。

03 一行的长度

很多很多的编程规范提到过,一行长度不宜超过 80。

这个规则是因为当年的文本编辑器,单行字数限制就是 80。

但是现在,即使我们的屏幕宽了、分辨率高了,还是推荐大家使用 80 的长度限制。

看看大公司的规范:

  • Java 语言编程规范,80;
  • Android 开发者编码风格指南,80;
  • 非官方的 Ruby 编程规范:80;
  • python,79。

在超过了 80 的长度之后就需要换行了,比如这样:

callAFunction(document, element, window, "somestringvalue", true, 123,
navigator);

在换行后应该追加一个缩进

要注意,不要让运算符或者逗号换行了:

callAFunction(document, element, window, "somestringvalue", true, 123
, navigator);

04 空行

为了保证代码的可读性,我们会适当的空上几行。

if(wl&&wl.length){
for(i = 0, l = wl.length; i<l; ++i) {
p = wl[i];
type = Y.Lang.type(r[p]);
if(s.hasOwnProperty(p)){
if(merge&&type=='object') {
Y.mix(r[p],s[p]);
} else if (ov || !(pinr)) {
r[p]=s[p];
}
}
}
}
if (wl && wl.length) {
for (i = 0, l = wl.length; i < l; ++i) {
p = wl[i]
type = Y.Lang.type(r[p]) if (s.hasOwnProperty(p)) {
if (merge && type == 'object') {
Y.mix(r[p], s[p])
} else if (ov || !pinr) {
r[p] = s[p]
}
}
}
}

(未完待续)

拯救一切强迫症 - 读《编写可维护的 JavaScript》(一)的更多相关文章

  1. [已读]编写可维护的javascript

    13年4月份出版,作者是大名鼎鼎的Zakas,他的另两本书<javascript高级程序设计>与<高性能javascript>你一定听过或者读过. 这本书重点讲了编码风格和编码 ...

  2. 【读书笔记】读《编写可维护的JavaScript》 - 编程实践(第二部分)

    本书的第二个部分总结了有关编程实践相关的内容,每一个章节都非常不错,捡取了其中5个章节的内容.对大家组织高维护性的代码具有辅导作用. 5个章节如下—— 一.UI层的松耦合 二.避免使用全局变量 三.事 ...

  3. 《编写可维护的javascript》读书笔记(上)

    最近在读<编写可维护的javascript>这本书,为了加深记忆,简单做个笔记,同时也让没有读过的同学有一个大概的了解. 一.编程风格 程序是写给人读的,所以一个团队的编程风格要保持一致. ...

  4. 编写可维护的JavaScript 收纳架

    如果你看过Nicolas C.Zakas写过的任何作品,你必须承认他是个不折不扣的天才.也只有天才级的才能写出<JavaScript高级程序设计>让所有的前端攻城师人手一本.Nicolas ...

  5. 推荐一本好书:编写可维护的JavaScript(可下载)

    目录 推荐一本好书:编写可维护的JavaScript(可下载) 书摘: 下载: 有些建议: 推荐一本好书:编写可维护的JavaScript(可下载) 书摘: 很多设计模式就是为了解决紧耦合的问题.如果 ...

  6. 《编写可维护的JavaScript》之编程实践

    最近读完<编写可维护的JavaScript>,让我受益匪浅,它指明了编码过程中,需要注意的方方面面,在团队协作中特别有用,可维护性是一个非常大的话题,这本书是一个不错的起点. 本书虽短,却 ...

  7. 编写可维护的Javascript读书笔记

    写在前面:之前硬着头皮参加了java方面的编程规范培训,收货良多,工作半年有余的时候,总算感觉到一丝丝Coding之美,以及造轮子的乐趣,以至于后面开发新功能的时候,在Coding style方面花了 ...

  8. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

  9. 编写可维护的JavaScript之编程风格

    在团队中只有每个人的编程风格一致,大家才能方便的互相看懂和维护对方的代码. 1. 层级缩进 对于层级缩进目前有两种主张:1)使用制表符这种方法有两种好处,第一,制表符和缩进层级之间是一一对应关系,符合 ...

随机推荐

  1. 使用 Spring 有哪些方式?

    使用 Spring 有以下方式: 作为一个成熟的 Spring Web 应用程序. 作为第三方 Web 框架,使用 Spring Frameworks 中间层. 用于远程使用. 作为企业级 Java ...

  2. (原创)[C#] 一步一步自定义拖拽(Drag&Drop)时的鼠标效果:(一)基本原理及基本实现

    一.前言 拖拽(Drag&Drop),属于是极其常用的基础功能. 无论是在系统上.应用上.还是在网页上,拖拽随处可见.同时拖拽时的鼠标效果也很漂亮,像这样: 这样: 还有这样: 等等等等. 这 ...

  3. C++ | 动多态的发生时机

    探究动多态的发生时机 有了虚函数和虚函数表为动多态提供支持,从而可以实现C++语言的动多态.那么,问题又来了. 动多态的发生时机是什么? 或者说,动多态发生有哪些条件与限制呢? 下面让我们一起来探究动 ...

  4. 那是我在夕阳下的code

    布局何如让一个标签上下左右都居中?这有什么难的,给定子标签的宽,再让它的边距上下为0,左右为auto;如下: .child{width:10px;margin:0 auto;}//子标签 它就可以左右 ...

  5. 【uniapp 开发】字典工具类 ObjectUtil

    {__/} ( • - •) /つ寿司 你要不要? {__/} ( • - •) /つ草莓 你要不要? {__/} ( • - •) /つ披萨 你要不要? {__/} ( • - •) /つ桃子 你要 ...

  6. Blazor组件自做一 : 使用JS隔离封装viewerjs库

    Viewer.js库是一个实用的js库,用于图片浏览,放大缩小翻转幻灯片播放等实用操作 本文相关参考链接 JavaScript 模块中的 JavaScript 隔离 Viewer.js工程 Blazo ...

  7. DC-1 靶机渗透

    DC-1 靶机渗透 *概况*: 下载地址 https://www.vulnhub.com/entry/dc-1,292/ *官方描述:* DC-1 is a purposely built vulne ...

  8. PyQt5 基本语法(四)

    目录 2. 输入控件(一) 2.1 纯键盘 2.1.1 QLineEdit 2.1.1.1 描述 2.1.1.2 控件创建 2.1.1.3 输出模式 2.1.1.4 提示字符串 2.1.1.5 清空按 ...

  9. Spring的事务控制-基于xml方式

    介绍:该程序模拟了转账操作,即Jone减少500元,tom增加500元 1.导入坐标 <dependency> <groupId>junit</groupId> & ...

  10. 告别收费BI!如何自己动手做一个免费的可视化数据报表还支持文档在线预览?

    本人大学刚毕业目前在一家互联网公司从事产品运营工作,一季度刚过,公司需要我出一份产品运营数据报表,由于产品用户数据.订单数据等数据量太大,我希望找一款Bi产品,支持我做出一个精美的可视化报表,还可以让 ...