优惠券模块改版总结

2 篇文章 0 订阅
2 篇文章 0 订阅

1.时间字段统一使用date类型,但是考虑到前端是使用时间空间得到的字符串所以支持传入字符串。

新增: CouponInward extends CouponSuper<String>

输出: Coupon extends CouponSuper<Date>

 

2.把有关联的对象作为子对象,这样可以突显出有关联的字段的关系。也可以比较方便的控制对象转化为Json的长度。其他人接收到对象后也比较好理解,之前有很多相似的名称,容易混淆。

 

 

封装

隐藏对象的属性和实现细节,仅仅对外公开接口。

封装具有一下优点:

 

便于使用者正确、方便的使用系统,防止使用者错误修改系统属性;

有助于建立各个系统之间的松耦合关系;

提高软件的可重用性;

降低了大型系统的风险,即便整个系统不成功,个别独立的子系统有可能还有价值。

封装的两大原则:

 

把尽可能多的东西藏起来,对外提供简洁的接口;

把所有的属性封装起来。

3..把有关联的对象作为子对象,在小对象关联大对象时很有用,可以把子类对象注入替换。例子:优惠券关联活动信息。这样子会有很大的扩展空间

 

 

4.缓存对象。数据在系统内的三种形式:db或文件记录,本地缓存,redis分布式缓存。

1.db或文件记录(持久化对象) 数据库提供了事务控制。最稳定,可控。在数据量和关联关系操作猛增时,可能遇到瓶颈。数据库执行sql是需要一定的时间的,等待执行的队列可能会很长。

2.本地缓存,读取最快,效率最高。缺点是没法实时更新状态,而且本地变化了没有办法通知其它节点。

3.redis分布式缓存,综合了上面两部的部分优点,是对上面两种方式的有益补充。

1).可以提供加解锁,实现类似于db的事务控制

2).分布式缓存,保持了完整的对象,只需要一点点的网络通信和序列化消耗。有效的分摊了db的压力。同时更改后的内容所有节点共享。

 

 

5.数据库字段与bean对象不需要一一对应,bean为业务服务,需要尽量灵活,可以有多层,但只体现一对一关系。一对多的关系在数据库时,千万不要用逗号分隔都偷懒的方式

 

6.无论bean对象还是mapper中的对象,要善于利用继承和关联。可以降低非常多的代码重复度。各个接口之间转化一下类型就可以直接使用,比如CouponVo类继承了Couponl类,就可以在很多使用Coupon类作为参数的地方使用。充分发挥

多态

java语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。

 

7.可以把核心算法独立开发,写一个简略版本。使用junit编写足够多的测试用例。例子:优惠券的计算逻辑简化版

 

8.尽量保证本模块的独立性,不要和其它的模块类和对象,他们调用我的接口时传入我指定的类型。降低模块之间耦合度。避免外部模块变化的影响

 

9.在一个请求内有状态的数据可以和无状态的数据分开查询。比如:所有和券码有关的coupon 都从本地缓存中读取。保持t_coupon_code表查询时的效率

 

10.数据库内部保存的关联关系字段最好统一使用code,不要一些用id,一些用code作为外键。对外提供的接口最好可以统一使用code作为查询条件。

 

11.大刀阔斧的改革需要根据实际可获得的支持来调整预期的目标。数据库字段修改,bean对象类修改,可控,但是前端修改需要其他支持。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了开发Java优惠券模块,我们需要先搭建项目结构,然后实现CouponType类和CouponTemplateService类。 1. 搭建项目结构 在搭建项目结构时,我们需要创建一个Maven项目,并在pom.xml文件中添加所需的依赖。具体步骤如下: - 创建Maven项目 - 在pom.xml文件中添加Spring Boot和其他所需的依赖 - 创建Java包结构 - 在Java包结构中创建所需的类 2. 实现CouponType类 CouponType类定义了多个不同类型的优惠券,convert方法可以根据优惠券的编码返回对应的枚举对象。这里还有一个“Unknown”类型的券,它专门用来对付故意输错code的恶意请求。具体代码如下: ```java public enum CouponType { MANJIAN("满减券", "001"), ZHEKOU("折扣券", "002"), LIJIAN("立减券", "003"), UNKNOWN("未知券", "999"); // 优惠券描述信息 private String description; // 优惠券编码 private String code; CouponType(String description, String code) { this.description = description; this.code = code; } public String getDescription() { return description; } public String getCode() { return code; } public static CouponType of(String code) { for (CouponType type : values()) { if (type.code.equals(code)) { return type; } } return UNKNOWN; } } ``` 3. 实现CouponTemplateService类 CouponTemplateService类是整个项目的底层基础服务,用于生成优惠券模板。具体代码如下: ```java @Service public class CouponTemplateService { /** * 构造优惠券模板 * * @param request {@link TemplateRequest} 模板信息请求对象 * @return {@link CouponTemplate} 优惠券模板实体 * @throws CouponException 优惠券通用异常 */ public CouponTemplate buildTemplate(TemplateRequest request) throws CouponException { if (!request.validate()) { throw new CouponException("BuildTemplate Param Is Not Valid!"); } // 判断同名的优惠券模板是否存在 if (dao.findByName(request.getName()) != null) { throw new CouponException("Exist Same Name Template!"); } // 构造优惠券模板 CouponTemplate template = requestToTemplate(request); template.setCreateTime(new Date()); template.setUpdateTime(template.getCreateTime()); return dao.save(template); } /** * 将 TemplateRequest 转换为 CouponTemplate * * @param request {@link TemplateRequest} * @return {@link CouponTemplate} */ private CouponTemplate requestToTemplate(TemplateRequest request) { return new CouponTemplate( request.getName(), request.getLogo(), request.getDesc(), request.getCategory(), request.getProductLine(), request.getCount(), request.getUserId(), request.getTarget(), request.getRule() ); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值