程序基本设计中,能够犯的最大错误,就是丢弃用户输入的数据。程序员
这看起来彷佛不可能,怎么会有人这么干呢?但是,看看这个常见场景:数据库
咱们让用户输入本身的年龄。固然在数据库中设计一个年龄
字段。看起来很普通,是吗?但若是你没有同时在这条记录中加上一个输入日期
字段,你实际上就丢失了信息。固然,更好的输入设计是让用户输入出生日期。之因此如此,是由于年龄
不是一个基本事实信息,它不过是出生日期这个基本事实的递延数据。设计
在我正在重构的一个限量销售的系统中,须要统计用户的购买次数,保证一个用户天天只能买2次,天天只能买100元如下的总额。程序员设计时这个限量系统时马上设计了两个计数器:购买次数
和购买总金额
,他没有犯刚才那个错误,同时也记下来了购买日期
,这些内容都存进了数据库。每次用户购买时对这两个计数器递增便可。很完美,很高效,是吗?code
不幸的是,需求老是比你想象得更加怪异,很快客户须要限制某种特别的产品的购买次数。而咱们的两个计数器却找不到这个信息!程序员又增长了第三个计数器x 特别产品购买次数
。为了支持这个计数器,他必须对过去递增计数器的地方加上新的处理代码。能够想象,程序很快变得很是难看,处处出现x 特别产品
。产品
为何会出现这样的麻烦?是因为需求做怪吗?至少在这个场景上,问题就出如今开始的计数器设计上。当咱们保存计数器而不是更基础的订单信息如产品号
、购买数量
的时候,咱们就丢失了这些基本信息,而只保存了一些派生信息。咱们能够很容易看到:实际上咱们的计数器是很容易从新从基本订单信息中计算出来的,但反过来,基本订单却没法从计数器中算出来,即便加上第三个、第四个计数器也不行。基础