公司做的项目是一个聊天项目,最早的时候业务简单,所以大家为了便于传递数据把所有相关的信息都存到一个ChatModel里面,便于get和set。但是随着业务的增长,里面的字段到现在为止已经很庞大了,这对于维护和数据传递非常的不方便(在一百多个字段中寻找一个字段是很麻烦的。有时候仅仅需要传递一小部分数据,却要把很多不必要的字段带上也是很麻烦的,在性能上也是很浪费的)。有些对这块不了解的同事为了自己方便甚至写了很多冗余的代码,最近项目暂告一段落,想了一下怎么处理这种问题,目前有两种解决方式,各有利弊,在这里讨论一下。
公司是做医疗的,所以聊天对象有两种,一种是医生,一种是患者,目前来说不管是医生信息还是患者信息全部是在ChatModel里面。聊天内容则是除了大家都有的文本、图片、音频、视频还有一些独有的类型。这些统统是在这个ChatModel里面。至此可以想想到里面的数据是很臃肿的。
下面说第一种方式,首先将各个部分抽离成单独的类,然后再由ChatModel进行引入。结构图如下:
由于这种方式实施过程比较简单不容易出现问题,所以就只提供一个结构图,但是这种方式只是是视觉效果上看着好看些,其实本质上数据传递过程中还是把所有字段带过去了。下面说第二种方式,结构图如下:
这种方式是将医生和患者的共性抽离成一个基类User,下面的Patient和Doctor则分别保存其特性,然后将其User基类引入ChatModel类。ChatModel则保存聊天信息的共性特征,如messageId,messageTime之类的。下面延伸出子类则分别保存其特性,如MessageText保存其文本内容,MessagePhoto保存其图片内容,MessageAudio报错其音频内容。具体开发过程中会有一些需要注意的地方,下面进行简单分析:
首先是用户类,可以在ChatModel里面用一个Map来存储用户信息(这里结构图写的有些错误),在使用的时候根据key把相应的value取出后然后强转为相应的类型。key值可以保存在合适的地方,例如Patient的key存在Patient里面,示例如下:
class ChatModel{
private Map<String,User> userMap = new HashMap<>();
public void putUser(String key,User user){
userMap.put(key,user);
}
public User getUser(String key){
return userMap.get(key);
}
public Map<String,User> getUserMap(){
return userMap;
}
}
class Patient extend User{
public static final String PATIENT_KEY = "patient";
private String patientAge;
}
以上做法避免了如果添加新的用户的时候需要修改ChatModel的问题,以及对于用户信息如何存取的问题。
第二个就是聊天信息赋值的问题,下面提供一种信息赋值的方式:
ChatModel chatmodel = new ChatMoel();
if(type == Type.Text){
MessageText messgaeText = new MessageText;
messageText.setText("你好");
chatmodel = messageText;
}
chatmodel.setType(type);
取值的时候如下所示:
ChatModel chatModel;
if(chatModel.getType == Type.Text){
MessageText messageText = (MessageText)chatModel;
System.out.println("取出的内容是:"+messageText.getText());
}
这种方式就解决了结构和效率上的问题,只是使用起来可能稍微麻烦一点儿。改造现有结构的过程要稍微谨慎一点,把所有取值赋值的地方找到,防止出现强转的异常。