怀念小时候写作文了,布置作业,回去读《OOXX》这本书,然后写篇读后感,就叫“读《OOXX》有感”。
作为一个程序员,一直以来以写出好代码为目标。
但也迷茫过,究竟写出来的怎样才能算是好代码呢。
读了不少技术书,大多数都是以如何使用某个框架,某个技术,某个语言为主,也有像《程序员修炼之道》或《高效程序员的45个习惯》这样的,会告诉一个好的程序员必备的素质方面的书籍,当然像《重构》这类书籍来说,已经算是比较接近教你写出好代码的教科书了。
但读下来终究还是有那么一点点疑惑,到底写代码时,要注意什么呢,注意到什么地步,这个力度如何把握。
比如说,有人告诉你,“代码记得要写注释呀”,但这个注释怎么写,写在哪里,写多少字,有没有什么格式要求,没有人告诉过,他们一般也就跟你说,“写出来的能让别人看明白就行”。
记得很早的时候,有个老师说过,可以通过模仿书中的例子或模仿开源项目中的写法来提高。这招确实很受用,但也有其局限性,因为你往往只是看到了最终成型的那段代码,它是完美的高效的,但那个从不完美到完美的过程是被忽略掉的,也是最重要的,所以一段好代码产生的过程才是更值得我们去关注与学习的(这很像玩dota时,大家非常喜欢看高手的第一视角视频一样)。
比如真的等自己开始敲代码的时候(特别是一个全新的项目,没有什么可以参考,你自己来创作),可能会像过去上学写作文一样,不知道如何下笔了,这个开头咋写来,怎么分段来,这个词用的合适不合适来,好多问题都来了。
可能有人说了,代码么,能运行就好啦,实现功能为先,尽量结构写的清晰点,多用点设计模式,注释写详细点,后续修改时,余地留的大一点,基本上这份代码就算不错的了。
确实在现实中,各种工期短,人员少,大家能力不均衡的情况下,你想搞出一份既能达到项目要求,代码质量又非常高的一份代码,实属不易。而且很多的项目属于那种基于某个框架下的针对某个业务需求来做,大部分码农兄弟也就干点写写CRUD操作,写写DAO,写写Service等体力活。
但本人觉得,如果你能有机会参与一个产品的架构工作(类似写出一个你常用的框架),或者你有时间去搞一个开源软件啥的(没有老板来催你要产品),养成一个写出好代码的习惯(或者叫做“代码感”,“代码洁癖”),还是非常有必要的。
这里重点推荐下《代码整洁之道》这本书,虽然目前只看到一半,但已感觉受益匪浅。
书中有个观点:优雅与高效。
代码逻辑应当直截了当,叫缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来。整洁的代码只做好一件事。
高效不必说了,相信这是大家已经在追求的目标了。
而优雅,往往是被大家忽略的,也是最难做到的。
优雅,优美雅致,外表或举止上令人愉悦的优美和雅观;令人愉悦的精致和简单。
一般来说优雅是用来形容文学作品,艺术品等,那一份代码要做到什么程度才会被称为优雅呢。
书中给的答案是,代码总是看起来像是某位特别在意它的人写的。几乎没有改进的余地。代码作者什么都想到了,如果你企图改进它,总会回到原点,赞叹某人留给你的代码—全心投入的某人留下的代码。
简单来说,就是你能明显的看出来作者是用心在写这段代码。一份优雅的代码就如一篇优雅的文章一样,你能明白那一段对话,一个遣词是如此的精妙,要表达的意思是如此的简单明了而富于深意。
如果你在看完一段代码后,不由自主的由内心发出一句,“操,这段写的太棒了!”,那它一定是段好代码。
当然想写出好代码也不是看了一本书后就能学会了,因为这些经验理论准则等等教条一样的东西虽然很有用,但只有在实际项目中去不断实践它,才能体会出其真正的意义所在,你才能深刻的明白它是为什么这样做的,你也才能做到真正的使用它,而不是被它所束缚住,才达到更高的一层境界(记得电影《太极张三丰》中,张三丰对张无忌说,你是不是把刚才学的招式都忘掉了,好,这才是真正的学会了)。
遵循某些常用的准则,但又不拘泥于其中,能够根据实际情况需要,灵活的做出取舍,来达到最终目标的,才是一份真正优雅高效的好代码。
还要记住,好代码也不是一蹴而就的,跟写文章一样,需要不断的修改修改再修改,提炼提炼再提炼。
至于怎么写好代码,要注意啥,ME也不想copy书中的话了,大家自己去学习理解吧。
至于你觉得到底需不需要看这本书,举几个例子就行了。
例子1
private Date date;
例子2
/* the day of month */ private Date dayOfMonth;
例子3
//如果你在一个项目中定义过并同时使用过类似下面的类名: UserInfo UserData UserManager UserController UserDriver
例子4
//定义过类似的方法: Circle makeCircle(double x, double y, double radius); render(Boolean isSuite);
例子5
public List<int[]> getThem() { List<int[]> list1 = new ArrayList<int[]>(); for (int[] x : theList) if (x[0] == 4) list1.add(x); return list1; }
如果你曾经写过上面的代码,或现在仍然在写,或者看不出来这样写有什么问题的,推荐你读一下这本书,相信会有所收获的。
PS:书就不用大家找了,直接附件送上,当然真的喜欢的话,还是推荐去买实体书吧。
PS2:看到两个包下载数量不一致,就知道有的朋友下载后出现了解压出错的问题。
切记两个压缩包需要一起下载,放在同一个目录中,然后进行解压。
iteye只能上传10M大小的问题,没办法,只能分包了。