Java重构面向过程代码_你这是在干嘛? 是在用 Java 来实现 PHP 吗? 记一点点的 Java 代码的重构, 或许说纠正更加恰当...

本次项目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 是世界上最好的语言"呢? 哈哈哈.

晚安.

面向对象编程(OOP)是Java语言的核心,它通过封装、继承、多态等特征来构建程序。理解并运用OOP的五大基本原则—单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则,对于设计一个灵活且可维护的系统至关重要。例如,单一职责原则指出一个类应该只有一个改变的原因,这意味着我们应该将具有不同职责的代码分离到不同的类中。开闭原则要求软件实体应该是开放扩展的,但是对修改是封闭的。里氏替换原则是指所有引用基类的地方必须能够透明地使用其子类对象。接口隔离原则主张使用多个专门的接口,而不是单一的大接口。依赖倒置原则要求高层模块不应该依赖低层模块,两者都应该依赖抽象。 参考资源链接:[Java工程师成神之路:从入门到精通](https://wenku.csdn.net/doc/4tr7403kxh?spm=1055.2569.3001.10343) 针对重构现有代码,这里给出一个简单的示例。假设我们有一个继承自Vehicle类的Car类,它包含多个与行驶相关的方法,如下所示: public class Vehicle { public void drive() { // 实现开车的方法 } } public class Car extends Vehicle { public void drive() { // 实现开车的方法 } } 重构的第一步是识别并分离出不符合单一职责原则的代码。如果Car类除了继承自Vehicle的drive方法,还有其他与行驶无关的方法,比如playMusic(),我们应该将其分离到另一个类中。在重构后,Car类只关注于与行驶相关的行为,而Playable接口可以管理播放音乐的行为: interface Playable { void playMusic(); } class MusicPlayer implements Playable { @Override public void playMusic() { // 实现播放音乐的方法 } } public class Car extends Vehicle implements Playable { public void drive() { // 实现开车的方法 } @Override public void playMusic() { // 实现播放音乐的方法 } } 通过重构,我们不仅使代码更加模块化和清晰,还提高了代码的可复用性和可维护性。在《Java工程师成神之路:从入门到精通》一书中,可以找到更多关于面向对象编程原则和代码重构的深入讨论和实例,这对于Java开发者来是一个宝贵的学习资源。 参考资源链接:[Java工程师成神之路:从入门到精通](https://wenku.csdn.net/doc/4tr7403kxh?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值