标签:通用 数据校验 代码 反转 就是 设计 需要 代码重复 就会
只需要一张记录积分流水明细的表
积分明细表 | |
---|---|
id | 明细id |
user_id | 用户id |
channel_id | 赚取或消费渠道 |
event_id | 相关事件ID,如订单id,评论id,优惠券换购交易id |
credit | 积分(赚取为正,消费为负) |
create_time | 积分赚取或消费时间 |
expired_time | 积分过期时间 |
接口设计要符合单一职责原则,粒度越小通用性就越好
接口粒度太小也会带来一些问题:通讯开销;原子操作被分开,涉及分布式事务数据一致性问题。
借鉴 facade(外观)设计模式,在职责单一的细粒度接口之上,再封装一层粗粒度的接口给外部使用。
接口 | 参数 | 返回 |
---|---|---|
赚取积分 | userId,channelId,eventId,credit,expiredTime | 积分明细ID |
消费积分 | userId,channelId,eventId,credit,expiredTime | 积分明细ID |
查询积分 | userId | 总可用积分 |
查询总积分明细 | userId+分页参数 | id,userId,channelId,eventId, credit,createTime,expiredTime |
查询赚取积分明细 | userId+分页参数 | id,userId,channelId,eventId, credit,createTime,expiredTime |
查询消费积分明细 | userId+分页参数 | id,userId,channelId,eventId, credit,createTime,expiredTime |
三层架构的Service
^: 大部分业务系统的开发都可以分为 Controller、Service、Repository 三层。Controller 层负责接口暴露,Repository 层负责数据读写,Service 层负责核心业务逻辑,也就是这里说的业务模型
简单系统选择贫血开发模式
^: 基于贫血模型的传统开发模式和基于充血模型的 DDD 开发模式,前者是一种面向过程的编程风格,后者是一种面向对象的编程风格,无论是DDD还是OOP,高级开发模式应对复杂系统;积分系统业务相对比较简单,选择简单的基于贫血模型的传统开发模式就足够了。
简单选择跟其他业务系统一块部署
分层体现了抽象和封装:Repository 层封装了对数据库访问的操作,提供了抽象的数据访问接口
基于接口而非实现编程的设计思想,Service 层使用 Repository 层提供的接口,并不关心其底层依赖的是哪种具体的数据库。方便替换数据库的时候:只需要改动 Repository 层的代码
Controller、Service、Repository 三层代码的稳定程度不同、引起变化的原因不同,分成三层来组织代码,能有效地隔离变化:Controller可能经常变化,分层后Controller变化并不影响其他层的稳定。
^ : 针对 Controller、Service、Repository 三层,每层都会定义相应的数据对象,它们分别是 VO(View Object)、BO(Business Object)、Entity,例如 UserVo、UserBo、UserEntity。在实际的开发中,VO、BO、Entity 可能存在大量的重复字段,甚至三者包含的字段完全一样。在开发的过程中,经常需要重复定义三个几乎一样的类,显然是一种重复劳动。
继承可以解决代码重复问题
可以将公共的字段定义在父类中,让 VO、BO、Entity 都继承这个父类,各自只定义特有的字段。因为这里的继承层次很浅,也不复杂,并不会影响代码的可读性和可维护性。后期如果因为业务的需要,有些字段需要从父类移动到子类,或者从子类提取到父类,代码改起来也并不复杂。
组合也可以解决代码重复的问题
可以将公共的字段抽取到公共的类中,VO、BO、Entity 通过组合关系来复用这个类的代码。
? 整个开发的过程会涉及“Entity 到 BO”和“BO 到 VO”这两种转化
高内聚,松耦合 | 不同功能划分到不同的模块,让模块高内聚,松耦合 |
单一职责原则 | 模块设计尽量职责单一;分层设计也是为了职责单一 |
依赖注入 | MVC:下层的类通过依赖注入的方式注入到上层的代码 |
依赖反转原则 | 通过类似spring IOC这样的容器来管理对象的创建、生命周期 |
基于接口而非实现编程 | MVC:Service层使Respository层提供的接口,不关心底层数据库类型 |
封装、抽象 | 分层体现了抽象和封装的思想,隔离关注点和变化 |
DRY与继承、组合 | VO、BO、Entity代码重复,但语义不重复,符合DRY; 解决重复问题可用到继承和组合的方法 |
面向对象设计 | 合适的功能放到合适的模块中,体现了面向对象设计(合适的代码放到合适的类) |
标签:通用 数据校验 代码 反转 就是 设计 需要 代码重复 就会
原文地址:https://www.cnblogs.com/wod-Y/p/12778696.html