文档章节

设计要做到扩展性强还挺难的

Sam哥哥聊技术
 Sam哥哥聊技术
发布于 11/21 13:45
字数 976
阅读 348
收藏 2

概述


在日常开发中,有时候你的上司会跟你说,这个模块的设计扩展性要高。把这句话说出来很简单,但是要做到则非常难。导致难的其中一个因素是:

你不熟悉这个行业的业务的玩法

我举个例子来说明。像电商行业里的满多少减多少这样的营销活动,如果你一开始只是认为这种活动就是单指满多少钱减多少钱的话(例如:满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里。


小结


从上面的例子可以总结出几个小的体会:

  • 当你从产品经理那里拿到需求后,在做代码设计前,可以先问他,这个模块后面会怎么发展,提前了解一些将来可能要做的业务;
  • 自己参与某个模块开发的时候,如果业界也有类似的东西,最好也去了解一下,大家都是怎么玩的;
  • 你的设计不具备扩展性,导致后续改动起来难,也不要灰心气馁,因为有些情况下真的很难做到设计扩展性强。

原文链接


设计要做到扩展性强还挺难的

© 著作权归作者所有

共有 人打赏支持
Sam哥哥聊技术
粉丝 76
博文 10
码字总数 11935
作品 0
广州
高级程序员
私信 提问
加载中

评论(4)

Sam哥哥聊技术
Sam哥哥聊技术

引用来自“Joyce_LNN”的评论

你去问产品经理后续,产品经理说不知道,先这么做吧
哈哈。也有可能。不过我们也可以自己去参考业界的玩法的。
Sam哥哥聊技术
Sam哥哥聊技术

引用来自“beelzebub”的评论

规则引擎呀
是的。有一种场景是一定要扩展性的,就像你说的,规则引擎。
beelzebub
beelzebub
规则引擎呀
Joyce_LNN
Joyce_LNN
你去问产品经理后续,产品经理说不知道,先这么做吧
基于 Vue.js 的移动端组件库--cube-ui

cube-ui 是由滴滴开源的基于 Vue.js 实现的移动端组件库。 功能特性 质量可靠 由滴滴内部组件库精简提炼而来,经历了业务一年多的考验,并且每个组件都有充分单元测试,为后续集成提供保障。...

匿名
2017/11/25
1K
0
如何搭建视频通信服务器架构

随着移动互联网的发展,视频通信使用场景越来越多,如视频聊天、视频会议、在线直播等。但是随之而来对前端设计的要求、对后端服务器的要求也不断增加。所以如何搭建一个完善的服务器以适合视...

wjmnju
01/04
0
0
cube-ui 1.9.3 发布,基于 Vue.js 的精致移动端组件库

cube-ui 1.9.3 已发布,该版本主要修复了普通编译按需引入时,字体文件路径的 bug 。 cube-ui 是滴滴开源的基于 Vue.js 实现的精致移动端组件库,旨在让移动端开发更容易,让开发人员更专注于...

王练
05/21
2.5K
8
这10件事情,你做网站之前都有考虑吗?

1.命名尽量统一。   命名有很多地方,比如页面该如何统一命名,要是用wordpress建站,命名就该遵循wordpress的文件命名规范,比如文章页single.php,分类页category.php,搜索页search.php等...

程序员客栈
2016/06/02
25
0
互动社区产品--DCSite

DCSite是一套基于Web2.0思想设计、开发的系列互动社区产品,也是一套具备Web2.0项目的全套解决方案,是面向所有城市门户由 WEB1.0向WEB2.0转型的最佳的选择。它精心设计的系统架构、功能机制...

匿名
2010/06/28
4.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

Elasticsearch节点角色类型node.master和node.data说明s

一般地,ElasticSearch集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。这些功能是由两个属性控制的(node.master和node.data)。默认情况下这两个属性的值都是tru...

傲娇字符
18分钟前
2
0
jdbcTemplate 分页 com.github.pagehelper.Page

由于项目中用了mybatis分页插件 com.github.pagehelper.Page 有时候复杂的查询分页想用jdbcTemplate。又想用分页。 分页对象 public class PageBean<T> implements Serializable { priv...

xiaomin0322
18分钟前
0
0
rem的使用

(function (doc, win) { var docEl = doc.documentElement var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize' var recalc = function () { var cl......

Js_Mei
25分钟前
0
0
idea 删除代码的注释

搜索栏使用 正则表达式搜索 (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/|[ \t]*//.*) 会搜索出来所有注释的代码 用空格replace替换掉就可以了。 或者搜索 (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\...

时刻在奔跑
28分钟前
2
0
eclipse maven 项目运行mvn clean 后无法运行

错误: 错误:找不到或无法加载主类com.yyy.test.Main 解决方法: “project” --"Clean" 参考链接:https://jingyan.baidu.com/article/cbcede07107d9802f40b4dff.html...

qimh
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部