锁定老帖子 主题:让人头疼的新手
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-13
敢SHOW就敢挨砖头,这些只是解析一个报文的局部,不想占用太大篇幅,只是对字符串及数组,二进制的操作.非得涉及什么SQL,JDBC或者某某opensource你才觉得是高深?那些也未必不是不会呀.
我也就工作三个月,写了一个月代码.随便你们怎么说了,但至少没那么可笑的错误. 我只想说明应届生不是都像LZ说的那样罢了,让我去写LZ的程序,我不会出这样的错. |
|
返回顶楼 | |
发表时间:2008-05-13
mylifestyle1225 写道 String sql = "";
if (sql != null) 哈哈哈哈哈..... 我也07年7月份毕业,工作也就3个月,但也不至于这么糊涂.另外,小晒一下刚写完代码. public Map<Integer, String> getFields(String message) throws UnsupportedEncodingException { // TODO Auto-generated method stub BitSet bitMap=new BitSet(); boolean isExtend=false; Map<Integer,String> fields=new HashMap<Integer,String>();//用来存放报文标识类型(key=0),位图(key=1),2-128个域(key=2--key=128) byte[] all = message.getBytes("ISO-8859-1");//把字符串转成byte[] byte[] messageType=new byte[4];//存放报文类型标识符的byte[] for(int i=0;i<4;i++){ messageType[i]=all[i]; } fields.put(0, new String(messageType,"ISO-8859-1"));//放入Map<Integer,String> fields if(all[4]<0){//如果有扩展位图 isExtend=true; } //初始化基本位图,根据检索基本位图的8个字节的二进制的结果(第4-11字节),把bitMap的32位到95位设置成true(1)或者false(0), int count=4; while(count<12&&count>3){ byte each=all[count]; count++; for(int i=0;i<8;i++){ if(getValue(each,i)){//如果返回true,即二进制上是1,把该bit位设置成true,默认为false bitMap.set((count-1)*8+i,true); } } } //如果有扩展位图,初始化扩展位图,根据检索扩展位图的8个字节的二进制的结果(第12-19字节),bitMap的96-153,设置成true(1)或者false(0) if(isExtend){ while(count>11&&count<20){ byte each=all[count]; count++; for(int i=0;i<8;i++){ if(getValue(each,i)){ bitMap.set((count-1)*8+i,true);//如果返回true,即二进制上是1,把该bit位设置成true,默认为false } } } } /*测试位图 for(int z=32;z<bitMap.size();z++){ if(bitMap.get(z)){ System.out.println(z); } }*/ System.out.println("位图初始化完成"); //初始化位图完成,开始读取数据,i=1表示从bitMap的第2个位置开始循环读取。 if(isExtend){ int currentByte=20; for(int i=32;i<161;i++){ currentByte=putFields(fields,currentByte,bitMap,i,all); fields.put(1, "1"); } }else{ int currentByte=12; for(int i=32;i<161;i++){ currentByte=putFields(fields,currentByte,bitMap,i,all); fields.put(1, "0"); } } return fields; } //检索一个byte二进制中对应位置上的值的方法,返回false表示"0",true表示"1"; 参数int index取0-7,a取[-128到127] public boolean getValue(byte a,int index){ //把一个byte转换成类似"01000000"的形式,并用一个String的值表示 String a_binary; if(a>-1&&a<128){ int i=a|256; String is=Integer.toString(i, 2); a_binary=is.substring(1, 9); }else{ int i=(-a)|256; String is=Integer.toString(i, 2); a_binary="1"+is.substring(2, 9); } if(a_binary.substring(index,index+1).equals("0")){ return false; }else{ return true; } } 用我们公司的代码标准来批判一下这份代码: 1、函数前没有符合JavaDoc标准的注释,-5分; 2、函数名不知道要表达什么意思,-5分; 3、注释是中文而不是英文,-2分; 。。。。。。 |
|
返回顶楼 | |
发表时间:2008-05-13
注释我写了...没复制过来而已.你再给我+5分吧.
第2,3条我没异议,扣吧.. 纠正下,我刚写完,还没上交了.但测试完了. |
|
返回顶楼 | |
发表时间:2008-05-13
不过还是谢谢指点,我会改成英文的.然后把名字改得尽量意义明确些.
|
|
返回顶楼 | |
发表时间:2008-05-13
mylifestyle1225 写道 不过还是谢谢指点,我会改成英文的.然后把名字改得尽量意义明确些.
如果不是对美外包的项目的话,为什么非要用英语写注释 |
|
返回顶楼 | |
发表时间:2008-05-13
armorking 写道 mylifestyle1225 写道 不过还是谢谢指点,我会改成英文的.然后把名字改得尽量意义明确些.
如果不是对美外包的项目的话,为什么非要用英语写注释 恩,是不是对美外包的,这是个金融报文的解析和生成,所以自然没什么SQL,JDBC,SPRING等东东了. 有道理,注释的作用本来就是为了让人看懂. |
|
返回顶楼 | |
发表时间:2008-05-13
colin4k 写道 mylifestyle1225 写道 String sql = "";
if (sql != null) 哈哈哈哈哈..... 我也07年7月份毕业,工作也就3个月,但也不至于这么糊涂.另外,小晒一下刚写完代码. public Map<Integer, String> getFields(String message) throws UnsupportedEncodingException { // TODO Auto-generated method stub BitSet bitMap=new BitSet(); boolean isExtend=false; Map<Integer,String> fields=new HashMap<Integer,String>();//用来存放报文标识类型(key=0),位图(key=1),2-128个域(key=2--key=128) byte[] all = message.getBytes("ISO-8859-1");//把字符串转成byte[] byte[] messageType=new byte[4];//存放报文类型标识符的byte[] for(int i=0;i<4;i++){ messageType[i]=all[i]; } fields.put(0, new String(messageType,"ISO-8859-1"));//放入Map<Integer,String> fields if(all[4]<0){//如果有扩展位图 isExtend=true; } //初始化基本位图,根据检索基本位图的8个字节的二进制的结果(第4-11字节),把bitMap的32位到95位设置成true(1)或者false(0), int count=4; while(count<12&&count>3){ byte each=all[count]; count++; for(int i=0;i<8;i++){ if(getValue(each,i)){//如果返回true,即二进制上是1,把该bit位设置成true,默认为false bitMap.set((count-1)*8+i,true); } } } //如果有扩展位图,初始化扩展位图,根据检索扩展位图的8个字节的二进制的结果(第12-19字节),bitMap的96-153,设置成true(1)或者false(0) if(isExtend){ while(count>11&&count<20){ byte each=all[count]; count++; for(int i=0;i<8;i++){ if(getValue(each,i)){ bitMap.set((count-1)*8+i,true);//如果返回true,即二进制上是1,把该bit位设置成true,默认为false } } } } /*测试位图 for(int z=32;z<bitMap.size();z++){ if(bitMap.get(z)){ System.out.println(z); } }*/ System.out.println("位图初始化完成"); //初始化位图完成,开始读取数据,i=1表示从bitMap的第2个位置开始循环读取。 if(isExtend){ int currentByte=20; for(int i=32;i<161;i++){ currentByte=putFields(fields,currentByte,bitMap,i,all); fields.put(1, "1"); } }else{ int currentByte=12; for(int i=32;i<161;i++){ currentByte=putFields(fields,currentByte,bitMap,i,all); fields.put(1, "0"); } } return fields; } //检索一个byte二进制中对应位置上的值的方法,返回false表示"0",true表示"1"; 参数int index取0-7,a取[-128到127] public boolean getValue(byte a,int index){ //把一个byte转换成类似"01000000"的形式,并用一个String的值表示 String a_binary; if(a>-1&&a<128){ int i=a|256; String is=Integer.toString(i, 2); a_binary=is.substring(1, 9); }else{ int i=(-a)|256; String is=Integer.toString(i, 2); a_binary="1"+is.substring(2, 9); } if(a_binary.substring(index,index+1).equals("0")){ return false; }else{ return true; } } 用我们公司的代码标准来批判一下这份代码: 1、函数前没有符合JavaDoc标准的注释,-5分; 2、函数名不知道要表达什么意思,-5分; 3、注释是中文而不是英文,-2分; 。。。。。。 magic number竟然可以这么滥用... ...中文注释... .... 一个几十行的函数。 if else不同的分支里执行的代码有相同的内容。 说你代码滥,冤枉你了? |
|
返回顶楼 | |
发表时间:2008-05-13
if else中的确该优化下,赶时间了.我已经把相同的抽象出来了.谢谢指点了.不过LS也来优化一下吧,然后把代码贴出来,指导下新人.别指说不做,牛人不是用嘴吹的.
|
|
返回顶楼 | |
发表时间:2008-05-13
一些应届生的问题都看见了,怎么解决呢?
不招应届生,或者找符合条件的来用。但找不到有经验的或者符合条件的呢? |
|
返回顶楼 | |
发表时间:2008-05-13
英文注释是为了确保不会因为encode等原因导致乱码
|
|
返回顶楼 | |