最近大家都在忙著改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);新聞熱點
疑難解答