﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-朱雀的IT世界-随笔分类-java 基础</title><link>http://www.blogjava.net/phoenixtoday/category/25058.html</link><description>每天进步一点点，努力做好自己</description><language>zh-cn</language><lastBuildDate>Wed, 09 Jan 2008 23:09:33 GMT</lastBuildDate><pubDate>Wed, 09 Jan 2008 23:09:33 GMT</pubDate><ttl>60</ttl><item><title>一点重构心得</title><link>http://www.blogjava.net/phoenixtoday/archive/2008/01/08/173844.html</link><dc:creator>朱雀</dc:creator><author>朱雀</author><pubDate>Tue, 08 Jan 2008 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/phoenixtoday/archive/2008/01/08/173844.html</guid><wfw:comment>http://www.blogjava.net/phoenixtoday/comments/173844.html</wfw:comment><comments>http://www.blogjava.net/phoenixtoday/archive/2008/01/08/173844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phoenixtoday/comments/commentRss/173844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phoenixtoday/services/trackbacks/173844.html</trackback:ping><description><![CDATA[昨天，要写一段程序完成一个定时任务，是有关Socket 发送的。胖子给我发了一段现成的程序，这段程序基本上的功能是实现了，但是表达的并不是那么清晰，因此我想重构一下。没想到重构的过程竟然花了一个多小时，从晚上八点多，一下就写到了十点，但是重构完后，感觉清晰多了。仔细想想收获颇多，因此在这里写写经验进行总结。<br />
<br />
重构程序的目的，不是因为程序不能用才要你去重构，重构的目的是因为一、你的代码，被人看的次数，远比它用到的次数多；二、重构有利于你发现问题，让你的程序结构优化，因此可复用性更强，遵守了知识的唯一性，DRY 原则；三、如果你要改动这段代码，那么先重构，使得你的代码好改，这实际是在为你的未来减少工作量，而且一段优秀的代码，带给你的价值，远比你每次都要Ctrl+C，Ctrl+V 大得多。<br />
<br />
写代码，要让你的代码第一次呈现在别人面前的时候，像读英语一般，那么你的代码功底是足够了。你的代码就可以称作你最好的文档了，其余什么文档，大可不必！<br />
<br />
基于昨天的经验，我新总结了两条：<br />
一、经常使用重构方法extract method 的人，会发现，总是可以省掉一些临时变量。这是好事，但这可能会造成如下的结果：<br />
<br />
<span style="background-color: #b8c2af;">method_one(method_two(method_three(method_four())))</span><br />
<br />
也就是说，很可能会导致这种长串的嵌套，导致程序可读性的下降，使人看的晕头转向。那么如何解决呢，其实是一个度的问题。我给自己定了一个规矩，临界点是三个函数这样级联起来，如果超过三个，我就将它们拆开。比如说上面这个小例子，我会拆成：<br />
<br />
<span style="background-color: #b8c2af;">
arg = method_three(method(four));</span><br />
<span style="background-color: #b8c2af;">method_one(method_two(arg));</span><br />
<br />
虽然浪费了一个临时变量，但是这样就可以让人一眼看懂我的意思，可读性提升，修改起来自然也会容易些。<br />
<br />
二、写过Java I/O 的人，肯定看到过这样的程序：<br />
<br />
<span style="background-color: #b8c2af;">
Reader in = null;<br />
Writer out = null;<br />
try<br />
{<br />
&nbsp;&nbsp;&nbsp; in = new InputStreamReader(socket.getInputStream(),"utf8");<br />
&nbsp;&nbsp;&nbsp; out = new OutputStreamWriter(socket.getOutputStream(),"utf8");<br />
<br />
/**<br />
&nbsp;* some TODOs here<br />
&nbsp;*<br />
**/<br />
}catch(IOException ioe)<br />
{<br />
&nbsp;&nbsp;&nbsp; System.err.println("error message");<br />
&nbsp;&nbsp;&nbsp; ioe.printStackTrace();<br />
}<br />
finally<br />
{<br />
&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(in != null)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; in.close();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(out != null)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp; }catch(IOException ioe2)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  System.err.println("some error message");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  ioe2.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; }<br />
}</span><br />
<br />
怎么说呢，这段代码看上去，其实是够好了，其实不重构也是可以的。也许我偏执吧，我认为它不够好，因为：首先，大段的try catch 的确会捕获异常，但是这段代码至少有好几段是会独立抛出异常的，这里包含了四个IO 实例的创建和销毁，这四段代码如果出错都会抛出异常，那么你捕获的到底是哪个呢？其次，没有把功能段合理分开，这段代码的逻辑功能实际上是两个，一个是读，一个是写，那么合并在一起，首先顺序很乱，其次容易让阅读的人产生困惑，从而造成代码可读性差。我是这样做的：<br />
<br />
<span style="background-color: #b8c2af;">
private void writeFile(String fileName, String outStr)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Writer writer = null;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;writer = new OutputStreamWriter(new FileOutputStream(fileName),<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;"utf8");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;catch (UnsupportedEncodingException e)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.err.println("不支持的编码方式");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;catch (FileNotFoundException e)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.err.println("初始化文件失败，或路径不存在：" + fileName);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;writer.write(outStr);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;writer.flush();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;catch (IOException e)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.err.println("写文件失败");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;finally<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if(writer != null)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; writer.close();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;catch (IOException e)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.err.println("关闭文件失败");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}</span><br />
<br />
类似的，也将读的逻辑独立抽出来，虽然，这不但没使代码的量减少，却增加了很多try catch 模块，不过逻辑上很完整，而且发挥了每个try catch 的最佳功效。我把它起名曰，我个人的偏执情节吧。<br />
<br />
困了，要睡觉了，本来还想将代码从最初模样，到最后模样的过程复述一遍，改天有机会再说，精华都已经说了。嘿嘿<br />
<br />
<img src ="http://www.blogjava.net/phoenixtoday/aggbug/173844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phoenixtoday/" target="_blank">朱雀</a> 2008-01-08 23:56 <a href="http://www.blogjava.net/phoenixtoday/archive/2008/01/08/173844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>以前很困惑用Java 写的程序如何做成windows 服务，这里有一篇讲如何将tomact 程序做成windows 服务的，可以参考下</title><link>http://www.blogjava.net/phoenixtoday/archive/2007/11/27/163386.html</link><dc:creator>朱雀</dc:creator><author>朱雀</author><pubDate>Tue, 27 Nov 2007 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/phoenixtoday/archive/2007/11/27/163386.html</guid><wfw:comment>http://www.blogjava.net/phoenixtoday/comments/163386.html</wfw:comment><comments>http://www.blogjava.net/phoenixtoday/archive/2007/11/27/163386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phoenixtoday/comments/commentRss/163386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phoenixtoday/services/trackbacks/163386.html</trackback:ping><description><![CDATA[1:设置环境变量CATALINA_HOME＝E:"tomcat5.5<br />
2：设置CLASS_PATH 为CLASS_PATH＝.;C:"java"jdk1.5.0_06"lib"dt.jar;C:"java"jdk1.5.0_06"lib"tools.jar;%CATALINA_HOME%"bin"bootstrap.jar
<p>3：设置PATH中为C:"java"jdk1.5.0_06"bin;E:"tomcat5.5"bin;</p>
<p>4：添加服务命令：service.bat install Tomcat5 <br />
&nbsp;&nbsp; 运行完命令后就可以在服务中看到 Apache Tomcat5 然后可以自行改为手动或自动启动。<br />
&nbsp;&nbsp; 注：如果使用tomcat5.exe安装名字为'Tomcat5'的服务可以运行以下命令：<br />
&nbsp;&nbsp;&nbsp; tomcat5 //IS//Tomcat5 --DisplayName="Apache Tomcat 5"&nbsp;
--Install="C:"Program Files"Tomcat"bin"tomcat5.exe" --Jvm=auto
--StartMode=jvm --StopMode=jvm
--StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start
--StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop </p>
<p>5：移除服务命令：tomcat5 //DS//Tomcat5</p>
<img src ="http://www.blogjava.net/phoenixtoday/aggbug/163386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phoenixtoday/" target="_blank">朱雀</a> 2007-11-27 10:11 <a href="http://www.blogjava.net/phoenixtoday/archive/2007/11/27/163386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 历代版本记</title><link>http://www.blogjava.net/phoenixtoday/archive/2007/10/03/150250.html</link><dc:creator>朱雀</dc:creator><author>朱雀</author><pubDate>Wed, 03 Oct 2007 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/phoenixtoday/archive/2007/10/03/150250.html</guid><wfw:comment>http://www.blogjava.net/phoenixtoday/comments/150250.html</wfw:comment><comments>http://www.blogjava.net/phoenixtoday/archive/2007/10/03/150250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phoenixtoday/comments/commentRss/150250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phoenixtoday/services/trackbacks/150250.html</trackback:ping><description><![CDATA[JDK 1.1.4
Sparkler
宝石
1997-09-12
<br />
JDK 1.1.5
Pumpkin
南瓜
1997-12-13
<br />
JDK 1.1.6
Abigail
阿比盖尔--女子名
1998-04-24
<br />
JDK 1.1.7
Brutus
布鲁图--古罗马政治家和将军
1998-09-28
<br />
JDK 1.1.8
Chelsea
切尔西--城市名
1999-04-08
<br />
<br />
J2SE 1.2
Playground
运动场
1998-12-04
<br />
J2SE 1.2.1
none
无
1999-03-30
<br />
J2SE 1.2.2
Cricket
蟋蟀
1999-07-08
<br />
<br />
J2SE 1.3
Kestrel
美洲红隼
2000-05-08
<br />
J2SE 1.3.1
Ladybird
瓢虫
2001-05-17
<br />
<br />
J2SE 1.4.0
Merlin
灰背隼
2002-02-13
<br />
J2SE 1.4.1
grasshopper
蚱蜢
2002-09-16
<br />
J2SE 1.4.2
Mantis
螳螂
2003-06-26
<br />
<br />
J2SE 5.0 (1.5.0)
Tiger
老虎
2004-10
<br />
<br />
J2SE 6.0 (Beta)
Mustang
野马
2006-04
<img src ="http://www.blogjava.net/phoenixtoday/aggbug/150250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phoenixtoday/" target="_blank">朱雀</a> 2007-10-03 11:45 <a href="http://www.blogjava.net/phoenixtoday/archive/2007/10/03/150250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 的3D游戏开发引擎 JME</title><link>http://www.blogjava.net/phoenixtoday/archive/2007/08/17/137639.html</link><dc:creator>朱雀</dc:creator><author>朱雀</author><pubDate>Fri, 17 Aug 2007 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/phoenixtoday/archive/2007/08/17/137639.html</guid><wfw:comment>http://www.blogjava.net/phoenixtoday/comments/137639.html</wfw:comment><comments>http://www.blogjava.net/phoenixtoday/archive/2007/08/17/137639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phoenixtoday/comments/commentRss/137639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phoenixtoday/services/trackbacks/137639.html</trackback:ping><description><![CDATA[从小就喜欢梦想自己编写游戏，对游戏的编写也是非常感兴趣。可惜中国当前的学校并没有对游戏开发的重视。对游戏软件的梦想变成了对计算机软件的梦想。现在
也多多少少有些积累。很喜欢Java语言。无奈的是Java对游戏的开发一直并不是那么理想。今天看到了这个东西的介绍，唤起了潜藏已久的梦想。<br />
JME 一个用Java开发出来的3D 游戏引擎，呵呵，以后我一定要用它来做出自己喜欢的游戏。<br />
<a set="yes" linkindex="12" href="http://www.jmonkeyengine.com/" target="_blank">http://www.jmonkeyengine.com/ </a>这是网址，我记下了
<br />
<img src ="http://www.blogjava.net/phoenixtoday/aggbug/137639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phoenixtoday/" target="_blank">朱雀</a> 2007-08-17 17:04 <a href="http://www.blogjava.net/phoenixtoday/archive/2007/08/17/137639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.awt.Robot类介绍</title><link>http://www.blogjava.net/phoenixtoday/archive/2007/08/17/137636.html</link><dc:creator>朱雀</dc:creator><author>朱雀</author><pubDate>Fri, 17 Aug 2007 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/phoenixtoday/archive/2007/08/17/137636.html</guid><wfw:comment>http://www.blogjava.net/phoenixtoday/comments/137636.html</wfw:comment><comments>http://www.blogjava.net/phoenixtoday/archive/2007/08/17/137636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phoenixtoday/comments/commentRss/137636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phoenixtoday/services/trackbacks/137636.html</trackback:ping><description><![CDATA[此类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot 的主要目的是便于 Java
平台实现自动测试。使用该类生成输入事件与将事件发送到 AWT 事件队列或 AWT
组件的区别在于：事件是在平台的本机输入队列中生成的。例如，Robot.mouseMove 将实际移动鼠标光标，而不是只生成鼠标移动事件。
注意，某些平台需要特定权限或扩展来访问低级输入控件。如果当前平台配置不允许使用输入控件，那么试图构造 Robot 对象时将抛出 <br />
AWTException。例如，如果 X 服务器不支持（或没有启用）XTEST 2.2 标准扩展，则 X-Window  系统会抛出异常。 <br />
<br />
发现这个类，将来可以模拟测试哦，还挺有意思
<br />
<img src ="http://www.blogjava.net/phoenixtoday/aggbug/137636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phoenixtoday/" target="_blank">朱雀</a> 2007-08-17 17:02 <a href="http://www.blogjava.net/phoenixtoday/archive/2007/08/17/137636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>