订单、预约单的流水号是冗余属性吗

陈磊 2024-6-12 20:40

老师好!我学习了软件方法的类图内容,也已经认真做题了,现有一个问题想请老师解惑。

像订单、预约单这样的单据生成的时候,会生成一个流水号作为标识,有时还会以二维码、条形码的形式给用户。这个流水号算冗余属性吗?

UMLChina潘加宇

(1)首先,要区分“标识”和“流水号”,参见《软件方法》第8章以下内容:

(2)如果就是要用这个“流水号”作为标识,那不是冗余属性。(高概率)

(深究起来,所有的“对象标识”都是冗余的,都是在信息不足的情况下用于区分对象的“偷懒”手段,但这是另一个级别的问题了。)

(3)如果“流水号”不是标识,按照书中的方法来判断就行:它是不是可以由其他属性计算得到。

我用餐饮领域举例,列了几种情况供参考,不一定正确和全面:

如果“订单”的“流水号”“TS202406140013”的最开始生成时的规则是根据“订单”的“订单类型(TS-堂食)”、 “订单”的“下单日期(2024-06-14)”以及统计当天的堂食订单的先后顺序(第13个下的单)得到的。

(3.1)如果在对象的生命周期中,这样的计算都可以完成,而且“流水号”的值一直遵循生成的规则,那么“流水号”是冗余的。

例如,系统一直维护“订单类型”、“下单日期”的信息,如果把某个订单的类型从堂食改成了外带,那么“流水号”也会相应改成“WD***********”。

(3.2)如果把某个订单的类型从堂食改成了外带,但“流水号”不变,此时“流水号”已经无法通过之前的规则计算得到,它不是冗余的。(高概率)

(4)如果系统没有维护“订单类型”、“下单日期”等信息,只维护了一个“流水号”,然后还有逻辑去解析这个“流水号”得到“订单类型”、“下单日期”等信息,那么“流水号”已经不是流水号了,是融合了多个属性的错误结构。

(5)如果“流水号”的生成使用了随机数,那么在对象的生命周期中,“流水号”不能从其他属性还原,那就不是冗余的。

注意,以上都是从逻辑的角度来讨论,不涉及性能问题。


weixinpanjiayu2