当前位置: 首页 > 编程日记 > 正文

千万不要把 bool 当成函数参数

我们有很多 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为作为函数参数了。除非两个原因:

  • 你 100% 确认不会带来阅读上的问题,比如 Java 的 setVisible (bool).
  • 你 100% 确认你想去 写出迷一样的代码。

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

原文链接:http://coolshell.cn/articles/5444.html

转载于:https://www.cnblogs.com/lanzhi/archive/2012/11/15/6468249.html

相关文章:

修改ceph-disk源码,增加指定ceph.conf部署osd的功能

文章目录 ceph环境源码修改 主文件:`ceph-disk/main.py`main函数入口parse_args(argv)增加子命令解析get_conf函数使`conf`生效修改所有调用get_conf函数的上级函数参数配置由于最近工作中需要优化osd部署流程,单节点并发加盘过程需要指定特定conf文件,来完成单盘db,wal分区…

相关计算机专业的英语文献,英文文献及翻译计算机专业.doc

英文文献及翻译计算机专业外文资料翻译—英文原文NET-BASED TASK MANAGEMENT SYSTEMHector Garcia-Molina, Jeffrey D. Ullman, Jennifer WisdomABSTRACTIn net-based collaborative design environment, design resources become more and more varied and complex. Besides c…

作业 3 应用分支与循环结构解决问题 统计字符个数

/*统计字符&#xff0c;包括空格或回车&#xff0c;数字字符和其他字符*/#include<stdio.h> int main(void) {int digit,space,letter,other; /*定义4个变量分别存放统计结果*/ char ch;int i;digitspaceletterother0; /*置…

php后期静态绑定

从php5.3开始&#xff0c;php增加了一个叫后期绑定的功能&#xff0c;用于在继承范围内引用静态调用的类 该功能从语言内部角度考虑北命名为“后期静态绑定”&#xff1b;“后期绑定”意思说&#xff1a;static&#xff1a;&#xff1a;不再被解析为定义当前方法所在的类&#…

pytest 9 pytest-datadir读取文件信息

安装&#xff1a;pip install pytest-datadir 介绍&#xff1a;用于操作测试数据目录和文件的插件。pytest-datadir他会寻找包含测试模块名字的文件夹或者全局的一个文件夹名字为data下的数据。比如以下的一个结构&#xff1a; firstdemo.py可以从test_firstdemo文件夹下的文件…

深入理解ceph-disk activate 源码逻辑

文章目录CEPH-DISK代码逻辑Activate osd的主要逻辑如下DEF main_activate激活osd的入口函数DEF mount_activate挂载临时目录&#xff0c;分配osd id并初始化osdDEF activate 分配osd_id以及初始化osdCEPH-DISK代码逻辑 本文在上文 :深入理解ceph-disk prepare 源码逻辑基础上描…

simple_html_dom meta,HTML DOM Meta content 属性

HTML DOM Meta content 属性Meta 对象定义和用法content 属性可设置或者返回 meta 元素 content 属性值。content 属性指定了 meta 信息的内容。注意&#xff1a; 这个属性可用的值依赖于name 和httpEquiv 属性的值。语法设置 content 属性&#xff1a;linkObject.content"…

struts2登录后返回登录前的页面

在Action中添加 String getUrl&#xff08;&#xff09; &#xff5b; return ServletActionContext.getRequest().getHeader("referer"); &#xff5d; 然后配置struts的这个Action的result为&#xff1a;<result type"redirect">${url}</resu…

Exchange 2010 恢复误删除的邮箱账户及其邮箱

在误删除邮箱后&#xff0c;AD中相应的账号也会随之删除&#xff0c;此时该如何恢复&#xff1f; 先来模拟邮箱被误删除&#xff0c;在EMC控制台中删除别名为jqq的邮箱 打开ADUC&#xff0c;发现相应的jqq账号也被删除了: 1.恢复AD账号 下载运行ADRecycle Bin&#xff0c;点击【…

Python 函数初识 (1)

一、今日主要内容 认识函数 函数:对功能或者动作的封装(定义) 语法: def 函数名字(形参) 函数体 函数的调用格式:函数名(实参) 函数的返回值 关键字:return 终止函数的运行 1、函数内部不写return,默认函数末尾返回…

python的popen函数

最近了解了一下python的popen函数的使用&#xff0c;主要是用来执行linux命令 函数使用 使用之前需要导入import os模块 使用方式: os.popen(cmd)返回值: 返回一个文件句柄 import os cmd"/sbin/partx /dev/sdb" result_listos.popen(cmd) print result_list执行…

计算机竞赛CCC可以直接学吗,CCC 计算机竞赛到底有多牛!

加拿大计算机竞赛是什么&#xff1f;难度情况&#xff1f;加拿大计算机竞赛是由加拿大滑铁卢大学主办的&#xff0c;每年举办一次&#xff0c;是一场面向中学生的计算机程序设计比赛&#xff0c;CCC竞赛的一个目的是为广大中学生朋友们提供一个机会来测试自己分析、设计以及编程…

PHP basename() 函数

定义和用法 basename() 函数返回路径中的文件名部分。 语法 basename(path,suffix) 参数描述path必需。规定要检查的路径。suffix可选。规定文件扩展名。如果文件有 suffix&#xff0c;则不会输出这个扩展名。转载于:https://www.cnblogs.com/wuyou/p/3387079.html

真实工作经验总结——案例解析企业选型操作步骤

这是一个融合了本人以前工作经验的案例&#xff0c;包含有多个企业的选型需求。选型的过程也参考了本人以前所经历的部分事实。展现的目的在于让PUBer看到一个相对真实的选型。企业介绍这是一家中型的电脑和周边设备生产企业&#xff0c;即一个典型的电子企业。企业有内贸和外贸…

Oracle Goldengate Windows平台Oracle-Oracle单向复制

实验目的 Goldengate最基本的从源端一对一的单向复制&#xff0c;注意其中Goldengate版本取决于Oracle的版本。单向复制一般适用于保持目标数据库的实时更新&#xff0c;且目标数据库用来检索&#xff0c;如报表或者分析使用。 Source DB 操作系统&#xff1a;Windows 10 64 Or…

C语言解析命令行函数:getopt系列

头文件&#xff1a;/usr/include/getopt.h 函数传入较长参数 函数getopt_long_only和getopt_long两者用法差不多&#xff0c;都可以用来解析命令行选项 函数出处 #include <getopt.h> //getopt_long()头文件位置 int getopt_long (int ___argc, char *const *___ar…

宁波大学计算机专业复试,2016年宁波大学信息科学与工程学院计算机专业考研复试题库. (1)...

2016年宁波大学信息科学与工程学院计算机专业考研复试题库(二)——————————————————————————————————————————一、选择题1&#xff0e;下列有关浮点数加减运算的叒述中&#xff0c;正确的是()。对阶操作丌会引起阶码上溢戒下溢右规和尾…

RedHat、CentOS设置静态IP、主机名、关闭防火墙(虚拟机VMware客户机)

设置静态IP、主机名 1. /etc/sysconfig/network [roothadoop ~]# vi /etc/sysconfig/network NETWORKINGyes HOSTNAMEhadoop #主机名 GATEWAY192.168.80.1 #网关 2. /etc/sysconfig/network-scripts/ifcfg-eth0 [roothadoop ~]# vi /etc/sysconfig/network-scripts/ifc…

关于box2d相关学习教程记录一下

Box2D 2.0.1版本 认识Box2D世界掉落的苹果——b2Body刚体创建圆形刚体创建静止不动的刚体在运行时创建刚体刚体的上衣——b2BodyDef.userDataBox2D能再简单点吗——LDEasyBox2D让刚体听我的——ApplyForce、ApplyImpulse、SetLinearVelocity创建多边形刚体创建圆角刚体给圆角刚…

韦东山网课https://edu.csdn.net/course/play/207/1117

接口讲解https://edu.csdn.net/course/play/207/1117转载于:https://www.cnblogs.com/chulin/p/9878555.html

使用dd查看磁盘前4个扇区的内容

想要获取磁盘前四个扇区的内容可以先将扇区内容从磁盘dd出来&#xff0c;使用如下命令 dd if/dev/sdb ofmbr.txt bs1 count2048 改命令将sdb磁盘的前2048个字节内容即4个扇区内容备份到文件mbr.txt里面。 其中bs为块大小1即为1个字节&#xff0c;count表示块个数&#xff0c;即…

在SharePoint 2010使用OWA查看自己邮箱的内容

在SharePoint 2010使用OWA 背景: 利用 Outlook Web Access Web 部件&#xff0c;可以在 SharePoint 网站中显示从 Microsoft Exchange Server 2003 至 2007 电子邮件帐户中的文件夹中选择的内容. 这些 Web 部件连接到您的组织的 Office Outlook Web Access 服务器&#xff0c;而…

北京大学深圳研究生院计算机学什么,2018年北京大学深圳研究生院408计算机学科专业基础综合之计算机操作系统考研核心题库...

一、选择题1&#xff0e; 下列选项中&#xff0c;降低进程优先权级的合理时机是( )。A. 进程的时间片用完B. 进程刚完成I/O操作&#xff0c;进入就绪列队C. 进程长期处于就绪列队D. 进程从就绪状态转为运行态【答案】A【解析】本题的解答关键在于找出哪个选项中的进程应当被赋予…

网络瓶颈、线程死锁、内存泄露溢出、栈堆、ajax

网络瓶颈&#xff1a;网络传输性能及稳定性的一些相关元素 线程死锁&#xff1a;多个线程因竞争资源造成的一种僵局 下面我们通过一些实例来说明死锁现象。 先看生活中的一个实例&#xff0c;2个人一起吃饭但是只有一双筷子&#xff0c;2人轮流吃&#xff08;同时拥有2只筷子才…

g-gdb调试core文件

文章目录core文件判读是否为core文件打开系统 core dump修改core文件的保存路径gdb调试core文件最近初步了解了一下core 文件&#xff0c;已经如何将gdb工具与core文件结合调试出现段错误的程序core文件 core是指操作系的程序统核心。当我们的程序在操作系统上运行异常崩溃时&…

信息整合的讨论案例

我所在的公司是广州的一个大型国有企业&#xff0c;目前所用的信息管理系统包括企业管理的方方面面&#xff0c;大约有7到8个互相独立的信息系统&#xff0c;这些系统都是在7、8年前就已经投入使用了&#xff0c;完全自主开发和维护&#xff0c;所用的工具是delphi&#xff0b;…

html中sprite标签,Three.js模型标签

Three.js模型标签在很多的实际的项目中&#xff0c;你可能需要给一个Three.js的模型添加标签&#xff0c;标签可以通过一个包含文字图形信息的HTML元素或者一个three.js的精灵模型来表示。层级模型复杂的项目&#xff0c;一个three.js场景往往包含包含多个模型对象&#xff0c;…

D3D11中的硬件反锯齿 SSAA/MSAA/EQAA/CSAA(3)

五 、EQAA/CSAA EQAA(enhanced quality AA)和CSAA(coverage sample AA)其实是同样的采样技术&#xff0c;EQAA是AMD的实现&#xff0c;CSAA是NV的实现&#xff0c;下面我以EQAA为例看看这两种AA的原理&#xff1a; 在MSAA中&#xff0c;每个采样都有一个sample color缓冲相对应…

[ python ] 类的组合

首先&#xff0c;使用面向对象是一个人狗大战的实例&#xff1a; class Person:def __init__(self, name, hp, aggr, sex):self.name nameself.hp hpself.aggr aggrself.sex sexdef hit(self, dog):dog.hp - self.aggrprint(\033[31;1m%s被打&#xff0c;掉了%s的血.\033[0…

ceph nautilus相对于minic的主要改动

改动信息 详情可以查看ceph官网nautilus Dashboard功能 增加的新功能 支持多用户使用SSO的用户验证模式支持审计模式新的登录页&#xff0c;可以展示更多的集群健康指标使用swagger api的rest api文档 增加的新的管理特性 对于OSD的管理&#xff08;将osd标记为down,out,修…