设计要做到扩展性强还挺难的
概述
在日常开发中,有时候你的上司会跟你说,这个模块的设计扩展性要高。把这句话说出来很简单,但是要做到则非常难。导致难的其中一个因素
是:
你不熟悉这个行业的业务的玩法
我举个例子来说明。像电商行业里的满多少减多少这样的营销活动,如果你一开始只是认为这种活动就是单指满多少钱减多少钱的话(例如:满100元减20元),那么就很有可能
导致无论你如何设计,它都不具备可扩展性。为什么呢?
由于你只是认为只有类似满100元减20元这样的玩法,就很有可能如下设计表:
CREATE TABLE `manjian_activity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `activity_name` varchar(100) NOT NULL DEFAULT '' COMMENT '活动名称', `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '活动状态', `target_price` int(11) DEFAULT NULL COMMENT '满减,目标金额', `off_price` int(11) DEFAULT NULL COMMENT '满减,减额' )
以满100减20为例子,target_price
就是100,off_price
就是20,我们把这两个钱放置在活动表里了。好了,所有的业务代码都围绕这样的表设计来写代码,也经过测试和上线了。表面看起来一帆风顺的,但是产品经理还会再跟你提需求,说我们要支持如下规则:
- 满100享受5折
- 满100送1件赠品
- 要支持梯度,满100元减20,满200减30
这个时候就傻眼了,manjian_activity
表不支持这样的玩法,而之前的所有代码已经围绕这个表设计来展开了。如果要支持新的玩法,改动会很大。这个时候你可能会说,当时的表设计真烂。但是你要知道,设计者当时对满多少减多少这种营销活动的认知是不够的,不知道业界各种各样的玩法,怎么可能会有扩展性强的设计呢。这个不能怪罪开发。
如果一早就知道满减这种营销活动的各种业务玩法,那么我们就知道需要设计一张规则表,来存储规则。像
- 满100享受5折
- 满100送1件赠品
- 要支持梯度,满100元减20,满200减30
这些都是规则。
CREATE TABLE `manjian_rule` ( `id` int(11) NOT NULL AUTO_INCREMENT, `threshold_value` int(11) NOT NULL DEFAULT '0' COMMENT '门槛值', `discount_type` int(11) NOT NULL DEFAULT '0' COMMENT '优惠类型0 减钱,1 打折 2 送赠品', `discount_value` varchar(50) NOT NULL DEFAULT '' COMMENT '优惠值,字符意义由优惠类型决定', `activity_id` int(11) NOT NULL COMMENT '满减活动id' PRIMARY KEY (`id`) )
manjian_rule
表就可以满足产品提的新需求了。一个活动对应的所有规则都在manjian_rule
里。
小结
从上面的例子可以总结出几个小的体会:
- 当你从产品经理那里拿到需求后,在做代码设计前,可以先问他,这个模块后面会怎么发展,提前了解一些将来可能要做的业务;
- 自己参与某个模块开发的时候,如果业界也有类似的东西,最好也去了解一下,大家都是怎么玩的;
- 你的设计不具备扩展性,导致后续改动起来难,也不要灰心气馁,因为有些情况下真的很难做到设计扩展性强。
原文链接
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用nginx image filter实现类OSS对象存储中对图片的实时处理
使用Nginx image_filter实现类似OSS图片处理 在家使用自己的电脑做了一个小应用,可查看照片,按以前的方式,需要在用户上传图片后对进行裁剪压缩,然后给前端一个缩略图地址与原图地址。这种方式有两个弊端磁盘空间的浪费、缩略图尺寸调整不便捷。是否有其他不使用云OSS存储的情况下自己实现一套类似OSS的图片处理? 后来搜索资料,发现使用nginx的image_filter可以实现。根据网上其他人的实例使用没有成功。 安装nginx与imageFilter不在复述,自己从网上看文章就可以了。我使用的版本是nginx 1.13.12 直接自带该插件。 自己调整后可以使用,下面贴出完整配置。 server { listen 80; server_name 127.0.0.1; charset utf-8; root /www/uploadfile; #拦截所有带“!”号的图片请求 location ~* ^(.*\.(?:jpg|gif|png|jpeg|bmp))!(.*){ #rewrite ^(.*\.(?:jpg|gif|png))! $1; #图片访问路径 set $fil...
- 下一篇
2 张图,让你一秒理解 CountDownLatch、CyclicBarrier
CountDownLatch(倒数闩,Latch:门闩) 经常用于 监听某些初始化操作,等 初始化线程 全部执行完毕后,才通知 主线程 继续工作 a) 即 一个线程处于阻塞的状态下,他要收到 多少次通知,才能被 苏醒,并继续往下执行 b) 注意:只能阻塞 一个线程 c) "countDown.countDown() 到了 0,并使得 countDown.await() 苏醒" 之后,仍旧能进行 countDown.countDown(),并且不会报错;但是countDown.getCount() 始终为 0 CyclicBarrier(同步屏障,cyclic:周期的,循环的,barrier:屏障) 场景假设:每个线程代表一个 跑步运动员,当 所有运动员 都准备好,才能一起出发,只要有一个人没有准备好,那么大家都要等待他 a) 注意:阻塞的是 每个线程
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度