- 浏览: 67917 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
bo_hai:
assembly:single 不包含源代码,只包含依赖的cl ...
关于创建可执行的jar文件 -
lsy:
相当详细的好文!
关于创建可执行的jar文件 -
steven0lisa:
学习了。不过在有动态代码生成的项目中,就要谨慎用了。
Hide Method(隐藏方法) -
steven0lisa:
好久没看源代码了,没记错的话,因为是由以下原因造成的:1.ke ...
编码最佳实践系列之二 -
steven0lisa:
最后一点确实很有艺术,学习了~~~
编码最佳实践系列之一
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 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”
- 重构后的代码
- 先内联否定条件方法:在调用处,选择否定条件,使用快捷键(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”
- 选中
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 } } }
发表评论
-
Encapsulate Classes with Factory(用工厂封装类)
2012-09-09 16:57 0TODO -
Compose Method(组合方法)
2012-09-09 16:55 0就是Extract Method()的运用 -
Chain Constructors(链构造函数)
2012-09-09 16:53 0同一个类中的各个构造函数,存在重复代码 做法 -
Substitute Algorithm(替换算法)
2012-09-09 14:30 0Substitute Algorithm -
Split Temporary Variable(分解临时变量)
2012-09-09 14:29 0Split Temporary Variable -
重构《Split Loop(分解循环)》
2012-09-12 00:26 1418WHAT 在循环中,一次循环做了两件事情,将循环分解,重复这 ... -
Separate Query from Modifier(将查询方法与修改方法分离)
2012-09-09 14:28 0Separate Query from Modifier ... -
Self Encapsulate Field(自封装字段)
2012-09-09 14:27 0Self Encapsulate Field -
Reverse Conditional(颠倒条件表达式)
2012-09-11 00:00 1142WHAT 如果只有一个then,而没有else的分支条件表达 ... -
Replace Type Code with Subclasses(用子类代替类型码)
2012-09-09 14:25 0Replace Type Code with Subcl ... -
Replace Type Code with State/Strategy(用 State/Strategy代替类型码)
2012-09-09 14:24 0State/Strategy -
Replace Type Code with Class(用类代替类型码)
2012-09-09 14:23 0Replace Type Code with Class ... -
Replace Temp with Query(用查询方法代替临时变量)
2012-09-09 14:23 0Replace Temp with Query -
Replace Subclass with Fields(用字段代替子类)
2012-09-09 14:22 0Replace Subclass with Fields ... -
Replace Static Variable with Parameter(用参数代替静态变量)
2012-09-09 14:21 0Replace Static Variable with ... -
Replace Recursion with Iteration(用迭代代替递归)
2012-09-09 14:20 0Replace Recursion with Itera ... -
Replace Record with Data Class(用数据类代替记录)
2012-09-09 14:19 0Replace Record with Data Cla ... -
Replace Parameter with Method(用方法代替参数)
2012-09-09 14:19 0Replace Parameter with Metho ... -
Replace Parameter with Explicit Methods(用显示方法代替参数)
2012-09-09 14:18 0Replace Parameter with Expli ... -
Replace Nested Conditional with Guard Clauses(用守卫语句代替嵌套条件语句)
2012-09-09 14:17 0Replace Nested Conditional w ...
相关推荐
虽然是没有妨碍观看视频,但是还是感觉有点碍眼的,尤其是想下载了收藏那种,不过我们也可以使 用一些软件来对视频的LOGO水印进行去除,专业的视频LOGO去除软件——Remove Logo from Video,它可以轻松帮你去除视频...
但是视频上面的水印会一直播放,每一秒的视频都会附加水印,所以删除一个点是没有用的,这款Remove Logo Now可以完美的解决视频水印,可以一次性删除视频每一帧的水印广告,并且软件已经破解,需要的朋友可以下载...
RemoveWatermark RemoveWater Win7去水印 去水印 32位和64位系统,两个文件使用时需要区分 可以去水印 window7 家庭普通版 7600 注:对于使用128g补丁后,win7sp1出现内部测试版水印,一样有效果
remove函数使用详解 1. 基本使用 2. 删除普通类型元素 3. 删除对象类型元素 4. 一次只删一个元素 1. 基本使用 remove() 函数可以删除列表中的指定元素 语法 list.remove( element ) 1 参数 element:任意数据类型...
其他编译器的java项目导入idea时,经常出现非法字符: \65279 ,通常直接remove BOM,操作即可。但是有时非常顽固不生效。配合我的这个说明,用这个jar包,配置好了后,然后在重新remove BOM。(个人实验的是win64...
List.removeAll() 方法的性能效率
Remove Wyg.rar
RemoveElement算法Demo
去除图片上固定/指定位置的水印 水印 去除 watermark remove removewatermark
USB Safely Remove 是一个增强型USB移动设备安全移除工具,比Windows自带的USB设备删除工具功能更强大使用更方便,USB Safely Remove 可以以不同的名称及图标显示多个移动设备,支持自定义隐藏任意USB移动设备,更...
USB Safely Remove Portable是一款用于毫不费力地快速断开任何可移动设备的工具。它不仅能节省时间,还能确保在拔掉设备时,所有数据都保留在设备上。Safely Remove是一个系统工具,旨在快速和安全地停止连接到您的...
主要介绍在Halcon如何实现LabVIEW中Remove Border Object算子功能(去除边界物体),LabVIEW中有一个这样的VI可以轻松地实现操作目的,但在Halcon中没有,本例子告诉你如何实现
Easy remove是专门为卸载Autodesk系列软件而生,目前支持一键卸载cad、3dmax、maya、revit、inventor、navisworks、Civil3D、SketchBook、Architecture建筑CAD、Electrical电气CAD、Mechanical机械CAD,后续还会持续...
Symanten Endpoint Protection Remove Tools
Api-remove-bg.zip,使用remove.bg api以编程方式从图像中移除背景使用remove.bg api以编程方式从图像中移除背景。,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信...
python使用skimage库中的remove_small_objects()和remove_small_holes()进行图像去噪
用RemoveDrive命令文件 卸载U盘或者移动硬盘
虽然是没有妨碍观看视频,但是还是感觉有点碍眼的,尤其是想下载了收藏那种,不过我们也可以使 用一些软件来对视频的LOGO水印进行去除,专业的视频LOGO去除软件——Remove Logo from Video,它可以轻松帮你去除视频...
批量删除svn文件夹及文件,解除去除svn控制工具体批量删除svn文件夹及文件,解除去除svn控制工具体
USB Safely Remove是一款USB设备安全删除工具。设备电源管理:设备停止后断开电源,注意!当该选项启用后,在极少数的情况下某些设备可能无法正常的工作。请在明白您正在做什么的情况下使用。驱动器检测:显示不...