无效方法为行为黑洞

如果“认为有害”的文章本身不被认为是有害的,则本帖标题为“认为有害的作废方法”。 哦,好了

无效方法在大多数面向对象的代码库中无处不在。 在运行时中某个地方发生可变状态或I / O的直接后果是,您可以包装功能编程狂热者称为impure的任何行为,该行为原则上没有有意义的返回值。 一个常见的示例是在应用程序引导期间,例如在Java中:

@Resource MyClass implements Runnable {// ...@PostConstruct
public void init() {if(this.enabled) {this.executorService.scheduleAtFixedRate(this,0,500,TimeOut.MILLISECONDS);}
}// ...
}

上面的代码据说不错,但是公共无效方法,尤其是它们在给定代码库中的扩散,显然是代码的味道。 即使以面向对象样式进行编码。

您的

公共方法供您的类合作者使用,它们是类功能的门户。 因此,它们应尽可能简洁,并提供实现类行为所需的最小表面积。 任何函数定义的一个主要的自记录部分自然就是其返回类型。

让我们从前面的示例开始:

@Resource MyClass implements Runnable {// ...@PostConstruct
public void init() {if(this.enabled) {this.executorService.scheduleAtFixedRate(this,0,500,TimeOut.MILLISECONDS);}
}// ...
}

我们的类可能在构造时收到某种executorService实例,该实例可能是从某些依赖项注入粘合代码获得的,然后启动了工作计划。 客户代码需要显式调用init()的可能性通常很小。 这表明我们的@PostConstruct方法应该具有更严格的可见性,可能是privateprotected ,而这将是结束。

但是,真的吗?

可测性

假设我们要实际测试工作线程的关闭行为,这通常是一件棘手的事情。 您想做的事情大致如下:

// changed code from the original MyClass file:
@PostConstruct
public ScheduledFuture<T> init() {if(this.enabled) {return this.executorService.scheduleAtFixedRate(this,0,500,TimeOut.MILLISECONDS);}
}public testExecutorShutdown(){ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();MyClass c = new MyClass(service, true); // executorService, enabledScheduledFuture<T> scheduled = c.init();executorService.shutdown();scheduled.get(1, TimeUnit.SECONDS); // throws exception
}

上面的测试代码测试了计划的操作在执行程序关闭后的1秒(或两次计划的迭代)内终止。 这样的测试依赖于访问由init方法返回的将来的对象。

自我记录

人类的知觉被他们当前的意识视野所遮盖

埃利亚·怀斯

我们对init()方法所做的更改启用了行为测试,但带来了一个重要的副作用: ScheduledFuture对象现在是MyClass公共接口的一部分,这意味着现在任何客户端代码都可以与其进行交互。 这是否是一个理想的属性,实际上取决于MyClass旨在支持的用例,并且可能您希望将ScheduledFuture封装在一个更友好的类中,例如,仅公开bool isDone()类的东西。

无论如何,保持上述init方法为空将始终导致您的客户端代码(或开发人员使用他/她的IDE浏览init签名)而无视MyClass.init()的实际作用。 只需看看不同的签名,然后想想自己针对每个签名进行编码:

public void init()
public ScheduledFuture<T> init()

后者将在您每次需要使用它时为您节省大脑周期,因为它清楚地说明了其产生的效果,而无需查看代码或更深层次的文档。

一件事做好

当函数一次执行多个操作时,坚持函数返回一个值以明确声明其行为的想法显然是不可能的。 幸运的是,它本身就是一种代码味道 ,并且通过将返回类型视为函数的存在目的,可以使违反该原则变得更加奇怪。

结论

对您自己的未来以及对使用您的代码的所有开发人员都是好事,永远不要再在公共API中隐藏诸如返回值之类的宝贵信息。

拥抱与亲吻c。

翻译自: https://www.javacodegeeks.com/2018/05/void-methods-as-behavior-black-holes.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[精品]CSAPP Bomb Lab 解题报告(七)——隐藏关卡

接上篇[精品]CSAPP Bomb Lab 解题报告(六) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 查看字符串:(gdb) x/s 0x402800 0x402800: "Gunston"7. 结束了吗 在 bomb.c 文件的最后,留下了这样一句耐人寻味的话…

积分分离PID控制仿真实验(计控实验三simulink)

一、实验目的与要求 1、学会PID三个系数的选取。 2、了解积分分离值的模拟实验选取。 3、掌握SIMULINK的仿真方法。 二、仿真软硬件环境 PC机&#xff0c;MATLAB R2012b。 三、实验原理 如图&#xff0c;R为输入&#xff0c;C为输出。计算机不断采入误差E&#xff0c;进行…

数电实验三-点亮四个数码管(Multisim和Basys3)

特别说明&#xff1a;该系列内容均是本人实验记录&#xff0c;无盗取侵权之嫌&#xff0c;仅供参考&#xff0c;请多动手实践。 一、实验目的 详见报告 二、实验仪器 详见报告 三、实验内容详解 以16位拨码开关和3个按钮为输入&#xff0c;四个七段式数码管为输出&#xff0…

α稳定分布噪声基本原理及基于Chambers Mallows Stuck算法生成噪声并对信号加噪

Alpha稳定分布噪声的概念 Alpha稳定分布通常由其特征函数表征[7]: ϕ ( u ) = exp ⁡ ( j a u − γ ∣ u ∣ α [ 1 +

wso2 esb_使用WSO2 ESB构建制造服务总线(MSB)

wso2 esb在进入本主题之前&#xff0c;我想介绍一些制造业中常用的术语。 制造执行系统&#xff08;MES&#xff09;一词是AMR Research在1990年提出的&#xff0c;从先进的制造计算机信息系统的发展到现在&#xff0c;MES概念已经发展了近三十年。 以下是制造执行系统协会&am…

数电实验四-触发器(Multisim和Basys3)

特别说明&#xff1a;该系列内容均是本人实验记录&#xff0c;无盗取侵权之嫌&#xff0c;仅供参考&#xff0c;请多动手实践&#xff01; 一、实验目的 详见报告 二、实验仪器 1.数字电路实验箱 2.器材 三、实验内容详解 1.基本RS触发器逻辑功能的测试 基本RS触发器由两个与…

基于MATLAB的简易音乐数字均衡器设计(不采用MATLAB内置函数实现)

音乐数字均衡器 MATLAB GUI界面 不同MP3播放器的均衡器设置不尽相同,以两个韩系高端品牌iRiver和iAUDIO为例,两者的EQ均衡器同分为5个频段,但是频段的划分并不一样。iRiver的产品EQ分为五段:50Hz档、200Hz档、1KHz档、3KHz档和14KHz档,每段可以进行10级调节:-15dB、-12d…

线程方法destroy()和stop(Throwable)在JDK 11中删除

DrDeprecator &#xff08;Stuart Marks&#xff09;在core-libs-dev OpenJDK邮件列表上的消息“ RFR&#xff08;s&#xff09;&#xff1a;8204243&#xff1a;remove Thread.destroy&#xff08;&#xff09;和Thread.stop&#xff08;Throwable&#xff09; ”是对以下文档…

微信小程序消息推送通知模板id生成获取

前些天发现了十分不错的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 1、首先在微信公众平台登录对应的微信小程序。然后点击功能…

Windows10+VS2017下GSL1.8_x86和sundials2.5.0配置及GITHUB项目schneider_et_al_2016_animaldiversity编译运行

一、GSL库下载 GSL简介及下载地址:GSL - GNU Scientific Library GSL FTP下载地址:GSL FTP GSL for Windows地址:Gsl for Windows 文件主要有: 以上链接中关于GSL1.8版本的所有文件,均已下载好且打包如下,可直接下载,本文主要分享编译链接过程中遇到的问题,避免看到这…

数电实验五-秒表初步(Multisim和Basys3)

特别说明&#xff1a;该系列内容均是本人实验记录&#xff0c;无盗取侵权之嫌&#xff0c;仅供参考&#xff0c;请多动手实践。 一、实验目的 详见报告 二、实验环境 详见报告 三、实验内容详解 基础要求&#xff1a;以Basys3板载的100MHz时钟为输入&#xff0c;4位7段式数码…

C语言实用算法系列之冒泡排序、sizeof与strlen的区别

直接看代码 #include <stdio.h> #include<string.h> int main() {//char s[10] { 98,68,55,-,x,y }; // sizeof10 strlen 6//char s[10] "abc%78"; // 从常量区拷贝赋值&#xff0c;sizeof10 strlen 6//char s[] { a,b,c,\0 }; // sizeof4 strlen3//…

数电实验六-秒表进阶(Multisim和Basys3)

特别说明&#xff1a;该系列内容均是本人实验记录&#xff0c;无盗取侵权之嫌&#xff0c;仅供参考&#xff0c;请多动手实践。 一、实验目的 详见报告 二、实验环境 详见报告 三、实验内容详解 基础要求&#xff1a;在实验五的基础上&#xff0c;用 BTNC 按键控制秒表的工作…

OpenLiberty:注入时出错,适用于TomEE和Wildfly

当我在此博客上工作时&#xff0c;遇到此错误&#xff1a; [INFO ] DSRA8203I: Database product name : MySQL [INFO ] DSRA8204I: Database product version : 8.0.11 [INFO ] DSRA8205I: JDBC driver name : MySQL Connector/J [INFO ] DSRA8206I: JDBC drive…

云原生架构总览,发展定义架构及趋势

随着云计算发展的成熟和企业需求的推动&#xff0c;云原生技术和理念得到了用户的广泛接受&#xff0c;云原生应用场景不断丰富&#xff0c;云原生正在成为云上的必然趋势。 文章目录一、云原生技术发展二、云原生的定义三、云原生应用四、云原生架构原则及常用模式五、云原生未…

什么是公差分析软件?DTAS3D自主可控

公差分析软件是现代制造业中的重要工具&#xff0c;它能够对产品及其组件的公差进行分析&#xff0c;确保产品在使用中能够达到预期的性能和质量要求。本文将介绍一款流行的公差分析软件。 一、DTAS三维公差分析软件介绍 DTAS三维公差分析软件是一款专为工程设计和制造领域打…

ASCII码表(全)

简介 ASCII&#xff08;American Standard Code for Information Interchange&#xff0c;美国信息互换标准代码&#xff0c;ASCⅡ&#xff09;是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统&#xff0c;并等同于…

最小拍有纹波系统仿真实验(计控实验四simulink)

一、实验目的与要求 &#xff11;、掌握最小拍有纹波系统的计算机控制脉冲传函D(z)的设计方法。    &#xff12;、了解该系统对三种典型输入的适应性。 &#xff13;、掌握SIMULINK的仿真方法。 二、仿真软硬件环境 PC机&#xff0c;MATLAB R2012b。 三、实验原理 如图 R为…

C语言实用算法系列之memcpy、memmove函数原理与实现

直接看代码 #include<stdio.h> #include<string.h> /*返回指向pDest的指针*/ void* MemCopy(void* pDest, const void* pSrc, int nCount) {char* p (char*)pDest;char* p1 (char*)pSrc;while (nCount--)*p *p1;return pDest; } /*返回指向pDest的指针&#xf…

spring框架mvc框架_Spring的MVC测试框架入门–第1部分

spring框架mvc框架最新推出的主要Spring框架是Spring MVC测试框架&#xff0c;Spring Guys声称它是“一流的JUnit支持&#xff0c;可通过流畅的API测试客户端和服务器端Spring MVC代码” 1 。 在这个博客以及下一个博客中&#xff0c;我将看一看Spring的MVC测试框架&#xff0c…