《代码之美》——长期记忆系统是通过关联来检索的
前言
今天读到了第十三章--基因排序器的设计,虽然对于生物科学方面的知识有所欠缺,但是从中透露出来的关于软件设计方面的思想还是可以拿来借鉴的。所以至于生物学方面的细节,我就一概忽略了(包括前一章~~毕竟不懂Perl,难得看出Perl的代码的美丽所在),就简单叙述自己的理解吧。
C语言实现多态
这个是让我最为吃惊的,大家都说C是面向过程的编程语言,要让C实现面向对象的特点,这个有多难呀!但是本文中貌似很“轻松”得让C实现了多态的特点。这不禁让我想起,其实编程语言是小事,主要是编程思想。估计这也就许多代码的美丽之所在吧。真正美的不是代码本身,而是代码背后流露的思想。
看看C是如何实现多态的呢?其实并不是十分复杂,如果熟悉C的函数指针,我们就可以用这个来实现C语言的多态。所谓多态不就是在运行时,函数的动态绑定吗~其实C语言也可以实现,而且实现机制就是函数指针。在程序运行时对这些函数指针赋上不同的函数入口值,那么在调用的时候便会出现多态的特性。当然这个只是多态的浅显的实现,比起C++,Java,C#这些真正面向对象的语言来说,用C实现的多态明显有些单薄。但是思想在此,这样的设计仍旧是面向对象的,必然也能达到面向对象的多态的好处。
书中就表格的列,进行了对象化,并写出了他的结构体,实现了多态。代码如下:
struct column /*大表格中的一列,hgNear中的核心数据*/ { /*所有的列中都存在的数据: */ struct column *next; /*链表中的下一列*/ char *name; /*列名,用户看不到*/ char *shortLabel; /*列标签*/ char *longLabel; /*列描述*/ /* -- 方法 -- */ void (*cellPrint)(struct column *col,struct genePos *gp,struct sqlConnection *conn); /*在HTML中打印该列的一个单元格*/ void (*labelPrint)(struct column *col); /*在标签行中打印标签*/ void (*filterControls)(struct column *col,struct sqlConnection *conn); /*打印高级过滤器中的控件标签*/ };
记录下这段代码,提醒自己:编程思想最重要。否则,面向对象的语言也会编出面向过程的程序……
大规模美丽代码理论
引用原文的一段话:
编码是人的一种活动,而在程序设计中最受限制的资源可能就是我们人类的大脑的记忆。通常,我们的短期记忆(short-term memory)可以同时记住五六件事情。超过这个数我们就需要长期记忆了(long-term memory)。我们的长期记忆系统有惊人的存储容量,但信息进入其中的速度却慢一些,同时我们也不能随机地提取其中的信息,只能通过关联(association)来检索。
这里不仅仅说的是人类的大脑,而是我们的编程习惯。大家总会感觉到自己写的程序过几天看就基本忘记了自己在写什么了。其实这个很正常,这就需要我们根据自己写的注释重新恢复自己对代码的记忆。这就牵扯到了我们读代码的能力。如果一个函数过大,一个类承担了过多的任务。。试想这样的代码即使是我们自己写的,过几天也未必能真正读懂。于是作者提出了如下几个提高代码可理解性的方法:
- 尽可能地让作用域局部化。如果对象成员变量可以解决问题,就不要使用全局变量,而如果局部变量可以解决问题,就不要使用对象的成员变量。
- 减小副作用。特别地,除了函数的返回值,避免修改任何变量的值。符合这条规则的函数被称为“可重入”的,这也是一种美丽。它不仅容易理解,而且自动就是线程安全的,还可以被递归调用。除了可读性,副作用少的的代码也更容易在不同的情形中被重用。