千万不要把 bool 设计成函数参数

标签: 杂项资源 程序设计 编程语言 API Bool | 发表时间:2011-09-08 15:35 | 作者:陈皓 WCM
出处:http://coolshell.cn

我们有很多Coding Style 或 代码规范。但这一条可能会经常被我们所遗忘,就是我们经常会在函数的参数里使用bool参数,这会大大地降低代码的可读性。不信?我们先来看看下面的代码。

当你读到下面的代码,你会觉得这个代码是什么意思?

widget->repaint(false);

是不要repaint吗?还是别的什么意思?看了文档后,我们才知道这个参数是immediate, 也就是说,false代表不立即重画,true代码立即重画。

Windows API中也有这样一个函数:InvalidateRect,当你看到下面的代码,你会觉得是什么意思?

InvalidateRect(hwnd, lpRect,  false);

我们先不说InvalidateRect这个函数名取得有多糟糕,我们先说一下那个false参数?invalidate意为“让XXX无效”,false是什么意思?双重否定?是肯定的意思?如果你看到这样的代码,你会相当的费解的。于是,你要去看一下文档,或是InvalidateRect的函数定义,你会看到那个参数是 BOOL bErase,意思是,是否要重画背景。

这样的事情有很多,再看下面的代码,想把str中的”%USER%”替换成真实的用户名:

str.replace("%USER%", user, false);   // Qt 3

TNND,那个false是什么意思?不替换吗?还是别的什么意思,看了文档才知道,false代码大小写不敏感的替换。

其实,如果你使用枚举变量/常量,而不是bool变量,你会让你的代码更易读,如:

widget->repaint(PAINT::immediate);
widget->repaint(PAINT::deffer);

InvalidateRect(hwnd, lpRect,  !RepantBackground);

str.replace("%USER%", user, Qt::CaseInsensitive); // Qt 4

如果对这个事不以为然的话,我们再来看一些别的示例,你不妨猜猜看看下面的代码:

component.setCentered(true, false);

这什么玩意儿啊?看了文档你才知道,这原来是 setCentered(centered, autoUpdate);

new Textbox(300, 100, false, true);

这又是什么啊?看了文档才知道,这是创建一个文本框,第三个参数是是否要滚动条,第四个是是否要自动换行。TNND。

上面的情况还不算最差,看看下面的双重否定。

component.setDisabled(false);
filter.setCaseInsensitive(false)

再来一个,如果你读到下面的代码,相信你会和我一样,要么石化了,要么凌乱了。

event.initKeyEvent("keypress", true, true, null, null,
                    false, false, false, false, 9, 0); 

看完这篇文章,我希望你再也不要把bool为作为函数参数了。除非两个原因:

  1. 你100%确认不会带来阅读上的问题,比如Java的 setVisible (bool).
  2. 你100%确认你想去写出无法维护很难阅读的代码

【更新2011/9/8】当然,别的参数也会有一样的问题,比如:new Textbox(300, 100, false, true);中的300 和 100,不知道是坐标还是长宽,只不过,一般长度或坐标这样的参数都不会被hard code,都会有变量名,而bool这种参数经常性地被传成true 和 false。 bool参数表现得更为明显一些罢了。

所以,程序中不要出现magic number,true/false 也是一种 magic number。但是,我想告诉大家,从API设计的角度来说,你无法强制调用者用常量来取代true/false,定义成枚举类型是最好的选择

最后,如果你想设计一个好的API,强烈推荐你读一下Nokia的Qt的《API Design Principles》,本文就是其中的“Boolean Trap”。

(全文完)

相关文章

相关 [千万 bool 设计] 推荐:

千万不要把 bool 设计成函数参数

- WCM - 酷壳 - CoolShell.cn
我们有很多Coding Style 或 代码规范. 但这一条可能会经常被我们所遗忘,就是我们经常会在函数的参数里使用bool参数,这会大大地降低代码的可读性. 当你读到下面的代码,你会觉得这个代码是什么意思. 看了文档后,我们才知道这个参数是immediate, 也就是说,false代表不立即重画,true代码立即重画.

千万级pv高性能高并发网站架构与设计(转)

- - BlogJava-
高并发访问的核心原则其实就一句话“把所有的用户访问请求都尽量往前推”. 如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不能让他们的请求一下打到我们的指挥部(指挥部就是数据库及分布式存储). 如:能缓存在用户电脑本地的,就不要让他去访问CDN. 能缓存CDN服务器上的,就不要让CDN去访问源(静态服务器)了.

没实力,千万别装B!

- BIgFish library - 乐淘吧
今天餐馆有两伙人打架,其他无关的人都跑掉了,只有我没有离开座位,微笑的看着他们. 突然有一个人指着我说:打他们丫老大. 我刚要说我不是,一个酒瓶子就把我头打开了花. 另一伙看他们在打不认识的人竟然也不帮忙. 我快被打半死时pol.ice来了,还把我当成主犯拉回去审讯. 我现在悟出了一个非常深刻的道理,就是:没实力,千万别装B!.

薄书记,您可千万别走啊

- 总 - 非常日报

Google+用户达到1千万

- fx_wonder - Solidot
Google+社交服务没有因为某些国家的屏蔽而放慢增长步伐,用户数量预计在今明两天内超过一千万,如果Google+继续开放邀请,到本周末将增长到2千万. Ancestry.com 创始人Paul Allen称,截至7月10日,全世界Google+用户达到了730万,而7月4日的用户数为170万,6天内增长了350%,他预测美国时间7月11日晚Google+用户达到950万,7月12日突破一千万.

千万不要搞IT的十大理由

- ayoya - cnBeta.COM
搞IT有很多好处——但是审时度势一下,你也许会考虑别的职业选择. Jack Wallen 阐述了哪些影响因素会成为压垮某些IT人士的最后一根稻草. 有谁起码有那么一两次快想不干了的. IT的压力,没有最大,只有更大,路人皆知. 更为不幸的是,大学并没有教你度过并坚守这些岁月的应对机制. 我们来看看有哪些原因会导致你决意离开所挚爱的IT行业.

千万值表数据量优化

- - 数据库 - ITeye博客
1、利用工具进行数据插入、查询试验,目标是单表数据超过1000W条记录. 2、针对单个表创建单独的数据存储空间和索引存储空间. 1 数据插入与数据量大小无关,与数据表是否在大量并行操作有关. 2 数据查询与表的数据存储空间有很大关系,数据量大的表建议单独创建数据存储空间和索引存储空间. 3 数据查询结果集的大小与查询性能有很大关系,如在普通索引下,查询结果大与小耗时差别接近1000倍以上.

苹果宣布向雅安地震灾区捐款五千万,三星六千万

- - Solidot
苹果公司宣布向雅安地震灾区捐款5000万人民币,并为部分灾区学校提供全新苹果设备. 苹果最大代工厂富士康也宣布捐款五千万,而苹果主要竞争对手三星则在今天宣布向雅安震区捐款6000万元人民币,并将在中国的三星工厂和关联公司开展募捐活动. Google则在地震发生之后推出了寻人服务. 周六发生的雅安地震至今共造成了188人死亡,一万余人受伤.

为了设计而设计

- - 幻风阁|kent.zhu'sBlog
我有个习惯,每天晚上睡前会搜罗一遍最新的App用用. 最开始的时候ios的App还相对比较朴实,强调功能的实用性,后来不知何故吹起一阵ios的App必须足够精美的怪风. 于是乎,各类App纷纷上演换装游戏,一个比一个做的精美,即使是一个很工具性的应用也把自己浓妆艳抹的往坐台小姐的风格搞……. 上周末跟Tony和Angela在下厨房喝茶闲聊,我说目前的移动产品设计可以分为2类,一类是做给用户用的,一类是做给设计师们欣赏与收藏的.