小论“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,其他语言是否有所特殊之处,另当别论。

时间: 2024-08-10 23:15:09

小论“Boolean参数作为入参”的函数的相关文章

Jmeter请求响应后的数据截取特定数据并修改特定参数再下一请求中作为入参使用

1.查询用户信息,出参中包含用户id 使用jsonPath提取出用户id 2.获取任务详情,出参信息列表list要在第三步任务处理中做入参使用,但是要要修改list中的数据(如上一步提取的id) 使用beanShell PostProcessor提取获取任务详情参数并修改其中的值 3.处理任务 处理任务的入参为第二步修改后的出参,即"var_data_obj",直接在地散步引用即可: 原文地址:https://www.cnblogs.com/cjy-blog/p/10293718.ht

mybatis框架之多参数入参--传入Map集合

需求:查询出指定性别和用户角色列表下的用户列表信息 实际上:mybatis在入参的时候,都是将参数封装成为map集合进行入参的,不管你是单参数入参,还是多参数入参,都是可以封装成map集合的,这是无可非议的. /** * 需求:查询出指定性别和用户角色列表下的用户列表信息 * @param roleids * @return */ public List<User> getUserListByGender_UserRoleids(Map<String,Object> conditi

spring mvc绑定对象String转Date解决入参不能是Date的问题

使用spring的mvc,直接将页面参数绑定到对象中,对象中有属性为Date时会报错,此时需要处理下. 同样的,其他的需要处理的类型也可以用这种方法. 在controller中加入代码 @InitBinder protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { //对于需要转换为Date类型的属性,使用DateEditor进行处理 bin

Mybatis调用PostgreSQL存储过程实现数组入参传递

注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如: CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)... 1 如上所示,参数是一个int数组,Mybatis提

正则表达式提取器--jmeter将上一个请求的结果作为下一个请求的入参

接口测试时需要将不同的接口串联起来,如将登录接口的出参UserStatusToken作为获取客户列表这个接口的入参,这样才能识别你是否是合法的用户. 1.创建一个线程组 选中测试计划-->右键-->添加-->Threads(Users)-->线程组 2.创建一个获取凭证的请求 在刚刚创建的线程组上右键-->添加-->Sampler-->HTTP请求 3.创建后置处理器 选中刚才添加的HTTP请求-->右键-->添加-->后置处理器-->正则

解决WebApi入参时多对象的问题

我们的项目是用WebApi提供数据服务,且WebPage跟APP中都有调用到. WebApi提供的接口一多,就发现一个问题,我们项目中有很多接口是接收POST(安全原因,我们采用的是https)请求的,而且入参基本也就是一两个参数.在开发的后期发现WebApi中有很多对象,多到已经快到了难以管理的地步了. 比如我们的WebApi如下: 对应的入参对象是: 很难想象如果再有别的Controller的话,Models中会有多少对象,而这些对象往往使用一次,或者在一个方法中使用了一下就不再用了. 这显

shell 通过shift获得某位后的入参

有时shell的入参个数不定,想要获得第2位后的参数,作为新的入参调用其他脚本 通常这时候想到的方法是用遍历,例如下面的方法: for (( i=2;i<=$#;i++)) do echo $i done 更简便的方法:使用shift去移动参数,shift (n),默认n为1,移动的位数 shift会将n位前的入参舍弃掉,只会保留n+1以及他后面的入参 例如:shift 2,会舍弃第一位第二位入参,只保留第3位及以后的入参 执行 test.sh 1 2 3 4 5 6 7 8 9,test.sh

Jmeter 接口测试对上接口结果二次处理作为入参 Bean Shell Processor

1.线程组设置,HTTP COOKIE ,HTTP请求默认值设置,;注:Cookie主要传递登录状态 2.设置登录 http 请求 3.登录后,访问数据接口(并对数据返回值做后置处理) 4.添加二次处理相关接口 Http请求 5.对此接口进行预处理 使用Bean Shell Processor   注:本次写的代码所涉及的参数名,为3和4中的参数名,主要将3处的结果通过5处理传递给4处当做入参使用

SpringMVC确定目标方法POJO类型入参的过程

SpringMVC确定目标方法POJO类型入参的过程 访问方法 @RequestMapping("/pojoparam") public String POJOParam(User user){ return "success"; } 1,首先确定一个key值 ①如果目标方法的POJO类型的参数没有使用@ModelAttribute作为入参修饰,则key为POJO类名的第一个字母小写 例test(User user){}这样的方法key就是user ②如果使用了@M