本次项目CEO 要求要么用 Go 写, 要么用 Java 写, 我们二选一, 而我对 Go 可谓是完全不懂, 而 Java 呢, 虽然懂语法, 自己折腾过安卓, 但是做服务端开发还真没有经验. 由于我领导是 Java 大牛, 所以我们最后选了 Java 来写. 我领导开了个头, 选了 netty 做框架, 我负责来实现需求. 下面的第一段代码是最开始的写法, 被人嘲笑为是在用 Java 实现 PHP 吗? 不可否认, 我把 Java 的面向对象的特性没有运用起来. 但是同时我也感受到了 PHP 的轻巧灵活. 先上 PHP 风格的 Java 代码:
/**
* 获取一条 feed 的评论
* @param id feed id
* @return
*/
public List> list(int id,int offset,int limit){
List> commentList = new ArrayList>();
ArrayList> commentListTmp = new ArrayList>();
Users users = new Users();
String sql = "select id,uid,atuid,cont,ts from comment where fid=" + id + " order by id desc limit "+ offset + "," + limit;
try{
ResultSet rs = dbUtil.query(sql,0);
while(rs.next()){
HashMap items = new HashMap();
items.put("id", rs.getInt(1));
items.put("user",rs.getInt(3));
items.put("sbj", users.getInfoWithIcon(rs.getInt(2)));
items.put("cont",rs.getString(4));
items.put("ts", rs.getInt(5));
commentList.add(items);
}
}catch (Exception e) {
e.printStackTrace();
}finally {
dbUtil.close();
}
return commentList;
}
上面是我写的一个feed的分页model, 基本上我的做法就是HashMap里面套用HashMap, 要么中间再用ArrayList搭个桥,总之就是在实现 PHP 里的数组的功能. SQL 也没用使用 PDO 的方式. 后来经过好友@曾明明的指点, 最好是把这种对数据的操作单独写成一个工具类, 而数据模型本身应该是一个bean类, 只暴露给外部set/get即可.然后用那个工具类去操作这个bean模型.
private static String getCommentListSql = "select id,uid,atuid,cont,ts from comment where fid=? order by id desc limit ?,?";
public List commentList(int feedId,int offset,int limit){
List commentList = new ArrayList();
Connection conn=null;
PreparedStatement statement=null;
try {
conn = DBUtils.getConnection();
statement=conn.prepareStatement(getCommentListSql);
statement.setInt(1, feedId);
statement.setInt(2, offset);
statement.setInt(3, limit);
ResultSet rs = statement.executeQuery();
while (rs.next()){
Comment comment = new Comment();
comment.setId(rs.getInt(1));
comment.setCont(rs.getString(4));
comment.setTs(rs.getInt(5));
int commentUserId = rs.getInt(2);
Users user = new Users();
User sbj = user.getUserInfo(commentUserId);
comment.setSbj(sbj);
int atUserId = rs.getInt(3);
User atSomeBody = user.getUserInfo(atUserId);
comment.setUser(atSomeBody);
commentList.add(comment);
}
}catch (SQLException e){
e.printStackTrace();
}finally {
DBUtils.closeConnection(statement,conn);
}
return commentList;
}
能用对象表示的, 我都用对象表示了. 这样不仅条理清晰, 代码重用性更高, 而且其他人看也能够清晰的看出来这个方法实现了什么功能.
通过近两周的 Java 后端的开发, 让我对 Java 有了一些入门的认识. 也感受到了 Java 和 PHP 之前巨大的差异. 在有一些比较怪的接口上, 不能用一个对象的思想来解释的时候, 我还是选择了HashMap来拼装, 而不是非得死套创建一个bean文件( 当然这种情况在本次开发中仅有一个 ). 之前用 PHP 写的接口更多是在面对对象的框架里写着面向过程的代码, 而 Java 里则是真正的一门面向对象的语言. 没有谁更好一说. 各有各的优势, 不然那么多人说"PHP 是世界上最好的语言"呢? 哈哈哈.
晚安.