小论“Boolean参数作为入参”的函数
《Clean Code》一书中对于如何写好函数有着很动人的描写,其中对于函数参数的建议有如下两点:
- 函数参数的数量应该尽可能少
- 给一个一元函数传入bool类型的参数很“罪恶”
昨天在浏览Hacker News的时候恰好发现一篇文章提到了上面的第2点,即有关“Boolean参数”的讨论。所以结合此篇文章,略作小结加深印象。
对于《Clean Code》在3.6.2当中的描述,给一个函数传入Boolean参数其实也就是很明显的宣称该函数不止做一件事情,这和该书当中所倡导的“函数只做一件事情”显然是相违背的。尽管如此,就并没有丰富编码经验的自己而言,这一点多少是没有让我非常“印象深刻”。相反的,我曾经还极其认真的写过这样的函数,因为那个函数如此实现看起来多少有些风韵,能够"以一敌双"不是非常cool的做法嘛,并且那个函数本身很短小,自己压根没有想过把它分作两个函数来写—— 或许在之后,碰到类似的情况时就会略作斟酌了。
如上提到的文章,标题为“Boolean parameters to API functions considered harmful”。显然地,作者也是提到了给一个函数塞入Boolean参数是一种不可取的做法,因为当一个函数作为API的时候,使用者很难将true/false与具体API当中实现的功能对应起来,如文中的举例:
// open的第三个参数为Boolean类型,确定是否以async/sync的方式打开,但是option当中的值未必与open内部的操作相对应。
_xhr.open(options.type, options.url, options.sync);
// AddObserver的第三个参数为Boolean类型,其对应的true/false具体意味着什么显得很模糊
mDocument->AddObserver(observer, "load", true);
而对其进行优化之后便可以这样:
// 此时openAsync很明显的告之了以async的方式打开。
xhr.openAsync(options.type, options.url)
// 接口AddWeakObserver提示了增添weak的Observer
mDocument.AddWeakObserver(observer, "load");
对比如上的两个例子,后者看起来更为清晰,其函数直接表达了接口的主要权责,这也是Clean Code一书当中所建议的做法。当然,对于这种做法是不是一定必要,就得因人而异,因各团队而不同了。举出反例来证明这种方式的不必要是很简单的事,就比如作者文中的 setVisiblity(false)一样。
总而论之,就个人而言,在函数命名与接口设计上面多作考虑,使代码更为自然和清晰是一件需要去追求和学习的事情。另外不得不提的是,当前的这种建议,仅仅对于自己略知的强类型语言C/C++/Java,其他语言是否有所特殊之处,另当别论。
小论“Boolean参数作为入参”的函数的更多相关文章
- Python接口测试(第一个接口返回的数据作为第二个参数的入参)
python代码如下 import requests url1="http://localhost:8080/pinter/com/getSku?id=1" respon=requ ...
- C语言函数入参压栈顺序为什么是从右向左?
看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...
- Oracle存储过程入参传入List集合的小例子
第一步:创建一个对象类型 create or replace type STUDENT as object( id ), name ), age ) ); / 第二步:创建一个数组类型 (任意选择下面 ...
- springMVC如何判断入参是默认参数还是请求传过来的参数?
springMVC如何判断入参是默认参数还是请求传过来的参数?
- mybatis框架之多参数入参--传入Map集合
需求:查询出指定性别和用户角色列表下的用户列表信息 实际上:mybatis在入参的时候,都是将参数封装成为map集合进行入参的,不管你是单参数入参,还是多参数入参,都是可以封装成map集合的,这是无可 ...
- springMVC使用map接收入参 + mybatis使用map 传入查询参数
测试例子: controllel层 ,使用map接收请求参数,通过Debug可以看到,请求中的参数的值都是字符串形式,如果将这个接收参数的map直接传入service,mybatis接收参数时会报错, ...
- SpringBoot2 参数管理实践,入参出参与校验
一.参数管理 在编程系统中,为了能写出良好的代码,会根据是各种设计模式.原则.约束等去规范代码,从而提高代码的可读性.复用性.可修改,实际上个人觉得,如果写出的代码很好,即别人修改也无法破坏原作者的思 ...
- SpringValid优雅校验入参
一.简介 后台业务入口类Controller,对于入参的合法性校验,可以简单粗暴的写出一堆的 if 判断,如下: @RestController @RequestMapping("user& ...
- js的replace函数入参为function时的疑问
近期在写js导出excel文件时运用到replace方法,此处详细的记录下它各个参数所代表的的意义. 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式 ...
随机推荐
- mybatis由浅入深day01_3mybatis框架介绍
3 mybatis框架 3.1 mybatis是什么? mybatis是一个持久层的框架,是apache下的顶级项目. mybatis托管到goole code下,再后来托管到github下(http ...
- HTML&CSS精选笔记_列表与超链接
列表与超链接 列表标记 无序列表ul 无序列表的各个列表项之间没有顺序级别之分,是并列的 <ul> <li>列表项1</li> <li>列表项2< ...
- laravel 发送邮件
1)邮件配置(config/mail.php 配置文件) MAIL_DRIVER 邮箱驱动,laravel 支持 "smtp", &qu ...
- Python 入门(三)整数和浮点数+布尔类型
整数和浮点数 Python支持对整数和浮点数直接进行四则混合运算,运算规则和数学上的四则运算规则完全一致. 基本的运算: 1 + 2 + 3 # ==> 6 4 * 5 - 6 # ==> ...
- fgetc read缓冲机制区别
read属于系统调用,它的缓存是基于内核的缓冲,是记在内核空间的. 而fgetc是标准函数, 是在用户空间I/O缓冲区的 比如用fgetc读一个字节,fgetc有可能从内核中预读1024个字节到I/O ...
- 使用reactjs遇到Warning: setState(...): Can only update a mounted or mounting component.
前端数据大部分来源于后端,需要向后端发起异步请求,而在使用reactjs的时候,如果这个组件最初加载的时候就发起这个异步请求,然后在返回结果中进行setState({}),这时候有可能会遇到这个警告: ...
- iPhone较为基础的代码片段
Iphone代码片段导航 1.给UITableViewController添加ToolBar. self.navigationController.toolbarHidden = NO; //默认是隐 ...
- hadoop错误各种原因
NoRouteToHostException 错误描述: INFO hdfs.DFSClient: Exception in createBlockOutputStream java.net.NoRo ...
- 上传图片Security Error
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjIAAACXCAIAAACA4CZ6AAAgAElEQVR4nOy96Xcd13UnugFSUrJer/ ...
- 转悠望南山 Python闲谈(二)聊聊最小二乘法以及leastsq函数
1 最小二乘法概述 自从开始做毕设以来,发现自己无时无刻不在接触最小二乘法.从求解线性透视图中的消失点,m元n次函数的拟合,包括后来学到的神经网络,其思想归根结底全都是最小二乘法. 1-1 “多线 ...