Tasking时,数据非法了怎么办?

该问题的上下文是源于镶金玫瑰TDD:

"镶金玫瑰"!这是一家魔兽世界里的小商店。出售的商品也都是高价值的。但不妙的是,随着商品逐渐接近保质期,它们的价值也不断下滑。你需要开发一个IT系统来更新库存信息。

商品的价格规则说明如下:

  • 商品的价值永远不会小于0,也永远不会超过50
  • 商品每过一天价值会下滑1点 ,一旦过了保质期,价值就以双倍的速度下滑
  • 陈年干酪(Aged Brie)是一种特殊的商品,放得越久,价值反而越高
  • ......

今天,在TDD训练营中有学员提出在做业务需求Tasking的时候,商品价值小于0和大于50的时候怎么办?仔细想想这个问题,他问的其实不是业务需求,因为业务里没有提到这一点。他问的实际上是在代码中初始化商品的时候传入了一个负数或大于50。

回到业务需求Tasking的阶段,当你只关注业务需求的场景的时候,可能就不要考虑了,而当下要考虑的是各种不同类别的商品随着时间变化而变化的规律,以及到达0和50的边界之后的变化规律。所以你所关注的系统核心端到端的功能是按天更新。对于商品创建时候所传入的价值超出范围的问题,你在这个阶段可以不必关注。

当你将按天更新的业务场景都覆盖实现之后,系统的核心业务几乎完成,你可能会得到一个这样的Item类:

public class Item {
    protected String name;
    protected int sellIn;
    protected int quality;

    public Item(String name, int sellIn, int quality) {
        this.name = name;
        this.sellIn = sellIn;
        this.quality = quality;
    }
}

此时你发现:“咦,这个构造器传入的参数没有做任何限制呀,万一传进入-1和100呢,那岂不是有Bug?”

很好,当你写完代码之后,发现这个构造器是脆弱的,没有任何防范,此时你也可以再补两个单元测试,测试构造器中传入参数不合法时情景,但要清楚这个测试跟之前的Task驱动的测试不是为了同一个目的,但它也是有价值的。

还有一种做法是,你识别出来了,但在这啥也不做。如果在这里啥也不做,那个检查始终的有地方要做,把它当做错误在时机很晚的时候告知用户肯定不是一个好主意。

那在什么时候做呢?这需要来到架构层面去思考了。业务复杂到一定程度,大多数系统都会做架构设计,最典型的是分层,比如:六边形架构,传统三层架构,分层架构,整洁架构。这些架构采用的一个理念是将核心业务规则保护起来,跟展示层和持久层隔离开。这样做的好处是,我的业务层是不受任何外界干扰的,不管你是Web界面还是GUI输入,我只需要通过不同的适配接口去适配不同的端,我能始终保持核心业务是不受破坏的。

举个例子,当你去游乐场游玩时候,你首先要买一张门票,在门口凭票进去后,你去各个游玩项目的时候,每个项目的管理人员是怎么接待你的?当你来到过山车项目,工作人员会将你和其他3个人分成一组,然后去分配给别人。试想,当你和其他3个人兴匆匆走到车前,正要准备上车,工作人员一把喊住你:“嘿,小伙子票买了没有,让我看看你的票。” 而你的票已经存到包里,放到储物柜了,你作何感想?但通常游乐场内部的各个项目工作人员不会做去检查门票的,这个事情的职责交给了大门口的关闸,你只要通过了那个关闸,后续每个项目只用关注自己的核心业务逻辑(如何按照男女、年龄分组)。

这其实就是一种分层思想,分层的本质就是职责分离。经过这样的分离,你的核心业务逻辑只用关注自身的业务规则。对于镶金玫瑰,要想想我们要实现的是什么?我认为是核心业务规则,这个系统要投入使用,肯定是集成用户接口的,比如,商品老板在手机界面录入商品,这个时候老板输入了一个价值100的非法值,那个非法值的校验就会在用户数据的接收处就做了,传到核心业务层的数据就一定是合法的数值,这样核心业务层只用关注自己的业务规则即可,做到职责分离。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351