java boolean函数_小论“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,其他语言是否有所特殊之处,另当别论。
java boolean函数_小论“Boolean参数作为入参”的函数相关推荐
- SpringMVC自动将请求参数和入参对象的属性进行一一绑定;要求请求参数的名字和javaBean入参的对象里面的属性名是一样的||员工的增删改查案例
SpringMVC自动将请求参数和入参对象的属性进行一一绑定:要求请求参数的名字和javaBean入参的对象里面的属性名是一样的 1.SpringMVC中配置HiddenHttpMethodFilte ...
- java length()函数_小猿圈介绍java函数式编码结构及优势
对于java大家都已经不陌生了吧,今天小猿圈Java讲师就分享一篇关于java函数式编码结构及优势的知识点,希望对于学习java的你有一定的帮助,想学习就需要积累. 探讨三种下一代JVM语言:Groo ...
- callback函数_小程序不同页面的异步回调,callback和promise的使用讲解
发个扫盲贴,大神请绕道.最近好多同学问我如何再请求数据成功后直接使用数据.我们通常的做法就是在请求成功后,再调用我们定义的方法,进而使用数据.如下代码 onLoad() {let that=thisw ...
- dumpbin发现没有入口函数_详解VS2019 dumpbin查看DLL的导出函数
之前有人问过ViewDLL这些软件在哪下载.实际上使用VS就可以查看DLL的导出接口. 1.先打开VS内部的Power Shell 2.打开以后应该如下图所示,首先输入dumpbin查看下用法: 3. ...
- 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 ...
- python max函数_使用'key'和lambda表达式的python max函数
小编典典 lambda是一个匿名函数,它等效于: def func(p): return p.totalScore 现在max变成: max(players, key=func) 但是由于def语句是 ...
- python avg函数_学习python第三天之多行函数
多行函数:(聚合函数/分组函数) 解释:多条数据进入,单条结果出来(多进单出) 1).max(obj):最大值 2).min(obj):最小值 3).sum(num):求和 4).avg(num):求 ...
- python 函数的调用的时候参数的传递_python定义函数时的参数调用函数时的传参...
一.定义函数: 1.位置参数:直接定义参数 2.默认参数(或者关键字参数):参数名 = "默认值" 3.位置参数必须在默认参数之前 二.调用函数: 1.按位置传,直接写参数的值 2 ...
- python 编译函数_在Python的Django框架中编写编译函数
当遇到一个模板标签(template tag)时,模板解析器就会把标签包含的内容,以及模板解析器自己作为参数调用一个python函数. 这个函数负责返回一个和当前模板标签内容相对应的节点(Node)的 ...
最新文章
- 为了撩妹用Python做了一个办公小工具,她说棒极了
- HTML 特殊符号编码对照表
- C++并发编程线程间共享数据std::future和sd::promise
- 双向多点路由重分布--如何防止路由环路以及次优路径
- Git/码云上多人协作,创建分支,上传修改
- linux task进程跟踪,如何对Hadoop作业的某个task进行debug单步跟踪
- c++ array 模板类使用
- UIScrollView 滚动视图 (实例)
- mysql 主主切换_mysql 主-主配置中进行切换
- CCF CSP 201604-1 折点计数
- java web 教程_Java Web服务教程
- 《Android游戏编程入门经典》——4.6节问与答
- 掘金企服:ICP经营许可证和ICP备案的区别 1
- Invalid vnode type when creating vnode: undefined. vue 3.2版本错误解决
- java 容器都有哪些?
- word中删除脚注中的横线
- 格兰杰检验的基本步骤_【Stata教程】格兰杰因果检验
- 独家专栏 | 为什么国外的无人驾驶原型车,都选择混动车型?
- 亮风台提出基于图形匹配的可变形表面跟踪新算法 | ICCV 2019
- Java中关于字符串特别有意思的事