当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

概述


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

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

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


小结


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

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

原文链接


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

转载于:https://my.oschina.net/samgege/blog/2885394

相关文章:

  • 云宏与英特尔携手发布了可全面兼容主流虚拟化解决方案
  • 收集 Kubernetes 资源统计数据的新工具
  • 从零开始搭建物联网平台(7):使用Vue编写前端页面
  • Java 面向对象之构造方法
  • 我与Jetbrains的这些年
  • input实现文字超出省略号功能
  • 复习Javascript专题(四):js中的深浅拷贝
  • stackoverflow:为什么排序后的数组要比未排序数组运行快3倍以上?
  • 胡小林:把日常生活中碰到的事变成我们发露忏悔的机会
  • 分布式消息队列 Kafka
  • 网站如何做好SEO优化,该怎么选择SEO软件?
  • JAVA入门到精通-第67讲-sqlserver作业讲评
  • Tcp/Ip 三次握手与四次挥手
  • jQuery操作表格(table)的常用方法、技巧汇总
  • [转]GitLab Continuous Integration (GitLab CI/CD)
  • __proto__ 和 prototype的关系
  • 2018一半小结一波
  • C++入门教程(10):for 语句
  • git 常用命令
  • k8s如何管理Pod
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Linux链接文件
  • MySQL-事务管理(基础)
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Vue 2.3、2.4 知识点小结
  • 初识MongoDB分片
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 06-01 点餐小程序前台界面搭建
  • MPAndroidChart 教程:Y轴 YAxis
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #if #elif #endif
  • #微信小程序:微信小程序常见的配置传旨
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (汇总)os模块以及shutil模块对文件的操作
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (区间dp) (经典例题) 石子合并
  • (转)Linux下编译安装log4cxx
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .form文件_一篇文章学会文件上传
  • .NET 5种线程安全集合
  • .Net IE10 _doPostBack 未定义
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net 程序发生了一个不可捕获的异常
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • ?
  • [ linux ] linux 命令英文全称及解释
  • [20171106]配置客户端连接注意.txt
  • [AIGC] Java 和 Kotlin 的区别