06 March 2014

最近忙于做一个Android的程序,一直没有时间来写点东西。一味地写代码也许会让人充实,但还是要不时的停下来思考,思考正确的方法和道路。昨天和今天写了一些python代码,主要是调用windows下的一些exe程序(C程序),结合最近读的一本书《代码整洁之道》,真的受益匪浅,有种醍醐灌顶的感觉。

书中讲了很多如何编写优秀代码的方法,在写python代码时,我特意注意了这些。回过头来看以前写的C代码,那是一种丑陋与混乱结合的混沌之物,简直不忍直视。而这些新写的python代码却是真正的简洁,可读性大大增强。

书中有一句话讲得非常好:

大师级程序员把系统当作故事来讲,而不是当作程序来写。

真的有那么神奇么?其实我也才看了几章的书,但实践后,发现做到这些很难,而当你完成后,那种进步是显而易见的。

简单举些例子,比如为变量命名,也许为了追求速度,我们会随便起些简单的名字,比如i、j、k,或者容易混淆的名字,比如mode,modeName等等。并不是说这些名字真的就不适合,但一般来说,名字的长短和作用域是成正比的。如果太过随意,若干天后在回来读这些代码,你会一时摸不到头脑,这些变量都是什么。

另外,一些规范也很重要。比如什么变量要首字母大写,什么变量可以加下划线,什么变量要全部大写。再比如,类的名字应该是名词,方法的名字应该是动词等等。给变量,类或函数(方法)命名看似简单,但其实非常重要。也许当我们纠结如何命名时,真的该多花些时间来考虑考虑。

再说一点,对于函数,我们应该使它们尽量的短小,而且只做一件事。我想,知道unix哲学的同学,都知道这些,但是要做到这些,是何其不易。比如书中说,函数的缩进层级不应该多于一层或两层。再比如函数参数个数越少越好,最好保持在3个以内。还有不要重复自己的代码,要结构化编程等等。这些都仅仅是编程规范,但不要小瞧它们,就算你编程能力强到任何功能都可以实现,但别人看不懂你的代码,还是没用。

那具体说说我是如何做的。比如将类似功能的代码分到一个模块中,类自然要分到一个模块中。这样,代码的结构一目了然。记得书中讲了个例子,比如你要读取一个文件,这应该是一个函数来做的,但是你要判断是否读取成功,也许你会在这个函数中加入判断语句。但更好的做法是再写一个函数,用来判断文件是否读取成功。这样就真正实现了一个函数只做一件事。再有就是使用多态来避免重复自己的代码。

class Mode {
	def do(self, mode):
		mode.doit()
}

class Mode1 {
	def doit(self):
		print "Mode1"
}

class Mode2 {
	def doit(self):
		print "Mode2"
}

#上面应该在一个模块中

if mode_selected == "mode1":
	the_mode = Mode1()
elif mode_selected == "mode2":
	the_mode = Mode2()
else:
	print "No mode"

Mode().do(the_mode)

这是python多态的一种简单的实现,当然如果有配合switch更好。我们看到了使用多态带来的好处,很多代码避免了重复。

《记事本圆梦计划》有一句话说的好:

并非“为了早点冲向目标”,而是“为了早点达到目标”。

糟糕的代码带来的问题也许到后面才会遇到,而那时很多问题的解决将是十分困难的。如何写出优秀的代码需要不停的思考,不停的练习。不要怕浪费时间做这些,也许这才是一条“捷径”。经常思考,经常重构。



blog comments powered by Disqus