职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 443|回复: 9

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

[复制链接]
broken 发表于 2011-8-29 10:02 | 显示全部楼层 |阅读模式
比如说,人和兽都是动物,业务规则是:直立者即人,爬行者为兽。
那么 在“动物”表中, 除了要有 “行走方式” 这个字段,要不要再搞一个 “是人是兽” 字段?


隐方:不必了。通过站立方式已经可以推导出是人是兽了,再搞一个字段就是冗余了,众所周知,冗余有很多坏处。

显方:我觉得应该搞一个“是人是兽”的字段。先不说冗余的问题,先说搞一个这样的字段有哪些好处。
   1. 最重要的一点,是可以帮助业务逻辑之间解耦,降低系统复杂度。  比如说,系统里判断一个动物能否说话时,先要判断这个动物是人还是兽,而要判断动物是人还是兽,要先判断它的行走方式是否为直立。 这样的话,“能否说话” 就依赖了 “是否直立行走”,如果这种依赖关系多了,这些关系就会在系统中形成一个网状结构,很复杂。而如果我们显式地搞一个 “是人是兽” 的 Mediator,网状结构就可以退化成星形结构,这样可以增强系统的可维护性。

   2. 业务逻辑之间解耦后,还可以减少公司里业务专家的压力。很多程序员,尤其是新来的五谷不分的程序员,并不知道直立的就是人,趴着的就是兽。要了解这一点,他们就得去问业务专家,即老工程师或者产品经理,这个代价可大可小。他也可以去查文档,但按我们的现状,文档未必完整,而且篇幅巨大,查起来也非常费劲。

隐方:对你的第二点我很赞同,但关于第一点,我觉得还是设计技巧的问题。你在业务层写一个接口用于判断“是人是兽”,不就可以了吗?而且这样还可以封装判断的细节,当判断规则改变时,接口的调用者可以不必改写代码。

显方:这么看来至少你赞成搞一个“显式”的接口了,只不过是放在业务层;这样既可以实现业务逻辑的解耦,又可以避免数据库中的冗余。

隐方:是啊,很完美吧?

显方:但你的想法需要一个大家定一个规矩:即所有人都必须通过个接口来进行人兽判断。这在代码不多、并且软件复用思想深入人心的小型团队里倒是很适用,因为这个规矩很容易执行;但在大型团队里,这个规矩很难执行;因为很多人对业务层的重用并没有什么概念,他们会直接绕道去找数据库;而且即使他们愿意重用业务接口,在项目紧张时也懒得去找相应的接口规格,因为他们根本不知道这个接口是否存在,也不知道应该去找谁问这个问题。

隐方:这是另外一个问题了,主要跟软件过程有关系,或者可以借鉴SOA实践中的一些思想,我们另开一个话题再聊吧。


叫我小乖 发表于 2011-8-29 10:02 | 显示全部楼层
天啊,居然有这样的业务规则,记得一个故事,大概就是,某哲学老师说,人类就是直立行走,身上没有毛的啥啥,然后学生抓来一只鸡,把毛拔光,说,这就是人?
建议把业务规则改了先,不然还是再搞一个冗余字段比较好。

钰云 发表于 2011-8-29 10:02 | 显示全部楼层
想的还真深,视具体情况而定吧。

Jethro 发表于 2011-8-29 10:02 | 显示全部楼层
1.人就是人,兽就是兽,继承 <动物>。


2.就楼主那个例子的话提供一个 boolean 的方法返回是人还是兽

能文能武 发表于 2011-8-29 10:03 | 显示全部楼层
factory中的某个属性

叫我小乖 发表于 2011-8-29 10:03 | 显示全部楼层

Come on! 现在讨论的不是代码实现,而是一种比较常见的设计上的问题。


池中物 写道
1.人就是人,兽就是兽,继承 <动物>。


2.就楼主那个例子的话提供一个 boolean 的方法返回是人还是兽


北大青鸟 发表于 2011-8-29 10:03 | 显示全部楼层
chenjianjx 写道

Come on! 现在讨论的不是代码实现,而是一种比较常见的设计上的问题。


池中物 写道
1.人就是人,兽就是兽,继承 <动物>。


2.就楼主那个例子的话提供一个 boolean 的方法返回是人还是兽



你设计不是为了实现?
使用factory模式生成不同的类型....
用类型本身来区分
类型内不再冗余这个属性

shmilyyu 发表于 2011-8-29 10:03 | 显示全部楼层
你没仔细看原贴嘛。


“但在大型团队里,这个规矩很难执行;因为很多人对业务层的重用并没有什么概念,他们会直接绕道去找数据库;而且即使他们愿意重用业务接口,在项目紧张时也懒得去找相应的接口规格,因为他们根本不知道这个接口是否存在,也不知道应该去找谁问这个问题。”



抛出异常的爱 写道
chenjianjx 写道

Come on! 现在讨论的不是代码实现,而是一种比较常见的设计上的问题。


池中物 写道
1.人就是人,兽就是兽,继承 <动物>。


2.就楼主那个例子的话提供一个 boolean 的方法返回是人还是兽



你设计不是为了实现?
使用factory模式生成不同的类型....
用类型本身来区分
类型内不再冗余这个属性


fossil 发表于 2011-8-29 10:03 | 显示全部楼层
chenjianjx 写道
你没仔细看原贴嘛。


“但在大型团队里,这个规矩很难执行;因为很多人对业务层的重用并没有什么概念,他们会直接绕道去找数据库;而且即使他们愿意重用业务接口,在项目紧张时也懒得去找相应的接口规格,因为他们根本不知道这个接口是否存在,也不知道应该去找谁问这个问题。”



抛出异常的爱 写道
chenjianjx 写道

Come on! 现在讨论的不是代码实现,而是一种比较常见的设计上的问题。


池中物 写道
1.人就是人,兽就是兽,继承 <动物>。


2.就楼主那个例子的话提供一个 boolean 的方法返回是人还是兽



你设计不是为了实现?
使用factory模式生成不同的类型....
用类型本身来区分
类型内不再冗余这个属性



“懒得去找相应的接口规格”某种意义上说就是一种失职吧?

yoyo 发表于 2011-8-29 10:03 | 显示全部楼层
这里要区分理想情况和现实情况。 一个上百人的大型团队,里面再分几个小型团队,大家的开发风格迥异,对软件复用的理解水平也参差不齐.......




elam 写道

“懒得去找相应的接口规格”某种意义上说就是一种失职吧?

您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-27 17:41 , Processed in 0.130972 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表