Remove Double Negative(去除双重否定)
WHAT
双重否定的条件语句,可以使用一个肯定的条件语句代替
记住:双重否定 = 肯定
本次重构涉及到的基本重构手法:
- Extract Method(提炼方法)
- Inline Method(内联方法)
- Substitute Algorithm(替换算法)
WHEN
双重否定,虽然机器能够很好理解并正确执行,但是不符合人的自然语言习惯,且令人迷惑,降低代码可读性
HOW
重构前的代码
package remove.doubles.negative;public class SomeClass {private boolean found = false;public boolean isNotFound() {return !found;}public void someMethod() {if (!isNotFound()) { // double negative// do something}}public void someMethod2() {if (isNotFound()) { // negative// do something else}}}
重构步骤
- 提炼肯定条件方法:选中否定条件方法中的肯定部分(如果现在没有,替换算法,杜撰一个),使用快捷键(Alt + Shitf + M)或者上下文菜单(Refactor -> Extract Method ... ),弹出” Extract Method“对话框
- 方法名取名为:isFound,并选择Access Modifier为public,提取函数之后的代码
package remove.doubles.negative;public class SomeClass {private boolean found = false;public boolean isNotFound() {return !isFound();}public boolean isFound() {// extracted positive conditional methodreturn found;}public void someMethod() {if (!isNotFound()) { // double negative// do something}}public void someMethod2() {if (isNotFound()) { // negative// do something else}}}
- 针对每一个双重否定条件,将双重否定改为肯定
- 先内联否定条件方法:在调用处,选择否定条件,使用快捷键(Alt + Shit + I)或者上下文菜单(Refactor -> Inline...),弹出“Inline Method”对话框,选择“Only the selected invocation”
- 重构后的代码
- 先内联否定条件方法:在调用处,选择否定条件,使用快捷键(Alt + Shit + I)或者上下文菜单(Refactor -> Inline...),弹出“Inline Method”对话框,选择“Only the selected invocation”
package remove.doubles.negative;public class SomeClass {private boolean found = false;public boolean isNotFound() {return !isFound();}public boolean isFound() {// extracted positive conditional methodreturn found;}public void someMethod() {if (!!isFound()) { // double negative, after inline method // do something}}public void someMethod2() {if (isNotFound()) { // negative// do something else}}}
- 替换算法,把双重否定改为肯定
package remove.doubles.negative;public class SomeClass {private boolean found = false;public boolean isNotFound() {return !isFound();}public boolean isFound() {// extracted positive conditional methodreturn found;}public void someMethod() {if (isFound()) { // changed double negative to positive// do something}}public void someMethod2() {if (isNotFound()) { // negative// do something else}}}
- 最后,如果否定条件方法isNotFound(),没有调用,使用隐藏方法(Hidden Method),或者只有少数几个调用,使用内联方法:Inline method
- 选中 isNotFound方法, 使用快捷键(Alt + Shit + I)或者上下文菜单(Refactor -> Inline...),弹出“Inline Method”对话框,选择“All invocations”,并选择“Delete method declaration”
- 选中 isNotFound方法, 使用快捷键(Alt + Shit + I)或者上下文菜单(Refactor -> Inline...),弹出“Inline Method”对话框,选择“All invocations”,并选择“Delete method declaration”
重构后的代码
package remove.doubles.negative;public class SomeClass {private boolean found = false;public boolean isFound() {// extracted positive conditional methodreturn found;}public void someMethod() {if (isFound()) { // changed double negative to positive// do something}}public void someMethod2() {if (!isFound()) { // changed negative to use not positive// do something else}}}
Remove Double Negative(去除双重否定)相关推荐
- 重构第26天 移除双重否定(Remove Double Negative)
理解:"移除双重否定"是指把代码中的双重否定语句修改成简单的肯定语句,这样即让代码可读,同时也给维护带来了方便. 详解:避免双重否定重构本身非常容易实现,但我们却在太多的代码中见过 ...
- 重构26-Remove Double Negative(去掉双重否定)
尽管我在很多代码中发现了这种严重降低可读性并往往传达错误意图的坏味道,但这种重构本身还是很容易实现的.这种毁灭性的代码所基于的假设导致了错误的代码编写习惯,并最终导致bug.如下例所示: public ...
- 316. Remove Duplicate Letters 去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). 注意:该题与 1081 https://leetcode-c ...
- 316 Remove Duplicate Letters 去除重复字母
给定一个仅包含小写字母的字符串,去除重复的字母使得所有字母出现且仅出现一次.你必须保证返回结果是所有可能结果中的以字典排序的最短结果. 例如: 给定 "bcabc" 返回 &quo ...
- linux svn e170001 认证失败,jenkins - svn: E170001报错的原因以及解决方案
1. 什么问题What? 使用Jenkins配置的svn拉取项目,Jenkins报错:svn: E170001; Your credentials to connect to the reposito ...
- #圈复杂度 - Cyclomatic Complexity
##概念 循环复杂度(Cyclomatic complexity)也称为条件复杂度,是一种软件度量,是由老托马斯·J·麦凯布(英语:Thomas J. McCabe, Sr.) 在1976年提出,用来 ...
- 两种点云地面去除方法
目录 1.基于角度分割的地面.非地面分割 1.1 PCL基本入门 1.1.1 在ROS项目中引入PCL库 1.2 编写节点进行Voxel Grid Filter 1.2.1 验证效果 1.3 点云地面 ...
- OpenXml编程--去除自动生成的word文档中由分页符和换行符产生的空白页
前言 前置知识:OpenXml 首先描述下问题产生的场景.我们的业务需求是根据用户的在线作答(或导入的作答结果)数据批量产生报告.产生报告的方式是把通过工作流控制的复杂业务逻辑的产出--分析结果--和 ...
- neo4j remove
1.删除一个属性 MATCH (a { name: 'Andy' }) REMOVE a.age RETURN a.name, a.age 2.删除所有属性 REMOVE不能同时去除所有存在的属性,使 ...
最新文章
- Loj 6485. LJJ 学二项式定理
- 如何看懂发电机功率圆图
- 最强蜗牛击败毁灭机器人_最强蜗牛:恶魔形态解锁攻略
- 关于arraylist的扩容机制
- 71万买玛莎拉蒂,手续竟然全是假的:71万或打水漂
- C# ini文件的读写
- OpenEphyra学习笔记1
- 嵌入式Linux结课报告,嵌入式课程报告.doc
- 当年如果有这个,语文就不会不及格了
- 部署容器jenkins_使用Jenkins部署用于进行头盔检测的烧瓶容器
- Excel如何合并两个单元格内容
- 计算机usb连接外设后不能启动,告诉你电脑usb接口没反应怎么办
- ubuntu下回收站无法清空
- 键盘按键错乱,鼠标也失灵怎么办。。。。。
- JAVA编写文件格式转换UTF-8
- 《数值分析(原书第2版)》—— 导读
- 八一钢铁:宝钢入主,中报业绩大幅增长
- @JsonView 详解(理论+实战)
- 苹果开发者证书下载/安装
- 【数据分析】电商平台数据分析
热门文章
- navicat中导出数据表结构为word格式
- 【PHP开发】Mac系统配置MAMP+Thinkphp框架环境 教程(一)
- python五角星编程代码绘制
- C#毕业设计——基于C#+vc.net+Access的报名管理信息系统设计与实现(毕业论文+程序源码)——报名管理信息系统
- 微服务架构师封神之路09-Springboot多数据源,Hikari连接池和事务配置
- ResNet中残差块的理解(附代码)
- MATLAB在动态经济学中的应用,MATLAB在动态经济学中的应用
- Altium 布线技巧
- termux是等于linux终端,termux终端
- pyqt5+pygame实现音乐播放器,可以自动提取文件图片,最终版本