《代码阅读方法与实践之读书笔记之一》

阅读代码是程序员的基本技能,同时也是软件开发、维护、演进、审查和重用过程中不可或缺的组成部分。《代码阅读方法与实践之读书笔记之一》这本书围绕代码阅读,详细论述了相关的知识与技能。我希望通过仔细阅读并学习本书,可以快速地提高我的代码阅读的技能与技巧,进而从现有的优秀代码、算法、构架、设计中汲取营养,提高自身的开发与设计能力。此次读了此书的前四章,以下是我从中汲取到的宝贵养分:

从第一章《导论》一节中我体会到了我们要养成一个经常花时间阅读别人编写的高品质代码的习惯,因为阅读高品质的代码可以提高我们的编写代码的水准; 要有选择地阅读代码,同时,还要有自己的目标;要注意并重视代码中特殊的非功能性需求,这些需求也许会导致特定的实现风格;如果在现有的代码上工作时,要与作者或维护人员进行必须的协调,以避免重复劳动或因此而产生厌恶情绪;在寻找BUG时,要从问题的表现形式到问题的根源来分析代码,不要误入歧途;寻找bug,这种情况下,关键的思想是使用工具,我们要充分利用调试器,编译器给出的警告或输出的符号代码,系统调用跟踪器,数据库结构化查询语言(SQL)的日志机制、包转储工具和Windows的消息侦查程序,定出BUG的位置;当向系统中增加新功能时,首先的任务就是找到实现类似特性的代码,将它作为待实现功能的模板;在移植代码或修改接口时, 可以通过编译器直接定位出问题涉及的范围,从而减少代码阅读的工作量;阅读代码寻找重构机会时,先从系统的构架开始,然后逐步细化,能够获得最大的效益;软件部件一般要经过逐渐地扩展,并重复改写以适用于两个或三个不同系统之后,才会成为可重用的部件;在复查软件系统时,要注意,系统是由很多部分组成的,不仅仅只是执行语句,还要注意分析以下内容:文件和目录结构、生成和配置过程、用户界面和系统的文档,可以将软件复查作为一个学习、讲授、援之以手和接受帮助的机会。

从第二章《基本编程元素》中我再次温习了之前学习的知识:分析一个程序时, main是一个好的起始点;层叠if-else if-...-else序列可以看作是由互斥选择项组成的选择结构.;在分析重要的程序时, 最好首先识别出重要的组成部分.;解决困难的代码要从容易的部分入手;要养成遇到库元素就去阅读相关文档的习惯,这将会增强我们的阅读和编写代码的能力;.for (i=0; i<n; i++)形式的循环执行n次;高效的算法和特殊的优化确实有可能使得代码更为复杂, 从而更难理解, 但这并不意味着使代码更为紧凑和不易读会提高它的效率;do循环的循环体至少执行一次;每次只分析一个控制结构, 将它的内容看作是一个黑盒;return, goto, break和continue语句, 还有异常, 都会影响结构化的执行流程.,由于这些语句一般都会终止或重新开始正在进行的循环,因此要单独推理它们的行为。

第三章高级《C数据类型》让我对C语言又有了更进一步的认识:只有了解特定语言构造所服务的功能之后, 才能够更好地理解使用它们的代码;在C程序中, 指针一般用来构造链式数据结构|动态分配的数据结构|实现引用调用|访问和迭代数据元素|传递数组参数|引用函数|作为其他值的别名|代表字符串|以及直接访问系统内存;指向数组元素地址的指针, 可以访问位于特定索引位置的元素;C语言中的结构将多个数据元素集合在一起, 使得它们可以作为一个整体来使用, 用来从函数中返回多个数据元素|构造链式数据结构|映射数据在硬件设备|网络链接和存储介质上的组织方式|实现抽象数据类型|以及以面向对象的方式编程;共用体在C程序中主要用于优化存储空间的利用|实现多态|以及访问数据不同的内部表达方式;动态分配的内在块可以电焊工地释放, 或在程序结束时释放, 或由垃圾回收器来完成回收,在栈上分配的内存块当分配它的函数退出后释放;可以将typedef声明理解成变量定义: 变量的名称就是类型的名称,变量的类型就是与该名称对应的类型。

我从第四章《C数据结构》中获取到以下精华:C语言中, 一般使用内建的数组类型实现向量, 不再对底层实现进行抽象;表达式sizeof(x)总会得到用memset或memcpy处理数组x(不是指针)所需的正确字节数;不对称区间中元素的数目等于高位边界与低位边界的差;动态分配的矩阵一般存储为指向数组列的指针或指向元素指针的指针,这两种类型都可以按照二维数组进行访问;数组可以通过存储供程序内的抽象机(abstract machine)或虚拟机(virtual machine)使用的数据或代码, 控制程序的运作;如果结构中含有指向结构自身|名为next的元素, 一般说来, 该结构定义的是单向链表的结点;包含指向自身的next和prev指针的结构可能是双向链表的结点;图的结点常常顺序地存储在数组中, 链接到链表中, 或通过图的边链接起来;.在无向图中, 表达数据时应该将所有的结点看作是等同的, 类似地, 进行处理任务的代码也不应该基于它们的方向来区分边;在非连通图中, 执行遍历代码应该能够接通孤立的子图;处理包含回路的图时, 遍历代码应该避免在处理图的回路进入循环;复杂的图结构中, 可能隐藏着其他类型的独立结构。

时间: 2024-12-21 23:20:39

《代码阅读方法与实践之读书笔记之一》的相关文章

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

IOS测试框架之:athrun的InstrumentDriver源码阅读笔记

athrun的InstrumentDriver源码阅读笔记 作者:唯一 athrun是淘宝的开源测试项目,InstrumentDriver是ios端的实现,之前在公司项目中用过这个框架,没有深入了解,现在回来记录下. 官方介绍:http://code.taobao.org/p/athrun/wiki/instrumentDriver/ 优点:这个框架是对UIAutomation的java实现,在代码提示.用例维护方面比UIAutomation强多了,借junit4的光,我们可以通过junit4的

Yii源码阅读笔记 - 日志组件

?使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category);Yii::trace($message, $category); 两者的区别在于后者依赖于应用开启调试模式,即定义常量YII_DEBUG: defined('YII_DEBUG') or define('YII_DEBUG', true); Yii::log方法的调用需要指定message的level和category.category是格式为“xxx.yyy.z

源码阅读笔记 - 1 MSVC2015中的std::sort

大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块前(上面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in

CI框架源码阅读笔记5 基准测试 BenchMark.php

上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架. 从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识.把握这个框架. 按照惯例,在开始之前,我们贴上CI中不完全的核心组件图: 由于BenchMa

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里这次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1.       设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中

Apache Storm源码阅读笔记

欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两位的指点,非常感谢.

CI框架源码阅读笔记4 引导文件CodeIgniter.php

到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.com/usr/reg 经过引导文件,实际上会交给Application中的UsrController控制器的reg方法去处理. 这之中,CodeIgniter.php做了哪些工作?我们一步步来看. 1.    导入预定义常量.框架环境初始化 之前的一篇博客(CI框架源码阅读笔记2 一切的入

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

dubbo源码阅读笔记--服务调用时序

上接dubbo源码阅读笔记--暴露服务时序,继续梳理服务调用时序,下图右面红线流程. 整理了调用时序图 分为3步,connect,decode,invoke. 连接 AllChannelHandler.connected(Channel) line: 38 HeartbeatHandler.connected(Channel) line: 47 MultiMessageHandler(AbstractChannelHandlerDelegate).connected(Channel) line: