`
aaronjiu_00
  • 浏览: 69173 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Remove Double Negative(去除双重否定)

阅读更多

WHAT

双重否定的条件语句,可以使用一个肯定的条件语句代替

记住:双重否定 = 肯定

 

本次重构涉及到的基本重构手法:

 

  1. Extract Method(提炼方法)
  2. Inline Method(内联方法)
  3. 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 method
		return 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”

       

       
    • 重构后的代码 
package remove.doubles.negative;

public class SomeClass {
	
	private boolean found = false;

	public boolean isNotFound() {
		return !isFound();
	}

	public boolean isFound() {// extracted positive conditional method
		return 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 method
		return 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”

       

       

重构后的代码

package remove.doubles.negative;

public class SomeClass {
	
	private boolean found = false;

	public boolean isFound() {// extracted positive conditional method
		return 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
		}
	}
	
}


 

 

  • 描述: 提炼方法上文文菜单
  • 大小: 30.6 KB
  • 描述: 提炼方法对话框
  • 大小: 37.3 KB
  • 描述: 内联方法所有调用
  • 大小: 25.6 KB
  • 描述: 内联方法上下文菜单
  • 大小: 29.3 KB
  • 描述: 内联方法选定调用
  • 大小: 25.7 KB
分享到:
评论

相关推荐

    在Halcon中实现LabVIEW Remove Border Object VI(去掉与边界相邻的物体)

    主要介绍在Halcon如何实现LabVIEW中Remove Border Object算子功能(去除边界物体),LabVIEW中有一个这样的VI可以轻松地实现操作目的,但在Halcon中没有,本例子告诉你如何实现

    视频去水印工具(Remove Logo from Video) 最新v4.0 破解版,好用爽到爆。

    但是视频上面的水印会一直播放,每一秒的视频都会附加水印,所以删除一个点是没有用的,这款Remove Logo Now可以完美的解决视频水印,可以一次性删除视频每一帧的水印广告,并且软件已经破解,需要的朋友可以下载...

    TVL.rar_illumination_illumination remove_matlab去除纹理_tvl83. com_人

    标题中的"TVL.rar_illumination_illumination remove_matlab去除纹理_tvl83.com_人"揭示了这个压缩包内容的核心,它涉及到一个使用TVL1算法进行图像处理的项目,目标是去除光照影响,获取人脸纹理图像,进而可能用于...

    List.removeAll() 方法的性能效率

    在Java编程语言中,`List.removeAll()`方法是一个非常实用的函数,它允许我们从列表中一次性移除所有指定元素。这个方法是集合框架的一部分,它提供了高效的方式来进行元素的删除操作。本文将深入探讨`removeAll()`...

    视频去水印工具注册版Remove Logo Now!

    《视频去水印工具Remove Logo Now!:轻松去除视频水印的专业之道》 在数字化的今天,视频内容创作已经成为日常生活的一部分。然而,当我们从网络上下载或获取的视频带有不必要的水印时,它可能会影响观看体验,甚至...

    RemoveLogoNow中文版

    虽然是没有妨碍观看视频,但是还是感觉有点碍眼的,尤其是想下载了收藏那种,不过我们也可以使 用一些软件来对视频的LOGO水印进行去除,专业的视频LOGO去除软件——Remove Logo from Video,它可以轻松帮你去除视频...

    Java中ArrayList的removeAll方法详解

    ArrayList的removeAll方法详解 ArrayList的removeAll方法是一个常用的集合操作方法,该方法可以从一个ArrayList中删除所有在另外一个集合中的元素。但是,在实际开发过程中,removeAll方法的使用需要 thận重,因为...

    视频去水印工具Remove Logo Now 1.2官方注册版

    虽然是没有妨碍观看视频,但是还是感觉有点碍眼的,尤其是想下载了收藏那种,不过我们也可以使 用一些软件来对视频的LOGO水印进行去除,专业的视频LOGO去除软件——Remove Logo from Video,它可以轻松帮你去除视频...

    remove函数使用详解

    remove函数使用详解 1. 基本使用 2. 删除普通类型元素 3. 删除对象类型元素 4. 一次只删一个元素 1. 基本使用 remove() 函数可以删除列表中的指定元素 语法 list.remove( element ) 1 参数 element:任意数据类型...

    Win7去水印工具RemoveWatermark

    RemoveWatermark RemoveWater Win7去水印 去水印 32位和64位系统,两个文件使用时需要区分 可以去水印 window7 家庭普通版 7600 注:对于使用128g补丁后,win7sp1出现内部测试版水印,一样有效果

    删除.Net 强名称工具 Strong Name Remove 2.2 汉化版

    《深入理解.NET强名称与Strong Name Remove 2.2汉化版详解》 在.NET框架中,强名称(Strong Name)是一种确保程序集唯一性、完整性和不可篡改性的安全机制。它通过结合公钥加密技术,为.NET程序集提供了一种识别和...

    视频去水印RemoveLogoNow

    “RemoveLogoNow”是一款专为去除视频中LOGO和水印设计的软件,它提供了简单易用的界面和高效的工作流程,让用户能够在不损失视频质量的前提下,快速地去除不需要的元素。其便携版(RemoveLogoNowPortable)更是方便...

    IDEA的remove BOM操作不生效,解决也需要的jar

    其他编译器的java项目导入idea时,经常出现非法字符: \65279 ,通常直接remove BOM,操作即可。但是有时非常顽固不生效。配合我的这个说明,用这个jar包,配置好了后,然后在重新remove BOM。(个人实验的是win64...

    remove-bg,Remove.bg是一项免费服务,可以删除任何照片的背景。它100%自动工作.zip

    这个服务的独特之处在于它的全自动处理方式,用户无需具备图像编辑技能或进行复杂的选取操作,只需上传图片,系统就能自动识别并去除背景,极大地简化了图片背景处理的过程。 在IT行业中,图像处理技术是不可或缺的...

    Remove Logo Now3.0视频去水印

    《Remove Logo Now! 3.0 视频去水印技术详解》 在数字媒体日益普及的今天,视频内容的创作与分享变得越来越普遍。然而,很多原创视频作品常常会被制作者加上自己的LOGO或者水印,以保护版权。但有时,我们可能需要...

    remove_noise_NOISE_Python;去噪_

    本篇将详细介绍如何使用`remove_small_objects()`和`remove_small_holes()`这两个函数来去除图像中的噪声。 首先,`remove_small_objects()`函数用于消除图像中的小物体或小连通组件。在二值图像中,物体通常表现为...

    USB Safely Remove v6.1.5 USB安全删除(简体中文)+破解

    USB Safely Remove是一个可以将USB设备安全删除的辅助工具,对于频繁添加或者移除USB设备的用户非常有用,能够有效帮助您解决无法删除USB设备的困扰。旧版的序列号已经失效,破解工具可以正常使用。 USB Safely ...

    RemoveElement算法Demo

    《RemoveElement算法详解及其在Java中的实现》 在编程领域,算法是解决问题的关键工具,它是一种有序的操作步骤,用于处理数据或控制计算流程。本文将深入探讨一个名为"RemoveElement"的算法,并通过一个名为...

    Remove Wyg.rar

    标题“Remove Wyg.rar”和描述中的“Remove Wyg.rar”都指向了一个特定的操作,即删除与"Wyg"相关的文件或程序。这可能是用户遇到了一个名为"Wyg"的软件、程序或者插件,并且需要卸载或移除它。这个压缩包文件很可能...

    RemoveDrive卸载U盘或者移动硬盘

    "RemoveDrive卸载U盘或者移动硬盘"是一个实用的工具,它主要针对Windows操作系统,用于方便、快捷地卸载插入的U盘或移动硬盘。在日常使用中,我们通常通过"我的电脑"或"资源管理器"来移除USB设备,但有时候这个过程...

Global site tag (gtag.js) - Google Analytics