给初学者一点建议:学习设计之前

捏造的信仰 2009-02-03 08:06:33
(这是写给初学者看的,虽然有点吹牛,但高人面前不敢班门弄斧,我写的都是来自我的切身经验。)

初学者学习设计模式之类的东西之前,如果能打好基础,将来必能事半功倍。

初学者不太讲究的一个地方,就是不考虑将来要修改代码的可能性。一个计算器写出来,就觉得“好,我会了”,马上丢到一边。

高水平的程序员,写出来的代码都是易于修改的。但是初学者很难有这种机会要修改自己的程序,怎么办呢?

就我个人经验,我觉得锻炼这种思维的一个好办法,就是反反复复的写同样功能的程序。第一个版本写出来之后,稍微总结一下,然后重新写过,并添加一点功能。

反复几次,你就会看到最后写出来的比起第一次写的真是赏心悦目得多。当你对自己的代码了如指掌的时候,不管要你添加什么功能,你马上就能想到要在什么地方添加什么样的类。

如果你能编写易于修改的代码,将来工作的时候绝对轻松不少。同样的需求,别人要翻来覆去的改东西,而你勾勾手指头就搞定了。一点也不夸张!



但是,一个初学者,认识的 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:给大家拜晚年并散分,祝大家健康愉快,心想事成!)
...全文
516 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
lightbear 2009-03-17
  • 打赏
  • 举报
回复
up
午后阳 2009-02-11
  • 打赏
  • 举报
回复
学习!我已经领教到了这种痛苦,起初没有这样想,最后倒致上线了,我也要重构,还好重构之后,好多了,但也不敢大刀的改!!只必了根类的重构,业务的类也不太敢重构!!太多了!怕出问题!!毕竟那些已经通过了测试,只是后续的功能不容易加而已!!
paullbm 2009-02-04
  • 打赏
  • 举报
回复
LOOK LOOK..
酒剑仙 2009-02-04
  • 打赏
  • 举报
回复
5行定律很难啊

因为照这样的分法 我一个类估计要分上百个方法出来!

我习惯按功能性分了 先估计下某个功能会不会被重复调用 然后确定方法是否细分。
尽可能的保持方法的可重复使用性
zhangshisk 2009-02-04
  • 打赏
  • 举报
回复
受教了,UP!
liang__ 2009-02-04
  • 打赏
  • 举报
回复
这是个好贴。楼主提出见解很好。受教了。
jaywee 2009-02-04
  • 打赏
  • 举报
回复
不管什么方法都不要超过 5 行
振聋发聩!
cuidenghong123 2009-02-04
  • 打赏
  • 举报
回复
学习。
mizukusa 2009-02-04
  • 打赏
  • 举报
回复
写的真好,受益匪浅!
hemen1218 2009-02-04
  • 打赏
  • 举报
回复
学习学习,很有帮助!!!
xtanshuai 2009-02-04
  • 打赏
  • 举报
回复
up!
gejie559 2009-02-04
  • 打赏
  • 举报
回复
学习了
gumpcz 2009-02-04
  • 打赏
  • 举报
回复
赞同你的说法
software51 2009-02-04
  • 打赏
  • 举报
回复
非常棒!学习了!
wclszh 2009-02-04
  • 打赏
  • 举报
回复
很好楼主很注意注意总结,学习了。
kinghy2302 2009-02-04
  • 打赏
  • 举报
回复
我就遇到过这样的问题,修改前人的程序,发现他把一个复杂过程的全部实现都放在一个类的一个方法了。。。看得我脑袋都大了,太乱。。
csgdseed 2009-02-04
  • 打赏
  • 举报
回复
很好
oklinsong 2009-02-04
  • 打赏
  • 举报
回复
大家不要纠结于几行的问题上,关键是思想,领会精神!
our651 2009-02-04
  • 打赏
  • 举报
回复
到底限制在几行没有意义,不过这个分而治之的思想到是一个哪里都通用的方法。
mayuanfei 2009-02-04
  • 打赏
  • 举报
回复
一个方法不超过 5 行
对于比较复杂的项目还真是不容易。
但是不超过20行。还是可以的。
加载更多回复(36)

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧