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对象类修改,可控,但是前端修改需要其他支持。