﻿<?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-西元化石</title><link>http://www.blogjava.net/bonix/</link><description>-大多问题归根到底是人的问题, 少些漫骂,少些偏激,理性的思考是解决问题之道.</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 08:56:15 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 08:56:15 GMT</pubDate><ttl>60</ttl><item><title>Linux/Unix Java 环境变量</title><link>http://www.blogjava.net/bonix/archive/2007/10/10/151639.html</link><dc:creator>西元化石</dc:creator><author>西元化石</author><pubDate>Wed, 10 Oct 2007 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/bonix/archive/2007/10/10/151639.html</guid><wfw:comment>http://www.blogjava.net/bonix/comments/151639.html</wfw:comment><comments>http://www.blogjava.net/bonix/archive/2007/10/10/151639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bonix/comments/commentRss/151639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bonix/services/trackbacks/151639.html</trackback:ping><description><![CDATA[<p>多次在Linux/Unix 下配置环境变量，每每配置时都不记的了，记录如下：<br />
1.　vi /etc/profile</p>
<p>2. 增加如下内容 <br />
JDK环境<br />
export JAVA_HOME=/usr/java5<br />
export PATH=$PATH:$JAVA_HOME/bin<br />
export CLASSPATH=.:$JAVA_HOME/lib<br />
<br />
或<br />
<br />
JDK &amp; Tomcat 环境变量<br />
export CATALINA_HOME=/opt/jakarta-tomcat-5.0.28<br />
export JAVA_HOME=/usr/java5<br />
export PATH=$PATH:$CATALINA_HOME/bin/:$JAVA_HOME/bin<br />
export CLASSPATH=.:$JAVA_HOME/lib</p>
<p>3.&nbsp;使配置生效<br />
&nbsp;　. /etc/profile<br />
　注.　后面有一个空格</p>
<img src ="http://www.blogjava.net/bonix/aggbug/151639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bonix/" target="_blank">西元化石</a> 2007-10-10 10:24 <a href="http://www.blogjava.net/bonix/archive/2007/10/10/151639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java对象序列化</title><link>http://www.blogjava.net/bonix/archive/2006/02/06/29658.html</link><dc:creator>西元化石</dc:creator><author>西元化石</author><pubDate>Mon, 06 Feb 2006 01:10:00 GMT</pubDate><guid>http://www.blogjava.net/bonix/archive/2006/02/06/29658.html</guid><wfw:comment>http://www.blogjava.net/bonix/comments/29658.html</wfw:comment><comments>http://www.blogjava.net/bonix/archive/2006/02/06/29658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bonix/comments/commentRss/29658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bonix/services/trackbacks/29658.html</trackback:ping><description><![CDATA[序列化是将数据分解成字节流，以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象<BR><BR>java.io包有两个序列化对象的类。ObjectOutputStream负责将对象写入字节流，ObjectInputStream从字节流重构对象<img src ="http://www.blogjava.net/bonix/aggbug/29658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bonix/" target="_blank">西元化石</a> 2006-02-06 09:10 <a href="http://www.blogjava.net/bonix/archive/2006/02/06/29658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>成为编程高手的八大奥秘[转]</title><link>http://www.blogjava.net/bonix/archive/2005/12/19/24581.html</link><dc:creator>西元化石</dc:creator><author>西元化石</author><pubDate>Mon, 19 Dec 2005 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/bonix/archive/2005/12/19/24581.html</guid><wfw:comment>http://www.blogjava.net/bonix/comments/24581.html</wfw:comment><comments>http://www.blogjava.net/bonix/archive/2005/12/19/24581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bonix/comments/commentRss/24581.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bonix/services/trackbacks/24581.html</trackback:ping><description><![CDATA[<A name=21237789></A>&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;不知不觉做软件已经做了十年，有成功的喜悦，也有失败的痛苦，但总不敢称自己是高手，因为和我心目中真正的高手们比起来，还差得太远。世界上并没有成为高手的捷径，但一些基本原则是可以遵循的。&nbsp;<BR><BR><BR>1、扎实的基础&nbsp;<BR><BR>　　数据结构、离散数学、编译原理，这些是所有计算机科学的基础，如果不掌握它们，很难写出高水平的程序。程序人人都会写，但当你发现写到一定程度很难再提高的时候，就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP，即使你再精通OOP，遇到一些基本算法的时候可能也会束手无策。因此多读一些计算机基础理论方面的书籍是非常有必要的。&nbsp;<BR><BR>　　2、丰富的想像力&nbsp;<BR><BR>　　不要拘泥于固定的思维方式，遇到问题的时候要多想几种解决问题的方案，试试别人从没想过的方法。丰富的想像力是建立在丰富的知识的基础上，除计算机以外，多涉猎其他的学科，比如天文、物理、数学等等。开阔的思维对程序员来说很重要。&nbsp;<BR><BR>　　3、最简单的是最好的&nbsp;<BR><BR>　　这也许是所有科学都遵循的一条准则，复杂的质能转换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式：E=mc2。简单的方法更容易被人理解，更容易实现，也更容易维护。遇到问题时要优先考虑最简单的方案，只有简单方案不能满足要求时再考虑复杂的方案。&nbsp;<BR><BR>　　4、不钻牛角尖&nbsp;<BR><BR>　　当你遇到障碍的时候，不妨暂时远离电脑，看看窗外的风景，听听轻音乐，和朋友聊聊天。当我遇到难题的时候会去玩游戏，当负责游戏的那部分大脑细胞极度亢奋的时候，负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候，我会发现那些难题现在竟然可以迎刃而解。&nbsp;<BR><BR>　　5、对答案的渴求&nbsp;<BR><BR>　　人类自然科学的发展史就是一个渴求得到答案的过程，即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念，一定要找到问题的答案，你才会付出精力去探索，即使最后没有得到答案，在过程中你也会学到很多东西。&nbsp;<BR><BR>　　6、多与别人交流&nbsp;<BR><BR>　　三人行必有我师，也许在一次和别人不经意的谈话中，就可以迸出灵感的火花。多上上网，看看别人对同一问题的看法，会给你很大的启发。&nbsp;<BR><BR>　　7、良好的编程风格&nbsp;<BR><BR>　　注意养成良好的习惯，代码的缩进编排，变量的命名规则要始终保持一致。大家都知道如何排除代码中错误，却往往忽视了对注释的排错。注释是程序的一个重要组成部分，它可以使你的代码更容易理解，而如果代码已经清楚地表达了你的思想，就不必再加注释了，如果注释和代码不一致，那就更加糟糕。&nbsp;<BR><BR>　　8、韧性和毅力&nbsp;<BR><BR>　　这也许是“高手”和一般程序员最大的区别。高手们并不是天才，他们是在无数个日日夜夜中磨炼出来的。成功能给我们带来无比的喜悦，但过程却是无比的枯燥乏味。你不妨做个测试，找个10000以内的素数表，把它们全都抄下来，然后再检查三遍，如果能够不间断地完成这一工作，你就可以满足这一条。&nbsp;<BR><img src ="http://www.blogjava.net/bonix/aggbug/24581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bonix/" target="_blank">西元化石</a> 2005-12-19 10:54 <a href="http://www.blogjava.net/bonix/archive/2005/12/19/24581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用正则表达式</title><link>http://www.blogjava.net/bonix/archive/2005/12/03/22328.html</link><dc:creator>西元化石</dc:creator><author>西元化石</author><pubDate>Sat, 03 Dec 2005 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/bonix/archive/2005/12/03/22328.html</guid><wfw:comment>http://www.blogjava.net/bonix/comments/22328.html</wfw:comment><comments>http://www.blogjava.net/bonix/archive/2005/12/03/22328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bonix/comments/commentRss/22328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bonix/services/trackbacks/22328.html</trackback:ping><description><![CDATA[<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD class=content>&nbsp;"^\d+$"　　//非负整数（正整数 + 0） 
<P></P>
<P><BR>"^[0-9]*[1-9][0-9]*$"　　//正整数 </P>
<P><BR>"^((-\d+)|(0+))$"　　//非正整数（负整数 + 0） </P>
<P><BR>"^-[0-9]*[1-9][0-9]*$"　　//负整数 </P>
<P><BR>"^-?\d+$"　　　　//整数 </P>
<P><BR>"^\d+(\.\d+)?$"　　//非负浮点数（正浮点数 + 0） </P>
<P><BR>"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"　　//正浮点数 </P>
<P><BR>"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"　　//非正浮点数（负浮点数 + 0） </P>
<P><BR>"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"　　//负浮点数 </P>
<P><BR>"^(-?\d+)(\.\d+)?$"　　//浮点数 </P>
<P><BR>"^[A-Za-z]+$"　　//由26个英文字母组成的字符串 </P>
<P><BR>"^[A-Z]+$"　　//由26个英文字母的大写组成的字符串 </P>
<P><BR>"^[a-z]+$"　　//由26个英文字母的小写组成的字符串 </P>
<P><BR>"^[A-Za-z0-9]+$"　　//由数字和26个英文字母组成的字符串 </P>
<P><BR>"^\w+$"　　//由数字、26个英文字母或者下划线组成的字符串 </P>
<P><BR>"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"　　　　//email地址 </P>
<P><BR>"^[a-zA-z]+:\/\/(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"　　//url <BR><BR>匹配中文字符的正则表达式： [\u4e00-\u9fa5] <BR><BR>匹配双字节字符(包括汉字在内)：[^\x00-\xff] <BR><BR>应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1） <BR><BR>String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;} <BR><BR>匹配空行的正则表达式：\n[\s| ]*\r <BR><BR>匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/ <BR><BR>匹配首尾空格的正则表达式：(^\s*)|(\s*$) <BR><BR>[b]利用正则表达式限制网页表单里的文本框输入内容：[/b] <BR><BR>[b]用正则表达式限制只能输入中文：[/b] onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" <BR><BR>[b]用正则表达式限制只能输入全角字符：[/b] onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))" <BR><BR>[b]用正则表达式限制只能输入数字：[/b] onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" <BR><BR>[b]用正则表达式限制只能输入数字和英文：[/b] onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" <BR><BR><STRONG>正则表达式语法</STRONG><BR><BR>字符 说明 <BR>\&nbsp;&nbsp; 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如，“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”，“\(”匹配“(”。 <BR>^&nbsp; 配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性，^ 还会与“\n”或“\r”之后的位置匹配。 <BR>$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性，$ 还会与“\n”或“\r”之前的位置匹配。 <BR>* 零次或多次匹配前面的字符或子表达式。例如，zo* 匹配“z”和“zoo”。* 等效于 {0,}。 <BR>+ 一次或多次匹配前面的字符或子表达式。例如，“zo+”与“zo”和“zoo”匹配，但与“z”不匹配。+ 等效于 {1,}。 <BR>? 零次或一次匹配前面的字符或子表达式。例如，“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。 <BR>{n} n 是非负整数。正好匹配 n 次。例如，“o{2}”与“Bob”中的“o”不匹配，但与“food”中的两个“o”匹配。 <BR>{n,} n 是非负整数。至少匹配 n 次。例如，“o{2,}”不匹配“Bob”中的“o”，而匹配“foooood”中的所有 o。'o{1,}' 等效于 'o+'。'o{0,}' 等效于 'o*'。 <BR>{n,m} m 和 n 是非负整数，其中 n &lt;= m。至少匹配 n 次，至多匹配 m 次。例如，“o{1,3}”匹配“fooooood”中的头三个 o。'o{0,1}' 等效于 'o?'。注意：您不能将空格插入逗号和数字之间。 <BR>? 当此字符紧随任何其他限定符（*、+、?、{n}、{n,}、{n,m}）之后时，匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串，而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如，在字符串“oooo”中，“o+?”只匹配单个“o”，而“o+”匹配所有“o”。 <BR>. 匹配除“\n”之外的任何单个字符。若要匹配包括“\n”在内的任意字符，请使用诸如“[\s\S]”之类的模式。 <BR>(pattern) 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0...$9 属性从结果“匹配”集合中检索捕获的匹配。若要匹配括号字符 ( )，请使用“\(”或者“\)”。 <BR>(?:pattern) 匹配 pattern 但不捕获该匹配的子表达式，即它是一个非捕获匹配，不存储供以后使用的匹配。这对于用“或”字符 (|) 组合模式部件的情况很有用。例如，与“industry|industries”相比，“industr(?:y| ies)”是一个更加经济的表达式。 <BR>(?=pattern) 执行正向预测先行搜索的子表达式，该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配，即不能捕获供以后使用的匹配。例如，“Windows (?=95| 98| NT| 2000)”与“Windows 2000”中的“Windows”匹配，但不与“Windows 3.1”中的“Windows”匹配。预测先行不占用字符，即发生匹配后，下一匹配的搜索紧随上一匹配之后，而不是在组成预测先行的字符后。 <BR>(?!pattern) 执行反向预测先行搜索的子表达式，该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配，即不能捕获供以后使用的匹配。例如，“Windows (?!95| 98| NT| 2000)”与“Windows 3.1”中的“Windows”匹配，但不与“Windows 2000”中的“Windows”匹配。预测先行不占用字符，即发生匹配后，下一匹配的搜索紧随上一匹配之后，而不是在组成预测先行的字符后。 <BR>x| y 与 x 或 y 匹配。例如，“z| food”与“z”或“food”匹配。“(z| f)ood”与“zood”或“food”匹配。&nbsp; <BR>[xyz] 字符集。匹配包含的任一字符。例如，“[abc]”匹配“plain”中的“a”。&nbsp; <BR>[^xyz] 反向字符集。匹配未包含的任何字符。例如，“[^abc]”匹配“plain”中的“p”。&nbsp; <BR>[a-z] 字符范围。匹配指定范围内的任何字符。例如，“[a-z]”匹配“a”到“z”范围内的任何小写字母。&nbsp; <BR>[^a-z] 反向范围字符。匹配不在指定的范围内的任何字符。例如，“[^a-z]”匹配任何不在“a”到“z”范围内的任何字符。&nbsp; <BR>\b 匹配一个字边界，即字与空格间的位置。例如，“er\b”匹配“never”中的“er”，但不匹配“verb”中的“er”。&nbsp; <BR>\B 非字边界匹配。“er\B”匹配“verb”中的“er”，但不匹配“never”中的“er”。&nbsp; <BR>\cx 匹配由 x 指示的控制字符。例如，\cM 匹配一个 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样，则假定 c 就是“c”字符本身。&nbsp; <BR>\d 数字字符匹配。等效于 [0-9]。&nbsp; <BR>\D 非数字字符匹配。等效于 [^0-9]。&nbsp; <BR>\f 换页符匹配。等效于 \x0c 和 \cL。 <BR>\n 换行符匹配。等效于 \x0a 和 \cJ。 <BR>\r 匹配一个回车符。等效于 \x0d 和 \cM。 <BR>\s 匹配任何空白字符，包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 <BR>\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。&nbsp; <BR>\t 制表符匹配。与 \x09 和 \cI 等效。 <BR>\v 垂直制表符匹配。与 \x0b 和 \cK 等效。 <BR>\w 匹配任何字类字符，包括下划线。与“[A-Za-z0-9_]”等效。&nbsp; <BR>\W 任何非字字符匹配。与“[^A-Za-z0-9_]”等效。&nbsp; <BR>\xn 匹配 n，此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如，“\x41”匹配“A”。“\x041”与“\x04”&amp;“1”等效。允许在正则表达式中使用 ASCII 代码。 <BR>\num 匹配 num，此处的 num 是一个正整数。到捕获匹配的反向引用。例如，“(.)\1”匹配两个连续的相同字符。&nbsp; <BR>\n 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式，那么 n 是反向引用。否则，如果 n 是八进制数 (0-7)，那么 n 是八进制转义码。 <BR>\nm 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式，那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获，那么 n 是反向引用，后面跟 m。如果前面的条件均不存在，那么当 n 和 m 是八进制数 (0-7) 时，\nm 匹配八进制转义码 nm。 <BR>\nml 当 n 是八进制数 (0-3)，m 和 l 是八进制数 (0-7) 时，匹配八进制转义码 nml。 <BR>\un 匹配 n，其中 n 是以四位十六进制数表示的 Unicode 字符。例如，\u00A9 匹配版权符号 (?)。 <BR>
<P></P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/bonix/aggbug/22328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bonix/" target="_blank">西元化石</a> 2005-12-03 10:47 <a href="http://www.blogjava.net/bonix/archive/2005/12/03/22328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码检查指南[转]</title><link>http://www.blogjava.net/bonix/archive/2005/12/02/22189.html</link><dc:creator>西元化石</dc:creator><author>西元化石</author><pubDate>Fri, 02 Dec 2005 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/bonix/archive/2005/12/02/22189.html</guid><wfw:comment>http://www.blogjava.net/bonix/comments/22189.html</wfw:comment><comments>http://www.blogjava.net/bonix/archive/2005/12/02/22189.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bonix/comments/commentRss/22189.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bonix/services/trackbacks/22189.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 代码检查对于开发非常重要，一些大规模的应用变得越来越难以维护，往往和代码检查直接相关。对于一个规范的开发过程而言，代码检查是重要但容易被忽视的一个步骤：或者检查不仔细、不认真，或者检查的内容不足。<BR><BR>&nbsp;&nbsp;&nbsp; 代码检查主要包括两个方面：一是设计附合度检查；一是代码逻辑检查。<BR><BR>&nbsp;&nbsp;&nbsp; <SPAN style="FONT-WEIGHT: bold">设计附合度检查</SPAN><BR><BR>&nbsp;&nbsp;&nbsp; 检查代码是否按照设计文档编写。首先需要检查的就是包依赖关系，是否在代码中引入了没有在设计中指定的包？这是最重要的一个检查点，引入了设计中未定义、未指明的包是大规模应用越来越难以维护的直接罪魁祸首之一。设计可能没有考虑到需要附加的包中的类，这是正常的。当编写代码的程序员遇到这种情况时，应该和设计人员沟通，一起来解决这个问题，而不是养成随手增加引入包的习惯。如果每个程序员都这样操作，可以想像一个项目最终会变成什么样子。<BR><BR>&nbsp;&nbsp;&nbsp; 其次，要检查设计中确定的方法的Signature。是否由指定的protected变成了public？是否修改了方法名、调用参数和返回类型？这些细节也可能会违反设计师的初衷，把本来设计师深思熟虑的结果变成考虑不足的代码。这些地方是影响代码微结构的因素之一。<BR><BR>&nbsp;&nbsp;&nbsp; 设计附合度检查一般由设计人员执行。<BR><BR>&nbsp;&nbsp;&nbsp; <SPAN style="FONT-WEIGHT: bold">代码逻辑检查</SPAN><BR><BR>&nbsp;&nbsp;&nbsp; 代码逻辑检查是多数实行代码检查制度的公司重点检查的内容。它检查代码是否存在逻辑上的错误。这项检查的目的是尽早发现并解决潜在的缺陷，一般由有经验的程序员同行执行。<BR><BR>&nbsp;&nbsp;&nbsp; <SPAN style="FONT-WEIGHT: bold">代码检查，我们遗漏了什么？</SPAN><BR><BR>&nbsp;&nbsp;&nbsp; 代码逻辑检查不是代码检查的主要内容，因为在调试、测试阶段逻辑问题基本上都可以被发现。在代码检查阶段检查代码逻辑，目的仅仅是为了<SPAN style="FONT-WEIGHT: bold">降低成本</SPAN>，早发现错误可以大速度降低成本。<BR><BR>&nbsp;&nbsp;&nbsp; 代码检查的真正重点，也是我们忽略的部分，就是设计附合度的检查。任何调试、测试都不能发现这方面的问题，因为它是附合逻辑的；存在设计附合度问题的程序在运行上不会有任何问题，它只是<SPAN style="FONT-WEIGHT: bold">让你的设计变成一堆废物，让你的软件越来越不可维护。<BR><BR></SPAN>&nbsp;&nbsp;&nbsp; 现在你知道了，不要再忽略这个检查了！<img src ="http://www.blogjava.net/bonix/aggbug/22189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bonix/" target="_blank">西元化石</a> 2005-12-02 09:40 <a href="http://www.blogjava.net/bonix/archive/2005/12/02/22189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>反思[转]</title><link>http://www.blogjava.net/bonix/archive/2005/12/02/22188.html</link><dc:creator>西元化石</dc:creator><author>西元化石</author><pubDate>Fri, 02 Dec 2005 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/bonix/archive/2005/12/02/22188.html</guid><wfw:comment>http://www.blogjava.net/bonix/comments/22188.html</wfw:comment><comments>http://www.blogjava.net/bonix/archive/2005/12/02/22188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bonix/comments/commentRss/22188.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bonix/services/trackbacks/22188.html</trackback:ping><description><![CDATA[<DIV class=postText>今天有人对我现在进行项目的几个方面提出了疑问，认为是几点值得考虑的风险，自己在仔细考虑后觉得确实值得反思：<BR>1、为什么要采用hibernate，采用OO设计取代传统数据库设计？<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;觉得这个问题对我而言没什么可值得仔细思考的部分，采用hibernate利大于弊，这点对我而言毫无疑问，一是因为即使不采用hibernate，在代码中仍然要对获取的resultset做转化为对象的步骤，二是hibernate对通用CRUD的良好支持，三是数据库无关性，四是对象关联的支持。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但以提问的人的观点来看，一是他个人对于hibernate并不熟，认为他无法掌控，这就是风险，二是他认为采用hibernate反而增加了项目的实现难度。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 综合自己的观点和提问人的观点来看，觉得在项目中采用什么样的技术才是合适的技术确实是个值得思考的问题，怎么样从可满足项目的多种技术实现方案中进行选择？<BR>2、项目中采用XP是否合适？<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我采用XP被人置疑的地方竟然是项目成员的交流合作问题...... 这点让我挺震惊的，这点我都不知道到底是我做的不对还是被人误解，至少我认为我现在team的交流绝对比一般重型软件过程的团队交流做的好很多很多，早会、迭代会议、不时的讨论等等，这些交流我觉得应该不会差吧，呵呵，不过被人疑问，我觉得至少就说明自己做的仍然不够好。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外竟然还被看成是不做设计直接编码的行为，在这点上我真的是觉得让别人误解了，CRC设计难道不是设计？？？而且我觉得CRC设计绝对是超越传统的那种做详细设计的方法的。<BR>&nbsp;<BR>总而言之，我觉得有人提出疑问是好事，只有这样才能真正仔细的去反思自己的很多做法。<BR><BR>另外，说说关于TDD，觉得自己现在才是真正的做TDD，今天在给一个同事讲的时候真正的自己也去领悟TDD的好处，在写一个对象的实现的时候，通常会在实现的过程漏掉一些边缘性的检测或别的问题，更突出的就是在集成的时候才发现问题，今天在实践的时候突然觉得TDD的好处就在于迫使了开发人员在写一个对象的实现之前仔细的考虑那个方法的功能、边缘性的一些东西，这个时候通过编写测试代码就完全可以体现了，然后再去写实现其实就比较简单了，把握针对测试写实现的原则，更不用说对于集成测试的好处了，呵呵，这样才能发挥XP的很多优点，比如简单设计、重构、持续集成等等。 </DIV><img src ="http://www.blogjava.net/bonix/aggbug/22188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bonix/" target="_blank">西元化石</a> 2005-12-02 09:37 <a href="http://www.blogjava.net/bonix/archive/2005/12/02/22188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>