Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

布尔标识与状态机

  最近接手了一些奇怪的业务程序,感觉原来的数据库设计简直就是一坨!状态与过程不分,布尔标识与状态机不分。这样的数据库设计会导致业务代码经常要写一个很长很长的逻辑运算符组来判断一条记录的状态,最终业务程序完全变成一坨。
  状态机和布尔标识都是有用的东西,状态机用于描述一组互相有关的状态,而布尔标识符用来描述互相无关的状态。也就是说,在业务代码中使用布尔标识就应该没有逻辑运算符参与。假如有 is_a 和 is_b 两个布尔标识字段,它们就应该是互相独立的。业务逻辑中应该直接 if(is_a) 这样判断,而不该用逻辑运算符来处理它们。如果真有 if(is_a && is_b) 的需求,可以有两种做法。一种是添加一个 is_c,用于描述这个情况。另一种是删除掉 is_a 和 is_b,直接将其转换为 4 个状态存储。
  也许有人会说,只要有状态机不就可以解决所有问题了么?布尔标识是什么鬼?理论上,所有状态描述相关的问题确实都可以通过状态机来解决。然而理论归理论,实际开发中如果只用状态机会遇到很多问题。因为当逻辑增加时状态是指数增加的,假如我们完全不用布尔标识,而全部交给状态机,那么只要有 16 个布尔标识的话就得有 65536 个状态。如果每个状态都用一个英文单词来描述的话单词根本就不够用。所以不能把所有的状态全部都交给状态机!
  如果想让程序中的业务逻辑保持在最易读的状,那就应该在数据库设计时根据逻辑的类型将其适当地设计为状态机和布尔标识。甚至如果逻辑真的过于复杂可以考虑同时使用多个状态机(但应该尽量避免,因为这会让业务代码变复杂)。
  以上的做法也是只是非常理论化的,可以作为解决一般问题的参考。但有时候疯狂的产品经理会搞出一坨违反自然规律的逻辑,我也完全招架不住 = =。这时候我们能做的除了撕逼还有什么呢?
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^