这一周博主阅读了《代码大全2》第11章至第13章,第三部分——"变量"就结束了,第四部分作者将转入语句的讨论。

第十一章作者详细阐述了变量名的有效命名规则,第十二和十三章则简略介绍了使用各种数据类型时的注意事项。在这篇博客中我主要会在变量名命名和全局变量的使用上谈谈自己的读书心得。

变量名的力量

我们先来谈谈命名规则的必要性。为什么要有命名规则?会破坏创造性和程序质量吗?这一点我在上一篇读书笔记中已经以最近结对编程为例提到过了。对程序质量的实质约束往往来自高层设计,有效的标准其实是可以提高程序质量和效率的。具体来说,命名规则具有以下几大优势:

1.增强程序的自解释性(self-explanatory),使我们隔一段时间后再看自己写的程序时可以快速读懂代码、回忆起当时自己的思路;团队协作中,当开发者需要接手修改和维护其他人编写的代码时,不至于一头雾水。这一点对我们接下来的团队项目有重要的指导意义。

2.按规矩行事可以让我们把精力集中在其他更需要充分考虑的地方(比如算法、类的设计等等)。

3.使相关变量之间的关系更加清晰。比如说employeeIDNumber、employeeAddress、employeeSalary显然比IDNumber、address和salary看起来更紧密相关。注意到,假如在支持类的编程语言中我们定义一个employee类,将IDNumber,address和salary设为可访问的数据成员时,就可以在外部调用时用employee.IDNumber、employee.address、employee.salary来表达。从这一点我们可以看出,好的命名规则还可以弥补编程语言的不足。

自从开始有意识地用适合自己阅读、理解的方式给变量精细命名,我常常为一些中间变量的命名踌躇良久。一个好的变量名应该是可读、易记、恰如其分的。对变量的描述即是最佳的变量名,但是太长了不实用;短的变量名适用于作用域小的变量,如普通的循环计数器。我在书中选取了一些让我感觉比较有帮助的建议来分享一下:

1.计算限定词如total、sum、min、max、average、pointer等等统一放在前方或后方,一致性可以降低犯错的几率。

2.多用对仗词,比如最常见的min/max、begin/end、next/previous、last/current等等,这些对仗词是要放在合成词的前面部分还是后面部分,也要有一个统一的约定。

3. 循环变量、状态变量、临时变量、布尔变量、枚举变量在命名方法上有差异。临时变量不要用temp表示,稍微在temp后面添加确切信息,或者舍弃temp给出更准确的描述。布尔型变量不要用status,因为不管返回true还是false都看不出其对当前的过程有什么具体含义,用isDone, isError, success会使变量的含义更确切。

4.具名常量用大写和下划线的组合,可以描述得尽量细致一点。

5.有时候囿于编程语言对变量名长度的限制,我们不得不起短名字,缩写也涉及到很多技巧,基本上是服务可读性这一点,比如说使用列在字典里面的缩写、去掉一些非前置元音,像是source变成src, computer变成cmptr, 当然没必要去掉所有元音,比如xPosition缩写成xPos比xPst更好理解一些。

书中还有关于非正式命名规则的一个小节,适用于短小的、用完即弃的程序。我个人觉得没有必要了解,因为我们需要在日常编程实践中培养好的命名习惯,并探索高效的命名规则,才可能在实战中保证变量名的质量。

慎用全局变量

全局变量的风险是程序员的常识,不过在实际编程过程中我们往往还是会和全局比变量打交道。编写汇编程序的时候,定义在代码段的变量都是全局变量,又比如我使用Keil为单片机芯片编写程序时,涉及到中断操作时也常常会用到全局变量。然而在用面向程序和面向对象语言编程时,使用全局变量还是谨慎一些。我们来看看全局变量有哪些缺陷:

1.违反了模块化和信息隐藏的原则,增大了所需管理的复杂度。如果一个子程序和用到了全局变量,那么在编写、调试这个子程序的时候还得同时考虑到这个全局变量而不仅仅是这个子程序本身。

2.全局数据会阻碍代码重用。想象一下你需要使用在另一个文件中定义的类或子程序,而这个类或子程序又使用了定义在那个文件的全局变量,那么是否需要在当前文件中重复定义这个全局变量?定义之后能保证这个变量的值按照你所期待的维持或变化吗?

3.多线程编程中的代码重入问题:多线程代码运行过程中有可能全局数据在同一个程序的不同拷贝之间共享,这种情况下必须确保全局变量还保持有确切的含义。

全局变量一般适用于一些在概念上用于整个工程的数据以及在程序的每一个子程序中都需要用到的数据或变量,编程语言不支持具名常量时也可以用全局变量来模拟,不过往往这些目标都可以通过其他更好地方式来达成。如果迫不得已一定要使用全局变量,可以尝试用以下方法来降低风险:

1.为全局变量选取一个与其他变量不同的、更醒目的命名方式。

2.列出全局变量的清单,标注具体功能,在调用全局变量的地方适当注释作为提示。

3.不要用全局变量来存放中间结果。

《代码大全2》读书笔记 Week8的更多相关文章

  1. 代码的未来读书笔记<二>

    代码的未来读书笔记<二> 3.1语言的设计 对Ruby JavaScript Java Go 从服务端client以及静态动态这2个角度进行了对照. 这四种语言因为不同的设计方针,产生了不 ...

  2. 《第一行代码 android》 读书笔记:找出当前界面对应的Activity

    在android开发中找出当前界面对应的Activity,步骤如下: 新建一个BaseActivity继承自Activity,然后在BaseActivity中重写onCreate()方法,通过getC ...

  3. 《Linux命令行与shell脚本编程大全》- 读书笔记1 - 基本的bash shell 命令

    这本书买了好久了,除了刚到手的那几天翻看了一下以外,竟然到今天都没有看过.突然想要写一个shell脚本,发现什么也不会,是时候开始学习了,今天先把最简单的一章再看一遍顺便做一些笔记,明天继续后面的! ...

  4. 【代码大全2 学习笔记】ADT 抽象与封装

    ADT abstract data type 抽象数据类型 要理解面向对象编程,就要先理解ADT这个概念.不懂ADT的程序员开发出来的类只是名义上的"类"而已--只是单纯的把一些相 ...

  5. 《Linux命令行与shell脚本编程大全》- 读书笔记3 - 理解shell

    当用户登录终端的时候,通常会启动一个默认的交互式shell.系统究竟启动哪个shell,这取决于用户配置.一般这个shell都是/bin/shell.默认的系统shell(/bin/sh)用于系统sh ...

  6. 《Linux命令行与shell脚本编程大全》- 读书笔记2 - 更多的bash shell命令

    更多的bash shell命令 想检测进程,需要熟悉ps命令的用法.ps命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的许多信息.默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户 ...

  7. 《Linux命令行与shell脚本编程大全》读书笔记

    第一章:初识Linux 1.linux可划分为四个部分:内核.GNU工具.图形化桌面环境.应用程序 2.内核主要负责:系统内存管理.软件程序管理.硬件设备管理.文件系统管理 3.内核的系统内存管理,有 ...

  8. 《代码大全》阅读笔记-33-个人性格(personal character)

    很多好的编程做法都能减轻你的大脑灰质细胞(指脑力)的负担. 将系统"分解",是为了使之易于理解("设计的层次"). 进行审查.评审和测试正是为了减少人为失误.如 ...

  9. 《代码大全2》读书笔记 week 7

    博主终于继续更<代码大全2>了 (*´・ω・`)⊃,课上老师一再强调读书笔记要写出自己的心得不能简单摘抄,所以我现在基本上只会写一下自己在阅读过程中印象深刻或者有发散思考的地方,字数可能 ...

随机推荐

  1. 低版本vsphere部署高版本导出的OVF 报“硬件系列vmx-13不受支持“解决办法

    用文本编辑器之类的工具  打开ovf模板 然后下拉20多行左右 找到vmx-13这条报错内容 将13更改为数字较低的值 例如11,12

  2. Codeforces 1183H DP 计算子序列数目

    题意及思路:https://blog.csdn.net/mmk27_word/article/details/93999633 第一次见这种DP,有点像退背包的思想,如果发现有可能因为字母相同和前面算 ...

  3. 力扣——Copy List with Random Pointer(复制带随机指针的链表) python实现

    题目描述: 中文: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. 示例: 输入:{"$id":" ...

  4. easyUi-datagrid 真分页 + 工具栏添加控件

    1.  新建Pager.js /** * * @param {any} el 元素 */ function showDataGrid1(el) { $(el).datagrid({ title: '分 ...

  5. IPv6时代已来:双十一中的IPv6大规模应用实践

    摘要: 刚刚过去的双十一,大家对猫晚.抢红包.组团购还记忆犹新.大家不了解的是,不知不觉间,你可能已经成为首批互联网IPv6用户了.今年天猫双十一期间,阿里巴巴全面支持了IPv6,这是IPv6在我国的 ...

  6. Ceph中PG和PGP的区别

    http://www.zphj1987.com/2016/10/19/Ceph%E4%B8%ADPG%E5%92%8CPGP%E7%9A%84%E5%8C%BA%E5%88%AB/ 一.前言 首先来一 ...

  7. QGroundControl编译出错记录

    运行时出现错误: /home/myfly2/Downloads/qgroundcontrol/QGroundControl: error : cannot open shared object fil ...

  8. AcWing 225. 矩阵幂求和 (矩阵快速幂+分治)打卡

    题目:https://www.acwing.com/problem/content/227/ 题意:给你n,k,m,然后输入一个n阶矩阵A,让你求  S=A+A^2+A^3.+......+A^k 思 ...

  9. PHP【Laravel】delayer基于redis的实现订单超时改变状态

    实现这个功能前你需要知道以下,不然可能会比较吃力:1.服务器的计划任务,shell脚本,或者你有宝塔自带的计划任务会方便很多.2.有所了解Redis.3.会写PHP业务逻辑. 好了进入在正题,这里使用 ...

  10. 2018icpc南京/gym101981 G Pyramid 找规律

    题意: 数一个金字塔里面有多少个正三角形. 题解: ans[n]=n*(n-1)*(n-2)*(n-3)/24 #include<bits/stdc++.h> using namespac ...