bool当成函数参数错误理解

时间:2021-07-30 09:27:18 

我们有很多 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 3TNND,那个 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”。

标签:bool,函数
0
投稿

猜你喜欢

  • java实现简单的webservice方式

    2023-11-25 03:59:58
  • java设计模式--三种工厂模式详解

    2023-11-29 09:54:06
  • java 获取字节码文件的几种方法总结

    2023-11-29 15:17:57
  • vue+springboot前后端分离工程跨域问题解决方案解析

    2023-08-06 06:51:10
  • 深入理解Java虚拟机体系结构

    2021-09-15 19:46:53
  • SpringMVC拦截器创建配置及执行顺序

    2023-06-06 20:41:16
  • Android自定义带圆点的半圆形进度条

    2023-08-05 07:47:15
  • Java C++实现相同MD5加密算法的方式

    2023-10-12 12:26:02
  • gson对象序列化的示例

    2023-11-25 08:54:28
  • Android中使用TextView实现文字跑马灯效果

    2023-07-28 11:07:33
  • 解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题

    2021-12-02 19:44:29
  • Android异常 java.lang.IllegalStateException解决方法

    2023-07-28 10:26:36
  • java 引用类型的数据传递的是内存地址实例

    2023-11-29 15:13:53
  • 解决maven没有打包xml文件的问题

    2023-11-27 14:51:01
  • 在Maven下代理服务器设定的方式

    2023-10-15 02:17:13
  • jQuery 动画效果代码分享

    2023-11-24 00:10:12
  • Springboot 如何指定获取出 yml文件里面的配置值

    2022-08-29 21:04:48
  • spring-cloud-gateway动态路由的实现方法

    2021-07-25 15:24:37
  • 解析Java和Eclipse中加载本地库(.dll文件)的详细说明

    2023-11-11 01:23:31
  • java 动态 代理的方法总结

    2023-08-25 04:00:33
  • asp之家 软件编程 m.aspxhome.com