论坛首页 综合技术论坛

关于重构的几点感悟

浏览 6439 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-02-07  

一、 重构,意识比技能更重要

如果问一个程序员:代码为什么会变烂?他可能会找出无数种理由:
1、代码本来就烂,我只是加了一点东西;
2、时间压得太紧,根本没有时间把代码优化,功能实现出来就不错了;
3、系统已经上线了,不敢随便去改以前的代码,不出问题还好,改出问题了谁负责;
……
但是,这都是从外部找原因推卸责任,程序员应该从自身寻找原因。其实,代码变烂,罪魁祸首就是程序员自己。
很多时候,代码一步步变烂,就是因为程序员自己没有良好的意识,没有及时地重构,刚开始的代码还是挺好的,后来需求一步步变更,就开始不断地往里面加分支,慢慢就变烂了。所以建立强烈的重构意识才是最重要的,头脑里要建立这样的意识:一旦代码变烂了,就去重构,要写出高质量同时又优美易读的代码。
重构的技能每个人都可以学得会,但建立首先这样的意识才是更重要的。
至于写出好代码却不被上级知道和认可,也有相应的措施:推行代码质量可视化。在公司或部门内部,通过sonar等系统实时地公布各项目组和成员的代码总体质量,使所有人都能看到,这样就能让领导看到代码的改善,也促使更多的人建立写出好的代码的意识。

 

二、要简洁短小职责要单一

不要在一个方法或一个类中堆砌太多的代码,不管是方法还是类,都应该短小。过长的类或方法都是坏味道,它们会导致以下种种不快:
1、 代码难以理解,难以维护。比如一个方法中包含10个逻辑,这时程序员要修改其中一个逻辑,那么他不得不把这10个逻辑全部理解了才能动手修改,而且一大堆无关代码堆砌在一起,导致程序员修改代码时很容易出错。而如果分成了10个小方法,那么程序员就可以直接聚焦于要修改的那1个小方法就行了,修改也很容易。
2、 代码难以重用,导致重复代码。一个大方法中有一部分代码,在另一个地方有同样的处理,但是由于这部分代码身处这个大方法的泥潭中,所以无法重用,那么就只能拷贝一份了,这样就导致了重复代码,而重复代码的危害是不言而喻的。
……
另外,不管是方法还是类,都应该遵循“单一职责原则”,否则不同的职责杂糅在一起,同样导致以上的种种不快。所以,这句话很重要:函数的第一原则是短小,第二原则是短小,第三原则还是短小。

三、代码是给人看的,应该写人易读懂的代码

代码是给机器去运行的,但更是给人看的,要写出机器能运行的代码很容易,但要写出人易读懂的代码则更重要。建立这样的意识之后,往往就能写出非常整洁优美的代码。
要怎样写出人易读懂的代码呢?
首先,还是上一条所说的,要简洁短小,职责要单一,逻辑要清晰的区分开。不要把一大堆代码堆砌在一起,更不要把不同职责的代码堆砌在一起,那样都必然导致可读性下降。
然后,不要写过于长的复杂表达式,那样非常难以理解。可以把表达式进行分解,可以用解释变量(只起到解释的作用,就是为了让代码更加易读)。
还有,比如一个方法中包含10个重要的步骤,人要读懂它很难。那么可以把这个10个步骤提取到10个小方法中,然后给每个小方法起一个有意义的名字,让人顾名思义一目了然,然后在原方法中依次调用这10个方法,程序员一看便知道这个方法干了什么。
提到有意义的名字,需要强调的是,在代码中,不管是类、方法还是变量,一个好的名字都非常重要,起一个有意义的名字,让人一看就知道它是干什么的,比多少注释都有效。
有时为了达到代码整洁的目的,甚至可以牺牲一点点“性能”。这一点尤其令我印象深刻,故单独列出来作为第四个方面。

 

四、别为了一丁点“性能”就牺牲掉整洁

这里加了引号,是因为这里所说的“性能“,其实只是程序员的臆测。而这种臆测经常经常发生。
比如一个循环当中干了两件完全不相关的事情,使得不同职责的代码杂糅在一起,影响了易读性又不利于重用。其实应该分两次做,即使做了两次循环也没有关系,除非有实际的测试数据证明,这样做确实影响了程序的性能。但是其实大部分情况下,这并不会对性能造成影响。
应该时刻记住大师们的教诲:

  • Ÿ 别为了一丁点"性能"就牺牲掉整洁
  • Ÿ "干净整洁的代码往往运行起来更快,即使不快,也很容易让他变快,让干净的程序变快,比让快速的程序变正确来得容易。"
  • Ÿ "过早的优化是一切罪恶的根源。"

由此可见,写出人易读懂的整洁的代码是多么重要。

以上几种意识的无论怎么强调都不为过的重要性,我也将牢固建立这些意识,写代码的时候时刻从这些意识出发,不断地持续地重构,只写干净整洁的代码。

   发表时间:2014-02-09  
重构很重要!
0 请登录后投票
   发表时间:2014-02-10  
以前我也看过这些原则,但是由于上线时间紧(借口),很多没有严格遵循,最终那些就像定时bomb一样引爆,其实是得不偿失,浪费更多的时间罢了,更关键的一点是要在开发时重构,经过严格测试才能说OK
0 请登录后投票
   发表时间:2014-02-10  
写的很好,但是推行起来的太难了
0 请登录后投票
   发表时间:2014-02-10  
多点代码审查,也比较好
0 请登录后投票
   发表时间:2014-02-10  
SwordShadow 写道
以前我也看过这些原则,但是由于上线时间紧(借口),很多没有严格遵循,最终那些就像定时bomb一样引爆,其实是得不偿失,浪费更多的时间罢了,更关键的一点是要在开发时重构,经过严格测试才能说OK

大家都懂这些原则,但是实践当中却没有去实行,或许是因为外部环境,或许是因为自身没有这个意愿。但是其实平常开发当中,多一点意识多一点主动,是可以去逐步改善的,慢慢积累,时间长了就会发现好处。
0 请登录后投票
   发表时间:2014-02-12  
重构的步调要求非常小,而开发人员在开发一个功能的时候做重构往往更加关注整体功能或者是整体方法的重构。这样的重构步调太大。而太小的步调,对于开发人员来说是没有意义的。或者说没有这个意思。让我在做一个功能的时候去修正一下变量的命名。这样的重构有多少开发人员愿意去做。
0 请登录后投票
   发表时间:2014-02-13   最后修改:2014-02-13
mqlfly2008 写道
重构的步调要求非常小,而开发人员在开发一个功能的时候做重构往往更加关注整体功能或者是整体方法的重构。这样的重构步调太大。而太小的步调,对于开发人员来说是没有意义的。或者说没有这个意思。让我在做一个功能的时候去修正一下变量的命名。这样的重构有多少开发人员愿意去做。


代码的可读性,简洁性,可维护性都是一步步重构完善出来的。那怕是一个变量命名都不愿意去重构,我想不到这个coder还能重构什么代码。
例如有时候有些人喜欢把字符串命名为“str”,别人看到你的代码一堆str,不觉得恶心吗,你不去把这个变量名给修正一下吗?
0 请登录后投票
   发表时间:2014-02-13  
caizi12 写道
mqlfly2008 写道
重构的步调要求非常小,而开发人员在开发一个功能的时候做重构往往更加关注整体功能或者是整体方法的重构。这样的重构步调太大。而太小的步调,对于开发人员来说是没有意义的。或者说没有这个意思。让我在做一个功能的时候去修正一下变量的命名。这样的重构有多少开发人员愿意去做。


代码的可读性,简洁性,可维护性都是一步步重构完善出来的。那怕是一个变量命名都不愿意去重构,我想不到这个coder还能重构什么代码。
例如有时候有些人喜欢把字符串命名为“str”,别人看到你的代码一堆str,不觉得恶心吗,你不去把这个变量名给修正一下吗?

说得对,写代码就如穿衣服,衣服脏了就想要去洗干净,衣服破了就去买一件新的,如果连衣服脏了都不愿意去洗一下的话,那也太懒了
0 请登录后投票
   发表时间:2014-02-13  
道理好懂,做起来很难。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics