充血模型 案例 应用 设计

值的拆分和组装:

场景:数据库里存的值是多个值拼接在一起,用逗号分隔。但出参需要将他拆分。

例如:数据库里citizenship存的是USA,CHN,JPN,出参需要将这个值拆分,分别给到citizenship1,citizenship2,citizenship3

传统的方法会这么写:

service:respDTO dto = respDTOConverter.INSTANCE.entity2DTO(e);String citizenship = entity.getCitizenship();if (null != citizenship) {String[] split = citizenship.split(",");respDTO.setCitizenship1(split[0]);if (split.length > 1) {respDTO.setCitizenship2(split[1]);}if (split.length > 2) {respDTO.setCitizenship3(split[2]);}}

我们可以将这部分代码转移到respDTO里。

这样设计:先新增一个字段citizenships,给这个字段增加set方法。这样我们在service里进行实体和dto的转换时就直接就完成了参数的拆分和赋值。

借助org.mapstruct.Mapper;

@Mapping(source = "citizenship", target = "citizenships")
DTO entity2dto(Entity e);
service:respDTO dto = respDTOConverter.INSTANCE.entity2DTO(e);
出参dto RespDTO:private String citizenship1;private String citizenship2;private String citizenship3;/*** 以下参数用于组装*/private String citizenships;public void setCitizenships(String citizenships) {this.citizenships = citizenships;if (null != this.citizenships) {String[] split = this.citizenships.split(",");this.citizenship1 = split[0];if (split.length > 1) {this.citizenship2 = split[1];}if (split.length > 2) {this.citizenship3 = split[2];}}}

似乎只是一个简单的代码转移,但这样设计有个巨大的好处。

例如在写需求的时候,接口文档有了,但表,实体,聚合等等都还没有。如果按照传统的方法写,这块业务就得等别人把表,实体,全部创建好了,才能去写。

但用充血模型,可以先将参数处理这块代码实现。等到时候表确定好了,实体创建了,在service里只需要加上查询代码即可。这个需求就完成了。

这种模式总结一下就是:

入参出参的字段确定了,以及参数检查和参数处理的业务也确定了,这些代码都可以先完成,并且编译通过。最后只需要将dao获取的值放在中间即可。

这就是一个代码的填空游戏。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部