《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参数作为入参”的函数的更多相关文章

  1. Python接口测试(第一个接口返回的数据作为第二个参数的入参)

    python代码如下 import requests url1="http://localhost:8080/pinter/com/getSku?id=1" respon=requ ...

  2. C语言函数入参压栈顺序为什么是从右向左?

    看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...

  3. Oracle存储过程入参传入List集合的小例子

    第一步:创建一个对象类型 create or replace type STUDENT as object( id ), name ), age ) ); / 第二步:创建一个数组类型 (任意选择下面 ...

  4. springMVC如何判断入参是默认参数还是请求传过来的参数?

    springMVC如何判断入参是默认参数还是请求传过来的参数?

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

    需求:查询出指定性别和用户角色列表下的用户列表信息 实际上:mybatis在入参的时候,都是将参数封装成为map集合进行入参的,不管你是单参数入参,还是多参数入参,都是可以封装成map集合的,这是无可 ...

  6. springMVC使用map接收入参 + mybatis使用map 传入查询参数

    测试例子: controllel层 ,使用map接收请求参数,通过Debug可以看到,请求中的参数的值都是字符串形式,如果将这个接收参数的map直接传入service,mybatis接收参数时会报错, ...

  7. SpringBoot2 参数管理实践,入参出参与校验

    一.参数管理 在编程系统中,为了能写出良好的代码,会根据是各种设计模式.原则.约束等去规范代码,从而提高代码的可读性.复用性.可修改,实际上个人觉得,如果写出的代码很好,即别人修改也无法破坏原作者的思 ...

  8. SpringValid优雅校验入参

    一.简介 后台业务入口类Controller,对于入参的合法性校验,可以简单粗暴的写出一堆的 if 判断,如下: @RestController @RequestMapping("user& ...

  9. js的replace函数入参为function时的疑问

    近期在写js导出excel文件时运用到replace方法,此处详细的记录下它各个参数所代表的的意义. 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式 ...

随机推荐

  1. swift--Timer实现定时器功能,每个一段时间执行具体函数,可以重复,也可以只执行一次

    1,创建 //控制器 timer = Timer.scheduledTimer(timeInterval: 0.001, target: self, selector: #selector(Fifte ...

  2. swift - UILabel的用法

    1.label的声明 class FirstyViewController: UIViewController { var label = UILabel()//初始化 override func v ...

  3. @property装饰器的用法【python】

    转自:http://www.jb51.net/article/65052.htm python官方介绍:https://docs.python.org/release/2.6/library/func ...

  4. linux下jdk,tomcat的安装

    一.安装jdk 1.jdk下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.ht ...

  5. 在js中通过call或者apply实现继承

    通过call或者apply可以实现函数里面this的改变,利用这一特点,可以实现继承 代码如下所示: /*父类*/ function Parent(add,net,no,teacher) { this ...

  6. poj_3468 伸展树

    题目大意 一个数列,每次操作可以是将某区间数字都加上一个相同的整数,也可以是询问一个区间中所有数字的和.(这里区间指的是数列中连续的若干个数)对每次询问给出结果. 思路 1. 伸展树的一般规律 对于区 ...

  7. $.data(elem, key, val) 和 elem.data(key, val)

    var div1 = $("div"),     div2 = $("div"); 1.     div1.data("key", &quo ...

  8. setTimeout原来有这种用途

    setTimeout有两个参数,第一个是需要执行的函数,第二个是将该函数推入UI队列的时间. 需要注意的两点: 1.第二个参数中设置的时间,是从执行setTimeout开始计算,而不是从整个函数执行完 ...

  9. UINavigationController和UITabBarController

    UINavigationController和UITabBarController 目录 概述 UINavigationController UITabBarController 实用功能 待解决 概 ...

  10. 使用log4net记录日志到数据库(含有自定义属性)

    记录日志是管理系统中对用户行为的一种监控与审核,asp.net中记录日志的方式有很多种,这里我只介绍一下最近用到的log4net,关于他的具体介绍网上有很多,我讲一下他的用法. 第一步:在配置文件中的 ...