API 设计 – 避免使用Boolean参数

这篇文章描述了在API设计中使用Boolean类型作为参数基本上都是错误的,仅仅除了少量例外:
http://ariya.ofilabs.com/2011/08/hall-of-api-shame-boolean-trap.html?utm_source=rss&utm_medium=rss&utm_campaign=hall-of-api-shame-boolean-trap

比如,如果不看API文档,你能猜出下面的调用是什么意思吗?

  • widget.repaint(false);
  • widget.destroy(false);
实际上,上面的两个boolean参数的含义都是是否立即执行(刷新和销毁)。
我自己还记得以前在使用MFC的时候,MFC有一个update函数,用于同步UI组件上显示的值和它绑定的变量。它接收一个Boolean参数控制同步的方向,你可以修改变量后调用update去更新跟它绑定的UI组件上的显示,或者修改UI组件的值后调用update去更新它绑定的变量的值,但是到现在我都记不清到底true对应的是哪个方向,false对应的又是哪个方向,实际编程中也常常用错。
下面是一些少数可以考虑使用Boolean类型做为参数的例子,主要用于Boolean类型的属性设置:
  • dialogBox.setVisible(true)
  • component.setEnabled(true)
不过也要考虑是否有双重否定的副作用,比如到底是setEnabled(true)还是setDisabled(false),需要选择哪个更符合第一直觉的(上面的例子setEnabled比setDisabled更好),总之大部分情况下使用Boolean类型作为参数都是一个API的设计错误,只有少量含义非常清晰并且无明显歧义下才可以使用。
Advertisements