关于拆分POJO类的一些思考

来源:互联网 发布:windows 查看命令路径 编辑:程序博客网 时间:2024/05/16 06:57

公司做的项目是一个聊天项目,最早的时候业务简单,所以大家为了便于传递数据把所有相关的信息都存到一个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());

}

这种方式就解决了结构和效率上的问题,只是使用起来可能稍微麻烦一点儿。改造现有结构的过程要稍微谨慎一点,把所有取值赋值的地方找到,防止出现强转的异常。