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

java boolean函数_小论“Boolean参数作为入参”的函数相关推荐

  1. SpringMVC自动将请求参数和入参对象的属性进行一一绑定;要求请求参数的名字和javaBean入参的对象里面的属性名是一样的||员工的增删改查案例

    SpringMVC自动将请求参数和入参对象的属性进行一一绑定:要求请求参数的名字和javaBean入参的对象里面的属性名是一样的 1.SpringMVC中配置HiddenHttpMethodFilte ...

  2. java length()函数_小猿圈介绍java函数式编码结构及优势

    对于java大家都已经不陌生了吧,今天小猿圈Java讲师就分享一篇关于java函数式编码结构及优势的知识点,希望对于学习java的你有一定的帮助,想学习就需要积累. 探讨三种下一代JVM语言:Groo ...

  3. callback函数_小程序不同页面的异步回调,callback和promise的使用讲解

    发个扫盲贴,大神请绕道.最近好多同学问我如何再请求数据成功后直接使用数据.我们通常的做法就是在请求成功后,再调用我们定义的方法,进而使用数据.如下代码 onLoad() {let that=thisw ...

  4. dumpbin发现没有入口函数_详解VS2019 dumpbin查看DLL的导出函数

    之前有人问过ViewDLL这些软件在哪下载.实际上使用VS就可以查看DLL的导出接口. 1.先打开VS内部的Power Shell 2.打开以后应该如下图所示,首先输入dumpbin查看下用法: 3. ...

  5. python一些常用函数_【python】常用的一些内置函数

    1.cmp cmp(A,B)函数,比较A,B的大小,如果A大于B,返回1,A小于B返回-1,A等于B返回0 print cmp(12,33) >>>-1 print cmp(&quo ...

  6. python max函数_使用'key'和lambda表达式的python max函数

    小编典典 lambda是一个匿名函数,它等效于: def func(p): return p.totalScore 现在max变成: max(players, key=func) 但是由于def语句是 ...

  7. python avg函数_学习python第三天之多行函数

    多行函数:(聚合函数/分组函数) 解释:多条数据进入,单条结果出来(多进单出) 1).max(obj):最大值 2).min(obj):最小值 3).sum(num):求和 4).avg(num):求 ...

  8. python 函数的调用的时候参数的传递_python定义函数时的参数调用函数时的传参...

    一.定义函数: 1.位置参数:直接定义参数 2.默认参数(或者关键字参数):参数名 = "默认值" 3.位置参数必须在默认参数之前 二.调用函数: 1.按位置传,直接写参数的值 2 ...

  9. python 编译函数_在Python的Django框架中编写编译函数

    当遇到一个模板标签(template tag)时,模板解析器就会把标签包含的内容,以及模板解析器自己作为参数调用一个python函数. 这个函数负责返回一个和当前模板标签内容相对应的节点(Node)的 ...

最新文章

  1. 为了撩妹用Python做了一个办公小工具,她说棒极了
  2. HTML 特殊符号编码对照表
  3. C++并发编程线程间共享数据std::future和sd::promise
  4. 双向多点路由重分布--如何防止路由环路以及次优路径
  5. Git/码云上多人协作,创建分支,上传修改
  6. linux task进程跟踪,如何对Hadoop作业的某个task进行debug单步跟踪
  7. c++ array 模板类使用
  8. UIScrollView 滚动视图 (实例)
  9. mysql 主主切换_mysql 主-主配置中进行切换
  10. CCF CSP 201604-1 折点计数
  11. java web 教程_Java Web服务教程
  12. 《Android游戏编程入门经典》——4.6节问与答
  13. 掘金企服:ICP经营许可证和ICP备案的区别 1
  14. Invalid vnode type when creating vnode: undefined. vue 3.2版本错误解决
  15. java 容器都有哪些?
  16. word中删除脚注中的横线
  17. 格兰杰检验的基本步骤_【Stata教程】格兰杰因果检验
  18. 独家专栏 | 为什么国外的无人驾驶原型车,都选择混动车型?
  19. 亮风台提出基于图形匹配的可变形表面跟踪新算法 | ICCV 2019
  20. Java中关于字符串特别有意思的事

热门文章

  1. Java框架-SpringMVC的应用(json数据交互、控制器方法返回值、文件上传)
  2. PS 学习笔记 08-矩形工具组
  3. js如何获得系统时间年月日时分秒
  4. 关于PPT模板的制作
  5. php扩展Imagick
  6. C++类对象到底占多大存储空间呢
  7. 如何才能写出让领导都喜欢的项目会议纪要?
  8. 2022 年全国硕士研究生入学统一考试英语(一)试题
  9. 恩智浦小白四轮组中线提取
  10. 服务器与交换机连接及校园网搭建方案