(这是写给初学者看的,虽然有点吹牛,但高人面前不敢班门弄斧,我写的都是来自我的切身经验。)初学者学习设计模式之类的东西之前,如果能打好基础,将来必能事半功倍。初学者不太讲究的一个地方,就是不考虑将来要修改代码的可能性。一个计算器写出来,就觉得“好,我会了”,马上丢到一边。高水平的程序员,写出来的代码都是易于修改的。但是初学者很难有这种机会要修改自己的程序,怎么办呢?就我个人经验,我觉得锻炼这种思维的一个好办法,就是反反复复的写同样功能的程序。第一个版本写出来之后,稍微总结一下,然后重新写过,并添加一点功能。反复几次,你就会看到最后写出来的比起第一次写的真是赏心悦目得多。当你对自己的代码了如指掌的时候,不管要你添加什么功能,你马上就能想到要在什么地方添加什么样的类。如果你能编写易于修改的代码,将来工作的时候绝对轻松不少。同样的需求,别人要翻来覆去的改东西,而你勾勾手指头就搞定了。一点也不夸张!但是,一个初学者,认识的 Java 类没几个,更别说做什么设计了。这样的人能写出这样“高水平”的代码吗?能!我教你一个简单的原则:不管什么方法都不要超过 5 行。我相信很多人不是第一次见到这句话,但真正把它放在心上的没几个。我想说的是,初学者要能认准这句话,那就等于练了九阳神功,写出来的代码保证经脉通畅,内劲十足。你别说做不到。初学者写的程序本来就没多少功能,一个方法不超过 5 行完全没问题。具体怎么写呢?举个例子:写一个计算器,main 函数该怎么写?
public static void main(String[] args) {
    setupUIManager();                   // 初始化 Swing 风格
    new Calculator().setVisible(true);  // 打开窗体
}怎么样,两行。Calculator 就是计算器的窗体类。这个窗体有很多控件,初始化一定有很多代码吧?NO,不需要:
public class Calculator extends JFrame {    public Calculator() {
        setupFrame(); // 初始化窗体大小、标题等
        createLayout(); // 初始化布局
        createMenu(); // 添加菜单栏
        createTextField(); // 添加文本框
        createButtons(); // 添加按钮
    }
}
就是这样,通过将代码委派到其他方法,就能把方法缩小到 5 行以内。看到这里你也许哭笑不得:这搞法未免太弱智了吧?这有什么好处?——告诉你,这样做的好处就是:总揽全局,快速定位。拿上面的代码为例,如果将来要添加菜单项,那么一眼就看得出,要修改的只有 createMenu() 方法。如果运行的时候发现少了一个按钮,你也一眼就看得出,问题出在 createButtons() 方法。相反,如果这五个方法参杂在一起,这代码我保证你看了就不想动,如果出了问题要修复,那个头疼啊不仅如此,更重要的是,这种预先委派的编码方式对你的思维也有提高。打比方我要做的事情分为若干个步骤。在编写步骤 A 的代码之前,先将 A 委派给一个空的方法 a()。至于 a() 的内容,我现在不考虑,我现在考虑什么?我现在考虑 A 完成之后要做的事情。这就叫三万英尺的高度。假如 A 做完了就做 B,那么我又将它委派给 b()。以此类推,等所有的事情都委派完了之后,我再考虑 a()、b() 里面该写什么。这个时候,a() 已经把步骤 A 给限定了,传入什么,返回什么,都已经定好了。那么写 a() 的时候根本不用考虑这个方法以外的事情。如果 a() 很复杂,我又可以委派给若干个方法来实现。每个方法都是一样的来做,直到某个步骤已经很简单了,我就可以写最后的代码了。虽然整个逻辑,A,B,C,D,E,...很复杂,但是通过委派的方式,我每次都只需要考虑其中很小的一部分,所以写起来很轻松。这样写出来的代码脉络清晰,好看又好改。这就是所谓化整为零,分而治之。所以,一个方法不超过 5 行,不是绝对的,它体现的原则是:一个方法的内容要一眼就能看懂。咱行内有句俗话:代码是给人看的,不是给机器看的。说句不好听的,不是人看的东西,也一定不是人写的!你可能会说“没那么严重吧,程序能用就行了嘛”。想想看,如果我愿意,所有的代码都写在 main() 里面,程序不照样能运行?既然能用,我又何必看什么设计模式呢?——所以归根结底,所谓设计,就是将代码组织得更加易懂。易懂的东西才容易复用,容易复用才叫好的设计。学习设计的时候请务必记住这点。开头说了,这都是我的切身体会。如果不是当初学编程的时候在书上看到不要超过 5 行这句忠告,我都不敢想象自己现在会是什么样子。所以我特别崇拜这句话,虽然不知道是谁说的……(PS:给大家拜晚年并散分,祝大家健康愉快,心想事成!)

解决方案 »

  1.   

    不管什么方法都不要超过 5 行...
    第一次听说,不过觉得楼主说的挺有道理的!
      

  2.   

    学习了,,,,第一次看到,,以后就按这个准则一写代码..三千万英尺的高度啊,呵呵,
      

  3.   

    以前看过不要超过10行的说法
    不论多少行 方法尽量简短易懂 模块化 就可以了
      

  4.   

    受用了,我是小虾一只,一直都想成为大虾,前两年埋头做工,却碌碌终日而无所得,这是我注册号码看到的第一个帖子,也是一个好帖子
    楼主我记下了,三万英尺高处的五行!
      

  5.   

    这是个好贴。楼主提出见解很好。受教了。
      

  6.   

    5行定律很难啊因为照这样的分法 我一个类估计要分上百个方法出来!我习惯按功能性分了  先估计下某个功能会不会被重复调用 然后确定方法是否细分。
    尽可能的保持方法的可重复使用性
      

  7.   


    很显然, 我就是那个人
      

  8.   

    不管什么方法都不要超过 5 行.但到了实际上不可能全都不超过5行。我怀疑LZ运用了夸张的修辞方法。还是赞一个。
      

  9.   

    一个方法不超过 5 行
    对于比较复杂的项目还真是不容易。
    但是不超过20行。还是可以的。
      

  10.   

    到底限制在几行没有意义,不过这个分而治之的思想到是一个哪里都通用的方法。
      

  11.   

    大家不要纠结于几行的问题上,关键是思想,领会精神!
      

  12.   

    我就遇到过这样的问题,修改前人的程序,发现他把一个复杂过程的全部实现都放在一个类的一个方法了看得我脑袋都大了,太乱。。
      

  13.   

    不管什么方法都不要超过 5 行
    振聋发聩!
      

  14.   

    楼主是好人!
    一生会有好报!
      

  15.   

    谢谢楼主分享  学习中.....
      

  16.   

    确实是好贴,以前我学习的时候,师兄们也是这样提醒。
    简单、模块、封装才好。
      

  17.   

    好...看来楼主已经快练成神功了.谢谢楼主分享.
    新年快乐..
      

  18.   

    呵呵,LZ要保持干劲,一起加油吧 :-)
      

  19.   

    这个要根据项目的大小来的,项目小的话可以不用考虑,大的话复用代码和精简代码是必需的,具体多少行当话就看自己的爱好了,我的一般不超过30行
      

  20.   

    学习!我已经领教到了这种痛苦,起初没有这样想,最后倒致上线了,我也要重构,还好重构之后,好多了,但也不敢大刀的改!!只必了根类的重构,业务的类也不太敢重构!!太多了!怕出问题!!毕竟那些已经通过了测试,只是后续的功能不容易加而已!!