﻿<?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-Java Stop Here-随笔分类-Coding Review</title><link>http://www.blogjava.net/faithwind/category/17921.html</link><description>Love Java ,because you are my first lady !^_^</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:21:08 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:21:08 GMT</pubDate><ttl>60</ttl><item><title>【原】Good disign , good code !</title><link>http://www.blogjava.net/faithwind/archive/2006/12/01/84759.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Fri, 01 Dec 2006 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/12/01/84759.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/84759.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/12/01/84759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/84759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/84759.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 下面的代码表现出使用set 带来的好处。  1public class TaskTemplate {  2    private String id;  3    private String title;  4    private String detail;  5      6    private Set&lt;TaskTemplate&gt; preconditions;  7    p...&nbsp;&nbsp;<a href='http://www.blogjava.net/faithwind/archive/2006/12/01/84759.html'>阅读全文</a><img src ="http://www.blogjava.net/faithwind/aggbug/84759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-12-01 10:25 <a href="http://www.blogjava.net/faithwind/archive/2006/12/01/84759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】由代码看编程思想</title><link>http://www.blogjava.net/faithwind/archive/2006/12/01/84752.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Fri, 01 Dec 2006 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/12/01/84752.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/84752.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/12/01/84752.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/84752.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/84752.html</trackback:ping><description><![CDATA[Coding 生涯已经有1年4个月了，虽然比较熟悉公司框架，用起来还比较熟练，但是回头想想，其实自己还是停留在新手阶段，与刚出学校的那些“大侠”们不相上下。特别是昨天看到我们的CTO－BridGu(相信去过javaeye的朋友没有不知道这个名字的吧)给我改写的一段程序以后，感觉自己的程序是那么的幼稚。丝毫没有professional的感觉，很是惭愧！<br />这个功能是一个解析String生成function的功能，当然格式要求非常严格的，而且格式验证也是一个不可缺少，而且是非常重要的环节。<br />不知道你看到这个功能脑子里面想到是什么样的解决方案呢？我没有多想，拿起来就当String来处理，split, substring etc. <br /><br />看看程序吧：<br />下面是我的方法，暂且说是方法吧：<br /><div> 1<em><em>    public void addFunction(String prototype,Long comId)throws AlpineException<em>{<br /> 2<em>        ModDao dao = (ModDao)this.getDao("modDao");<br /> 3<em>        Components com = this.findByPrimaryKey(Components.class, comId);<br /> 4<em>        Functions function = new Functions();<br /> 5<em>        function.setComponent(com);<br /> 6<em>        prototype = delDupSpace(prototype);<br /> 7<em>        String[] funTtemp = prototype.split("\n");<br /> 8<em>        String fun = funTtemp[0];<br /> 9<em><em>        if(fun.indexOf("(") == -1||fun.indexOf(")") == -1)<em>{<br />10<em>            throw new AlpineException(ErrorCode.FUNCTION_FORMAT_ERROR);<br />11<em>        }<br />12<em>        String funHead = fun.substring(0,fun.indexOf("("));<br />13<em>        String[] typeAndHead = funHead.split(" ");<br />14<em><em>        if(typeAndHead.length &lt; 1)<em>{<br />15<em>            throw new AlpineException(ErrorCode.FUNCTION_FORMAT_ERROR);<br />16<em><em>        }else<em>{<br />17<em><em>            if(typeAndHead.length &gt;1)<em>{<br />18<em>                function.setReturnType(typeAndHead[0]);<br />19<em>                function.setFunctionName(typeAndHead[typeAndHead.length-1]);<br />20<em><em>            }else<em>{<br />21<em>                function.setReturnType("void");<br />22<em>                function.setFunctionName(typeAndHead[0]);<br />23<em>            }<br />24<em><em>            if(fun.indexOf("//") != -1)<em>{<br />25<em>                String exp = fun.substring(fun.indexOf(";")+1);<br />26<em>                exp = exp.replaceAll("&amp;#13;", "");<br />27<em>                function.setExplanation(exp);<br />28<em>            }<br />29<em>            this.insert(function);<br />30<em>    <br />31<em>            String paStr = fun.substring(fun.indexOf("(")+1, fun.indexOf(")"));<br />32<em><em>            if(!StringHelper.isEmpty(paStr))<em>{<br />33<em>                String[] pas = paStr.split(",");<br />34<em><em>                for (int i = 0; i &lt; pas.length; i++) <em>{<br />35<em>                    Parameters parameter = new Parameters();<br />36<em>                    String[] pars = pas[i].split(" ");<br />37<em><em>                    if(pars.length &lt; 2 || pars.length &gt; 3)<em>{<br />38<em>                        throw new AlpineException(ErrorCode.FUNCTION_FORMAT_ERROR);<br />39<em><em>                    }else<em>{<br />40<em><em>                        if(pars.length == 2)<em>{<br />41<em>                            Parameters paDup = dao.getParameterByPaName(pars[1], function.getId());<br />42<em>                            if(paDup != null)<br />43<em>                                throw new AlpineException(ErrorCode.FUNCTION_FORMAT_ERROR);<br />44<em>                                <br />45<em>                            parameter.setParameterName(pars[1]);<br />46<em>                            parameter.setParameterType(pars[0]);<br />47<em>                            parameter.setInOrOut("In");<br />48<em>                        }<br />49<em><em>                        if(pars.length == 3)<em>{<br />50<em>                            Parameters paDup = dao.getParameterByPaName(pars[2], function.getId());<br />51<em>                            if(paDup != null)<br />52<em>                                throw new AlpineException(ErrorCode.FUNCTION_FORMAT_ERROR);<br />53<em>                            <br />54<em>                            parameter.setParameterName(pars[2]);<br />55<em>                            parameter.setParameterType(pars[1]);<br />56<em>                            if(pars[0].contains("In"))<br />57<em>                                parameter.setInOrOut("In");<br />58<em>                            if(pars[0].contains("Out"))<br />59<em>                                parameter.setInOrOut("Out");<br />60<em>                        }<br />61<em>                        parameter.setFunction(function);<br />62<em>                        this.insert(parameter);<br />63<em>                        parameter.setOrderF(parameter.getId());<br />64<em>                        this.update(parameter);<br />65<em>                    }<br />66<em>                }<br />67<em>            }<br />68<em>            <br />69<em><em>            for (int i = 1; i &lt; funTtemp.length; i++) <em>{//start 1<br />70<em>                String[] paTemp = funTtemp[i].split(":");<br />71<em><em>                if(paTemp.length == 2)<em>{<br />72<em>                    Parameters parameter = dao.getParameterByPaName(paTemp[0].trim(),function.getId());<br />73<em><em>                    if(parameter != null)<em>{<br />74<em>                        parameter.setExplanation(paTemp[1]);<br />75<em>                        this.update(parameter);<br />76<em>                    }<br />77<em>                }<br />78<em>            }<br />79<em>        }<br />80<em>    }</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></div>以下是BirdGu的方案：<br /><div>  1<em><em>public class FunctionParser <em>{<br />  2<em><em>    public static class Token <em>{<br />  3<em>        private TokenType type;<br />  4<em>        private String content;<br />  5<em><em>        public Token(TokenType type, String content) <em>{<br />  6<em>            super();<br />  7<em>            this.type = type;<br />  8<em>            this.content = content;<br />  9<em>        }<br /> 10<em><em>        public String getContent() <em>{<br /> 11<em>            return content;<br /> 12<em>        }<br /> 13<em><em>        public TokenType getType() <em>{<br /> 14<em>            return type;<br /> 15<em>        }<br /> 16<em>        <br /> 17<em>        <br /> 18<em>    }<br /> 19<em>    <br /> 20<em><em>    private enum TokenType <em>{symbol, leftParenthese, rightParenthese, inOutFlag, comment, comma};<br /> 21<em><em>    private enum TokenParseStatus <em>{start, inSymbol, comment1, inOutFlag};<br /> 22<em><br /> 23<em><em>    private interface ParseStatus <em>{<br /> 24<em>        public ParseStatus process (Functions function, Token token, Stack&lt;String&gt; symbolStack)<br /> 25<em>        throws InvalidSyntaxException;<br /> 26<em>    }<br /> 27<em>    <br /> 28<em><em>    private static final ParseStatus START = new ParseStatus() <em>{<br /> 29<em>        public ParseStatus process(Functions function, Token token, Stack&lt;String&gt; symbolStack)<br /> 30<em><em>        throws InvalidSyntaxException <em>{<br /> 31<em><em>            if (token.getType() == TokenType.symbol) <em>{<br /> 32<em>                symbolStack.push(token.getContent());<br /> 33<em>                return GOT_FIRST_SYMBOL;<br /> 34<em>            } <br /> 35<em>            throw new InvalidSyntaxException (token);<br /> 36<em>        }<br /> 37<em>    };<br /> 38<em>    <br /> 39<em><em>    private static final ParseStatus GOT_FIRST_SYMBOL = new ParseStatus () <em>{<br /> 40<em><em>        public ParseStatus process(Functions function, Token token, Stack&lt;String&gt; symbolStack) throws InvalidSyntaxException <em>{<br /> 41<em><em>            if (token.getType() == TokenType.leftParenthese) <em>{<br /> 42<em>                function.setReturnType("void");<br /> 43<em>                function.setFunctionName(symbolStack.pop());<br /> 44<em>                return WAITING_FIRST_ARG;<br /> 45<em><em>            } else if (token.getType() == TokenType.symbol) <em>{<br /> 46<em>                function.setFunctionName(token.getContent());<br /> 47<em>                function.setReturnType(symbolStack.pop());<br /> 48<em>                return BEFORE_ARG_DEF;<br /> 49<em>            } <br /> 50<em>            throw new InvalidSyntaxException (token);<br /> 51<em>        }<br /> 52<em>    };<br /> 53<em>    <br /> 54<em><em>    private static final ParseStatus BEFORE_ARG_DEF = new ParseStatus () <em>{<br /> 55<em><em>        public ParseStatus process(Functions function, Token token, Stack&lt;String&gt; symbolStack) throws InvalidSyntaxException <em>{<br /> 56<em><em>            if (token.getType() == TokenType.leftParenthese) <em>{<br /> 57<em>                return WAITING_FIRST_ARG;<br /> 58<em>            }<br /> 59<em>            throw new InvalidSyntaxException (token);<br /> 60<em>        }<br /> 61<em>    };<br /> 62<em>    <br /> 63<em><em>    private static final ParseStatus WAITING_FIRST_ARG = new ParseStatus () <em>{<br /> 64<em><br /> 65<em><em>        public ParseStatus process(Functions function, Token token, Stack&lt;String&gt; symbolStack) throws InvalidSyntaxException <em>{<br /> 66<em><em>            if (token.getType() == TokenType.rightParenthese) <em>{<br /> 67<em>                return AFTER_ARG_DEF;<br /> 68<em><em>            } else if (token.getType() == TokenType.symbol) <em>{<br /> 69<em>                symbolStack.push(token.getContent());<br /> 70<em>                return GOT_ARG_TYPE;<br /> 71<em><em>            } else if (token.getType() == TokenType.inOutFlag) <em>{<br /> 72<em>                symbolStack.push (token.getContent());<br /> 73<em>                return GOT_IN_OUT_FLAG;<br /> 74<em>            }<br /> 75<em>            throw new InvalidSyntaxException (token);    <br /> 76<em>        }<br /> 77<em>    };<br /> 78<em>    <br /> 79<em><em>    private static final ParseStatus GOT_IN_OUT_FLAG = new ParseStatus () <em>{<br /> 80<em><em>        public ParseStatus process(Functions function, Token token, Stack&lt;String&gt; symbolStack) throws InvalidSyntaxException <em>{<br /> 81<em><em>            if (token.getType() == TokenType.symbol) <em>{<br /> 82<em>                symbolStack.push(token.getContent());<br /> 83<em>                return GOT_ARG_TYPE;<br /> 84<em>            }<br /> 85<em>            throw new InvalidSyntaxException (token);    <br /> 86<em>        }<br /> 87<em>    };<br /> 88<em>    <br /> 89<em><em>    private static final ParseStatus GOT_ARG_TYPE = new ParseStatus () <em>{<br /> 90<em><em>        public ParseStatus process(Functions function, Token token, Stack&lt;String&gt; symbolStack) throws InvalidSyntaxException <em>{<br /> 91<em><em>            if (token.getType() == TokenType.symbol) <em>{<br /> 92<em>                Parameters param = new Parameters ();<br /> 93<em>                param.setParameterName(token.getContent());<br /> 94<em>                param.setParameterType(symbolStack.pop());<br /> 95<em>                String inOutFlag = "In";<br /> 96<em><em>                if (!symbolStack.isEmpty()) <em>{<br /> 97<em>                    inOutFlag = symbolStack.pop();<br /> 98<em>                }<br /> 99<em>                param.setInOrOut(inOutFlag);<br />100<em>                function.adParameter(param);<br />101<em>                return GOT_ARG_VALUE;<br />102<em>            }<br />103<em>            throw new InvalidSyntaxException (token);    <br />104<em>        }<br />105<em>    };<br />106<em>    <br />107<em><em>    private static final ParseStatus GOT_ARG_VALUE = new ParseStatus () <em>{<br />108<em><em>        public ParseStatus process(Functions function, Token token, Stack&lt;String&gt; symbolStack) throws InvalidSyntaxException <em>{<br />109<em><em>            if (token.getType() == TokenType.rightParenthese) <em>{<br />110<em>                return AFTER_ARG_DEF;<br />111<em><em>            } else if (token.getType() == TokenType.comma) <em>{<br />112<em>                return WAITING_ARG;<br />113<em>            }<br />114<em>            throw new InvalidSyntaxException (token);    <br />115<em>        }<br />116<em>    };<br />117<em>    <br />118<em><em>    private static final ParseStatus WAITING_ARG = new ParseStatus () <em>{<br />119<em><em>        public ParseStatus process(Functions function, Token token, Stack&lt;String&gt; symbolStack) throws InvalidSyntaxException <em>{<br />120<em><em>            if (token.getType() == TokenType.symbol) <em>{<br />121<em>                symbolStack.push(token.getContent());<br />122<em>                return GOT_ARG_TYPE;<br />123<em><em>            } else if(token.getType() == TokenType.inOutFlag) <em>{<br />124<em>                symbolStack.push(token.getContent());<br />125<em>                return GOT_IN_OUT_FLAG;<br />126<em>            }<br />127<em>            return null;<br />128<em>        }<br />129<em>    };<br />130<em>    <br />131<em><em>    private static final ParseStatus AFTER_ARG_DEF = new ParseStatus () <em>{<br />132<em><em>        public ParseStatus process(Functions function, Token token, Stack&lt;String&gt; symbolStack) throws InvalidSyntaxException <em>{<br />133<em><em>            if (token.getType() == TokenType.comment) <em>{<br />134<em>                function.setExplanation(token.getContent());<br />135<em>                return END;<br />136<em>            }<br />137<em>            throw new InvalidSyntaxException (token);<br />138<em>        }<br />139<em>    };<br />140<em>    <br />141<em><em>    private static final ParseStatus END = new ParseStatus () <em>{<br />142<em><em>        public ParseStatus process(Functions function, Token token, Stack&lt;String&gt; symbolStack) throws InvalidSyntaxException <em>{<br />143<em>            throw new InvalidSyntaxException (token);<br />144<em>        }<br />145<em>    };<br />146<em>    <br />147<em>    private StringBuffer currentLine;<br />148<em>    private int index;<br />149<em>    private Functions function;<br />150<em>    <br />151<em><em>    public Functions parse(String content) throws InvalidSyntaxException <em>{<br />152<em><em>        if (StringHelper.isEmpty(content)) <em>{<br />153<em>            throw new IllegalArgumentException ("content is empty.");<br />154<em>        }<br />155<em>        StringTokenizer tokenizer = new StringTokenizer (content, "\n");<br />156<em>        String line = tokenizer.nextToken();<br />157<em>        parseFirstLine (line);<br />158<em><em>        while (tokenizer.hasMoreTokens()) <em>{<br />159<em>            line = tokenizer.nextToken();<br />160<em>            parseParamLine (line);<br />161<em>        }<br />162<em>        return function;<br />163<em>    }<br />164<em>    <br />165<em><em>    private void parseFirstLine (String line) throws InvalidSyntaxException <em>{<br />166<em>        currentLine = new StringBuffer (line);<br />167<em>        index = 0;<br />168<em>        function = new Functions ();<br />169<em>        Token token;<br />170<em>        ParseStatus status = START;<br />171<em>        Stack&lt;String&gt; stack = new Stack&lt;String&gt; ();<br />172<em><em>        while ( (token = nextToken()) != null) <em>{<br />173<em>            status = status.process(function, token, stack);<br />174<em>        }<br />175<em>        if (status != AFTER_ARG_DEF &amp;&amp; status != END) <br />176<em>            throw new InvalidSyntaxException ("Function hasn't finished properly.");<br />177<em>    }<br />178<em><br />179<em>    private void parseParamLine (String line) <br />180<em><em>    throws InvalidSyntaxException <em>{<br />181<em>        int idx = line.indexOf(':');<br />182<em><em>        if (idx &lt; 0) <em>{<br />183<em>            throw new InvalidSyntaxException ("Expected ':' from parameter line.");<br />184<em>        }<br />185<em>        String paramName = line.substring(0, idx);<br />186<em>        String comment = line.substring(idx + 1);<br />187<em>        Parameters param = function.getParameter (paramName);<br />188<em>        if (paramName == null)<br />189<em>            throw new InvalidSyntaxException ("Unknown parameter:'paramName'");<br />190<em>        param.setExplanation(comment);<br />191<em>    }<br />192<em>    <br />193<em><em>    private Token nextToken () throws InvalidSyntaxException <em>{<br />194<em>        if (index &gt;= currentLine.length())<br />195<em>            return null;<br />196<em>        StringBuffer buf = new StringBuffer ();<br />197<em>        TokenParseStatus status = TokenParseStatus.start;<br />198<em><em>        while (index &lt; currentLine.length ()) <em>{<br />199<em>            char ch = currentLine.charAt(index);<br />200<em><em>            if (status == TokenParseStatus.start) <em>{<br />201<em><em>                if (isSymbolLetter(ch)) <em>{<br />202<em>                    status = TokenParseStatus.inSymbol;<br />203<em>                    buf.append(ch);<br />204<em>                    ++ index;<br />205<em><em>                } else if (ch == '(') <em>{<br />206<em>                    ++ index;<br />207<em>                    return new Token (TokenType.leftParenthese, "(");<br />208<em><em>                } else if (ch == ')') <em>{<br />209<em>                    ++ index;<br />210<em>                    return new Token (TokenType.rightParenthese, ")");<br />211<em><em>                } else if (ch == ',') <em>{<br />212<em>                    ++ index;<br />213<em>                    return new Token (TokenType.comma, ",");<br />214<em><em>                } else if (ch == ' ' || ch == '\t') <em>{<br />215<em>                    ++ index;<br />216<em><em>                } else if (ch == '[') <em>{<br />217<em>                    status = TokenParseStatus.inOutFlag;<br />218<em>                    ++ index;<br />219<em><em>                } else if (ch == ';') <em>{<br />220<em>                    ++ index;<br />221<em>                    String str = currentLine.substring(index);<br />222<em>                    index = currentLine.length();<br />223<em>                    return new Token (TokenType.comment, str);<br />224<em><em>                } else <em>{<br />225<em>                    throw new InvalidSyntaxException ("Enexpected character: " + ch);<br />226<em>                }<br />227<em><em>            } else if (status == TokenParseStatus.inSymbol) <em>{<br />228<em><em>                if (isSymbolLetter(ch)) <em>{<br />229<em>                    buf.append(ch);<br />230<em>                    ++ index;<br />231<em><em>                } else <em>{<br />232<em>                    return new Token (TokenType.symbol, buf.toString());<br />233<em>                } <br />234<em><em>            } else if (status == TokenParseStatus.inOutFlag) <em>{<br />235<em><em>                if (isSymbolLetter(ch)) <em>{<br />236<em>                    buf.append (ch);<br />237<em>                    ++ index;<br />238<em><em>                } else if ( ch == ']') <em>{<br />239<em>                    ++ index;<br />240<em>                    String str = buf.toString ();<br />241<em><em>                    if (! ("In".equals(str) || "Out".equals(str))) <em>{<br />242<em>                        throw new InvalidSyntaxException ("Invalid in/out flag.");<br />243<em>                    }<br />244<em>                    return new Token (TokenType.inOutFlag, str);<br />245<em>                }<br />246<em>            }<br />247<em>        }<br />248<em><em>        if (status == TokenParseStatus.inSymbol) <em>{<br />249<em>            return new Token (TokenType.symbol, buf.toString());<br />250<em>        }<br />251<em>        return null;<br />252<em>    }<br />253<em><br />254<em><em>    private boolean isSymbolLetter(char ch) <em>{<br />255<em>        return Character.isLetter(ch) || Character.isDigit(ch);<br />256<em>    }<br />257<em>}</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></div><br />相比之下，第一种方法相形见绌。<br />想必这也是很多“大鸟”找不到合适人选的原因吧。<br />上面两种方法不用多说，大家一看就知道好在哪里，同时还是编程思想的截然不同。<img src ="http://www.blogjava.net/faithwind/aggbug/84752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-12-01 10:13 <a href="http://www.blogjava.net/faithwind/archive/2006/12/01/84752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>