论坛首页 Java企业应用论坛

思考一个问题:某个布尔值在系统中应该显式定义还是应该隐式推导?

浏览 7157 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (9) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-25  
chenjianjx 写道
深表同意。

有个应用场景就是:批量查找。在批量查找时如果没有这个字段是会死人的。

Inside 写道
我建议显示定义。

理由如下:

1、那个行走方式字段只应该让人判断行走方式,不应该做其它事情,过多的判断依赖这个字段或许是bad smell。

2、从规范上来说,加一个“是人是兽”的字段本身就是一种规范,而且是不会有歧义,学习成本查找成本很低的规范,比隐式推导所依赖的规范廉价得多。

3、开发方便许多,如果系统逻辑很复杂的话,大量隐式推导是会要人命的,出错的概率大大增加。


你要是把人动物都放在一个表中那才叫雷人
0 请登录后投票
   发表时间:2010-06-25  
说话要过脑哦。不要想都不想就说出来。

抛出异常的爱 写道
chenjianjx 写道
深表同意。

有个应用场景就是:批量查找。在批量查找时如果没有这个字段是会死人的。

Inside 写道
我建议显示定义。

理由如下:

1、那个行走方式字段只应该让人判断行走方式,不应该做其它事情,过多的判断依赖这个字段或许是bad smell。

2、从规范上来说,加一个“是人是兽”的字段本身就是一种规范,而且是不会有歧义,学习成本查找成本很低的规范,比隐式推导所依赖的规范廉价得多。

3、开发方便许多,如果系统逻辑很复杂的话,大量隐式推导是会要人命的,出错的概率大大增加。


你要是把人动物都放在一个表中那才叫雷人

0 请登录后投票
   发表时间:2010-06-25  
如果是一体化的设计自然是表里面不需要这个字段。

考虑到开发以及实施、测试的具体工作则经常需要冗余的信息。

比如说我后台批量改一下数据没必要调用业务类吧。

或者可以看做是一个校验码之类的东东。
0 请登录后投票
   发表时间:2010-08-30  
enfield 写道
天啊,居然有这样的业务规则,记得一个故事,大概就是,某哲学老师说,人类就是直立行走,身上没有毛的啥啥,然后学生抓来一只鸡,把毛拔光,说,这就是人?
建议把业务规则改了先,不然还是再搞一个冗余字段比较好。


同意,感觉更应该用字段表示人兽,用方法表示业务规则。应该用符合思维习惯的方式构建系统。
0 请登录后投票
   发表时间:2010-09-12  
同意。

我觉得楼主犹豫的地方在于添加字段有些靠近数据库,没有体现oo思想,但是开发和维护方便;而推导方式就比较oo,但是开发和维护成本提高了。

我的想法是数据表加字段描述,在应用中使用接口来体现业务逻辑。这样会好一些

chenjianjx 写道
深表同意。

有个应用场景就是:批量查找。在批量查找时如果没有这个字段是会死人的。

Inside 写道
我建议显示定义。

理由如下:

1、那个行走方式字段只应该让人判断行走方式,不应该做其它事情,过多的判断依赖这个字段或许是bad smell。

2、从规范上来说,加一个“是人是兽”的字段本身就是一种规范,而且是不会有歧义,学习成本查找成本很低的规范,比隐式推导所依赖的规范廉价得多。

3、开发方便许多,如果系统逻辑很复杂的话,大量隐式推导是会要人命的,出错的概率大大增加。



0 请登录后投票
   发表时间:2010-09-12  
这个例子太脑残了,没什么感觉,楼主应该务实点。其实用的时候做成方法即可,下面怎么做的随时可以调整。
0 请登录后投票
   发表时间:2010-09-17  
我同意这种说法。
显式设计,有些时候是节省了不少的时间。但更加要看到,冗余字段的维护的成本。
如果维护的成本很低,那么添加一个显式字段是正面的;但一旦维护这个冗余字段的成本非常大,比如业务中需要维护这个字段的地方非常多,那么再添加这个字段就得不偿失了。
所以我认为还是实际情况实际考虑吧,一味的抵制或者支持冗余字段都不是很好的想法。

魔力猫咪 写道
我个人赞成隐式推导,一般不建议定义布尔字段。
因为绝大多数的这种判断,都是需要进行一些比较计算的。如果设定一个字段来存这个值,那么在参与判断计算的其他字段发生变化或者计算公式变化的时候,就必须更新这个布尔值。如果考虑不到位,没有更新,那么就会造成错误。为了及时更新,编码里面判断计算的调用到处都是。只要相关字段有了变化,就得重新计算。至于什么时候读取这个字段就不知道了。也许永远不会被读取。所以从这点上说,定义一个布尔值字段是得不偿失的。既增加了大量的无用计算,又引入了忘记计算造成BUG的风险。触发器倒是可以保证不会忘记计算,但是性能损失很大。如果是频繁更新的表,触发器一多,那么插入修改的效率就非常低了。
我认为如果要定义布尔值字段,那么就要求这个字段不用任何判断计算。

我认为LZ提问的动物表问题,不应该设定是否“人”这种字段判断。而是应该使用继承关系进行处理。至于提出的程序员问题,这个不是设计问题而是管理问题。管理混乱,那么插再多的这种字段也没用。除了搞乱数据库结构,没任何好处。建议对新人采用老带新的办法。编码前一定要进行设计,搞清楚了要建哪些类、有哪些接口哪些调用再编码。最好编码前就把测试写出来。新人写完设计(当然不是那种骗客户的设计说明书)后老人一定要进行审核。确认没有重复编码和层次混乱。

最后还要说一下。LZ提出这个问题考虑的层次有点低,什么都放在了数据库层次考虑。这样会把太多的业务逻辑引入到数据库里面。建议尽可能把业务放到应用层而不是持久层。

0 请登录后投票
   发表时间:2010-09-17  
hibernate在同表保存继承的实现已经如此被鄙视了么?

如果能肯定永远不会有人和动物之外的实现类,肯定永远有相应属性、方法或者接口,那么怎么实现都行。
借数据库的一个实现方式说,那个标志属性本身和是否为空的函数索引没啥区别。

不肯定的话,hibernate在数据库层面用标志位、对象层面用多实现类的方式,个人认为是个概念清晰的好方式。不用hibernate也可以参考这个思路。
0 请登录后投票
   发表时间:2010-09-17  
隐式的说法很值得怀疑,是人是动物可以在运行时转换的设计?GSM。
0 请登录后投票
   发表时间:2010-09-19  
为什么不再setter中书写逻辑呢?
当传入是人是兽时,就可以在其setter中确定了,再为行走方式赋值
这既可以减少冗余,又可以统一实现了吧,再新的新手,不会连实体有哪些属性都不清楚把
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics