`
aaronjiu_00
  • 浏览: 67917 次
  • 性别: 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
分享到:
评论

相关推荐

    RemoveLogoNow中文版

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

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

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

    Win7去水印工具RemoveWatermark

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

    remove函数使用详解

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

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

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

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

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

    Remove Wyg.rar

    Remove Wyg.rar

    RemoveElement算法Demo

    RemoveElement算法Demo

    去除图片上指定区域水印

    去除图片上固定/指定位置的水印 水印 去除 watermark remove removewatermark

    USB.Safely.Remove.安全移除工具

    USB Safely Remove 是一个增强型USB移动设备安全移除工具,比Windows自带的USB设备删除工具功能更强大使用更方便,USB Safely Remove 可以以不同的名称及图标显示多个移动设备,支持自定义隐藏任意USB移动设备,更...

    USB Safely Remove 6.4.2.1298.zip

    USB Safely Remove Portable是一款用于毫不费力地快速断开任何可移动设备的工具。它不仅能节省时间,还能确保在拔掉设备时,所有数据都保留在设备上。Safely Remove是一个系统工具,旨在快速和安全地停止连接到您的...

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

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

    Easy remove - Autodesk系列软件卸载工具 4.0.0.1

    Easy remove是专门为卸载Autodesk系列软件而生,目前支持一键卸载cad、3dmax、maya、revit、inventor、navisworks、Civil3D、SketchBook、Architecture建筑CAD、Electrical电气CAD、Mechanical机械CAD,后续还会持续...

    Symanten Endpoint Protection Remove Tools

    Symanten Endpoint Protection Remove Tools

    Api-remove-bg.zip

    Api-remove-bg.zip,使用remove.bg api以编程方式从图像中移除背景使用remove.bg api以编程方式从图像中移除背景。,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信...

    remove_noise_NOISE_Python;去噪_

    python使用skimage库中的remove_small_objects()和remove_small_holes()进行图像去噪

    RemoveDrive卸载U盘或者移动硬盘

    用RemoveDrive命令文件 卸载U盘或者移动硬盘

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

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

    批量删除svn文件夹及文件,解除去除svn控制工具 remove.bat

    批量删除svn文件夹及文件,解除去除svn控制工具体批量删除svn文件夹及文件,解除去除svn控制工具体

    USB Safely Remove 5.3.3中文破解版.rar

    USB Safely Remove是一款USB设备安全删除工具。设备电源管理:设备停止后断开电源,注意!当该选项启用后,在极少数的情况下某些设备可能无法正常的工作。请在明白您正在做什么的情况下使用。驱动器检测:显示不...

Global site tag (gtag.js) - Google Analytics