选取问题:
我的github : https://github.com/wukunguang
复审自己的或者别人的代码,找出一些问题。
就拿我写过一个项目的一个功能片段来说吧。由于当时是自己第一次使用Spring。。而且只会Spring MVC框架。所以对有些Spring 特性还不是很了解。
审查代码地址:
https://github.com/wukunguang/wechat_Sky31/blob/master/src/dao/WallDao.java
首先大体看一遍。对于第一个方法,我只描述了这个方法的功能,对返回参数没进行解释。
代码清单:
/** * 本方法用于获取微信墙事件的列表。 * @return */ public List<Wallmain> getWallList(){ Connection conn = DBConnection.getConnection(); ResultSet rs = null; List<Wallmain> wallmainList = null; if (conn!=null){ try { Statement statement = conn.createStatement(); rs = statement.executeQuery("SELECT * FROM wallmain"); wallmainList = new ArrayList<Wallmain>(); while (rs.next()){ Wallmain wallmain = new Wallmain(); wallmain.setW_id(rs.getInt("w_id") + ""); wallmain.setCoverurl(rs.getString("coverurl")); wallmain.setTitle(rs.getString("title")); wallmainList.add(wallmain); } } catch (SQLException e) { e.printStackTrace(); wallmainList = null; } finally { DBConnection.closeConn(conn); } } return wallmainList; }
而且还有一点,就是捕获异常时候,没有进行日志打印。这也是很不好的一个习惯。待工程部署后,遇到问题不能准确地定位问题来源。
第二个方法。
/** * 本方法用于通过wid获取当前事件的详细内容。 * @param wid * @return */ public Wallmain getWallmainByWid(String wid){ Connection conn = DBConnection.getConnection(); ResultSet rs = null; Wallmain wallmain = null; if (conn!=null){ try { Statement statement = conn.createStatement(); rs = statement.executeQuery("SELECT * FROM wallmain WHERE w_id = "+wid); while (rs.next()){ wallmain = new Wallmain(); wallmain.setTitle(rs.getString("title")); wallmain.setW_id(rs.getInt("w_id") + ""); wallmain.setCoverurl(rs.getString("coverurl")); wallmain.setWallContentBean(getWallContentListByWid(wid)); } } catch (SQLException e) { e.printStackTrace(); } finally { DBConnection.closeConn(conn); } } return wallmain; }
这里没对传入参数进行解释。由于这个项目是我一个人全部写完的。所以当这个项目是多人合作时候,就会发生交接上的问题。。就是传入参数意义不明。。对交接工作产生不好的影响。
/** * * @param wid * @param wcb * @return */ public boolean writeWallContent2DB(String wid, WallContentBean wcb){ Connection conn = DBConnection.getConnection(); boolean isWrite = false; if (conn == null){ return false; } try { PreparedStatement prep = conn.prepareStatement("INSERT INTO wallcontent(nickname, user_id, " + "headimgurl, textcontent, isshow,time) VALUES (?,?,?,?,?,?)" ,PreparedStatement.RETURN_GENERATED_KEYS); if (prep!=null){ prep.setString(1, wcb.getNickname()); prep.setString(2, wcb.getUser_id()); prep.setString(3, wcb.getHeadimgurl()); prep.setString(4,wcb.getTextcontent()); prep.setInt(5,0); prep.setString(6,wcb.getTime()); prep.executeUpdate(); isWrite = true; ResultSet rs = prep.getGeneratedKeys(); if (rs.next()){ final int CUSTOMER_ID_COLUMN_INDEX = 1; int cIndex = rs.getInt(CUSTOMER_ID_COLUMN_INDEX); wcb.setC_id(cIndex); isWrite = isWrite && writeWallCache2DB(wid,wcb); } } } catch (SQLException e) { e.printStackTrace(); isWrite = false; } finally { DBConnection.closeConn(conn); } return isWrite; }
关于这段:
首先当时的想法是创建预处理语句。这样能比较有效的防止SQL拼接的注入攻击。当然这样的问题也是很明显。就是这里依然没有说明参数和返回值说明。
====================================================
总结:由于代码都是自己写的,所以都是给自己看的。那么自己也就少打了很多注释,但是自我感觉现在这个习惯应该要改正。因为以后的项目基本都是团队项目。所以以后的代码中要写明注释。写有质量的注释。