(这是写给初学者看的,虽然有点吹牛,但高人面前不敢班门弄斧,我写的都是来自我的切身经验。)初学者学习设计模式之类的东西之前,如果能打好基础,将来必能事半功倍。初学者不太讲究的一个地方,就是不考虑将来要修改代码的可能性。一个计算器写出来,就觉得“好,我会了”,马上丢到一边。高水平的程序员,写出来的代码都是易于修改的。但是初学者很难有这种机会要修改自己的程序,怎么办呢?就我个人经验,我觉得锻炼这种思维的一个好办法,就是反反复复的写同样功能的程序。第一个版本写出来之后,稍微总结一下,然后重新写过,并添加一点功能。反复几次,你就会看到最后写出来的比起第一次写的真是赏心悦目得多。当你对自己的代码了如指掌的时候,不管要你添加什么功能,你马上就能想到要在什么地方添加什么样的类。如果你能编写易于修改的代码,将来工作的时候绝对轻松不少。同样的需求,别人要翻来覆去的改东西,而你勾勾手指头就搞定了。一点也不夸张!但是,一个初学者,认识的 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:给大家拜晚年并散分,祝大家健康愉快,心想事成!)
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:给大家拜晚年并散分,祝大家健康愉快,心想事成!)
解决方案 »
- 能输入2个KEY,获取一个value吗?
- [JAVA新手之挑战一]文件管理系统
- 如何用JAVA打开带有宏的EXCEL文件,并得到返回值
- 我做了个聊天室程序,当我在向里面加图片时有点问题,我想加入本地images里面的图片可是用ImageIcon()只可以获取和.class文件同一目录的
- 请问java中全局变量应该放哪儿?
- 请大虾们指点一下在windows xp中怎么设置数据源呢
- 小弟我写了个简单的 applet 能编译、运行,但是达不到我需要的结果,请帮忙看看!
- 在一个项目中如何使用Logger进行记录所有信息,然后保存至数据!
- 问题没有人给我解决,还要继续问,关于 awt tree
- 在何处初始化对象才是最快的速度?【深度思考】
- 帮帮我这初学者
- 新建文件报错问题
第一次听说,不过觉得楼主说的挺有道理的!
不论多少行 方法尽量简短易懂 模块化 就可以了
楼主我记下了,三万英尺高处的五行!
尽可能的保持方法的可重复使用性
很显然, 我就是那个人
对于比较复杂的项目还真是不容易。
但是不超过20行。还是可以的。
振聋发聩!
一生会有好报!
简单、模块、封装才好。
新年快乐..