首页 > 学院 > 开发设计 > 正文

避免重复代码

2019-11-08 01:52:05
字体:
来源:转载
供稿:网友

最近大家都在忙着改BUG,而我却比较闲,开发的模块没有什么BUG,决定抽些时间改下正在开发项目中的一些坏代码。

//坏代码 SC_ResponseMsgPRoto.Builder responseMsgBuilder = SC_ResponseMsgProto.newBuilder();//重复一 DataMsgProto.Builder dataMsgBuilder = DataMsgProto.newBuilder();//重复二 dataMsgBuilder.setB(b.build()); responseMsgBuilder.setDataMsg(dataMsgBuilder.build());//重复三 responseMsgBuilder.setA(a.build()); sendMsgToClient(channel, responseMsgBuilder.build());//重复四 message SC_ResponseMsgProto { optional A a = 1; optional B b = 2;} message A { optional int32 num = 1; optional C c = 2;} message B { optional int32 num = 1;} message C { optional int32 num = 1;}

项目客户端和服务器采用的是Google的protobuf协议,数据结构设计采用的是森林结构。如上所示,SC_ResponseMsgProto是最外层对象,在最外层对象下有多个不同类别的子对象,如A、B,子对象下还拥有一些不同类别的子对象C,最终成为一个森林结构,森林里每个根对象都是一颗树。对象间有时有一些引用关系,比如,A对象使用了C引用。这样的设计在开发中是比较常见的,但是运用到项目中使用时比较流水账,大量相同名字的对象代码重复出现在项目中。对于每个程序员员来说,避免重复代码是大家都想做的。于是我大约花了不到30行代码来避免以上标注的四个重复地方,代码如下:

/** * 下发给客户端的消息 */ private final LinkedList<GeneratedMessageLite> responseMsgs = new LinkedList<>(); //添加消息 public void putMsg(GeneratedMessageLite msg) { synchronized (responseMsgs) { responseMsgs.add(msg); } } //发送消息 public void sendMsg(Channel channel) { //和客户端通讯的数据 SC_ResponseMsgProto.Builder responseMsgBuilder = SC_ResponseMsgProto.newBuilder(); DataMsgProto.Builder dataMsgBuilder = DataMsgProto.newBuilder(); try { for (GeneratedMessageLite messageLite : responseMsgs) { if (messageLite instanceof A) { responseMsgBuilder.setA((A) messageLite); } else if(messageLite instanceof B) { dataMsgBuilder.setB((B) messageLite); } responseMsgBuilder.setDataMsg(dataMsgBuilder.build()); } sendMsgToClient(channel, responseMsgBuilder.build()); }catch (Exception e) { e.printStackTrace(); logger.error(e.getMessage(), e); } finally { responseMsgs.clear(); } } //优化后代码 role.putMsg(a.build()); role.putMsg(b.build()); role.sendMsg(channel);
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表