- 浏览: 69173 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1522WHAT 在循环中,一次循环做了两件事情,将循环分解,重复这 ... -
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 1242WHAT 如果只有一个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 ...
相关推荐
主要介绍在Halcon如何实现LabVIEW中Remove Border Object算子功能(去除边界物体),LabVIEW中有一个这样的VI可以轻松地实现操作目的,但在Halcon中没有,本例子告诉你如何实现
但是视频上面的水印会一直播放,每一秒的视频都会附加水印,所以删除一个点是没有用的,这款Remove Logo Now可以完美的解决视频水印,可以一次性删除视频每一帧的水印广告,并且软件已经破解,需要的朋友可以下载...
标题中的"TVL.rar_illumination_illumination remove_matlab去除纹理_tvl83.com_人"揭示了这个压缩包内容的核心,它涉及到一个使用TVL1算法进行图像处理的项目,目标是去除光照影响,获取人脸纹理图像,进而可能用于...
在Java编程语言中,`List.removeAll()`方法是一个非常实用的函数,它允许我们从列表中一次性移除所有指定元素。这个方法是集合框架的一部分,它提供了高效的方式来进行元素的删除操作。本文将深入探讨`removeAll()`...
《视频去水印工具Remove Logo Now!:轻松去除视频水印的专业之道》 在数字化的今天,视频内容创作已经成为日常生活的一部分。然而,当我们从网络上下载或获取的视频带有不必要的水印时,它可能会影响观看体验,甚至...
虽然是没有妨碍观看视频,但是还是感觉有点碍眼的,尤其是想下载了收藏那种,不过我们也可以使 用一些软件来对视频的LOGO水印进行去除,专业的视频LOGO去除软件——Remove Logo from Video,它可以轻松帮你去除视频...
ArrayList的removeAll方法详解 ArrayList的removeAll方法是一个常用的集合操作方法,该方法可以从一个ArrayList中删除所有在另外一个集合中的元素。但是,在实际开发过程中,removeAll方法的使用需要 thận重,因为...
虽然是没有妨碍观看视频,但是还是感觉有点碍眼的,尤其是想下载了收藏那种,不过我们也可以使 用一些软件来对视频的LOGO水印进行去除,专业的视频LOGO去除软件——Remove Logo from Video,它可以轻松帮你去除视频...
remove函数使用详解 1. 基本使用 2. 删除普通类型元素 3. 删除对象类型元素 4. 一次只删一个元素 1. 基本使用 remove() 函数可以删除列表中的指定元素 语法 list.remove( element ) 1 参数 element:任意数据类型...
RemoveWatermark RemoveWater Win7去水印 去水印 32位和64位系统,两个文件使用时需要区分 可以去水印 window7 家庭普通版 7600 注:对于使用128g补丁后,win7sp1出现内部测试版水印,一样有效果
《深入理解.NET强名称与Strong Name Remove 2.2汉化版详解》 在.NET框架中,强名称(Strong Name)是一种确保程序集唯一性、完整性和不可篡改性的安全机制。它通过结合公钥加密技术,为.NET程序集提供了一种识别和...
“RemoveLogoNow”是一款专为去除视频中LOGO和水印设计的软件,它提供了简单易用的界面和高效的工作流程,让用户能够在不损失视频质量的前提下,快速地去除不需要的元素。其便携版(RemoveLogoNowPortable)更是方便...
其他编译器的java项目导入idea时,经常出现非法字符: \65279 ,通常直接remove BOM,操作即可。但是有时非常顽固不生效。配合我的这个说明,用这个jar包,配置好了后,然后在重新remove BOM。(个人实验的是win64...
这个服务的独特之处在于它的全自动处理方式,用户无需具备图像编辑技能或进行复杂的选取操作,只需上传图片,系统就能自动识别并去除背景,极大地简化了图片背景处理的过程。 在IT行业中,图像处理技术是不可或缺的...
《Remove Logo Now! 3.0 视频去水印技术详解》 在数字媒体日益普及的今天,视频内容的创作与分享变得越来越普遍。然而,很多原创视频作品常常会被制作者加上自己的LOGO或者水印,以保护版权。但有时,我们可能需要...
本篇将详细介绍如何使用`remove_small_objects()`和`remove_small_holes()`这两个函数来去除图像中的噪声。 首先,`remove_small_objects()`函数用于消除图像中的小物体或小连通组件。在二值图像中,物体通常表现为...
USB Safely Remove是一个可以将USB设备安全删除的辅助工具,对于频繁添加或者移除USB设备的用户非常有用,能够有效帮助您解决无法删除USB设备的困扰。旧版的序列号已经失效,破解工具可以正常使用。 USB Safely ...
《RemoveElement算法详解及其在Java中的实现》 在编程领域,算法是解决问题的关键工具,它是一种有序的操作步骤,用于处理数据或控制计算流程。本文将深入探讨一个名为"RemoveElement"的算法,并通过一个名为...
标题“Remove Wyg.rar”和描述中的“Remove Wyg.rar”都指向了一个特定的操作,即删除与"Wyg"相关的文件或程序。这可能是用户遇到了一个名为"Wyg"的软件、程序或者插件,并且需要卸载或移除它。这个压缩包文件很可能...
"RemoveDrive卸载U盘或者移动硬盘"是一个实用的工具,它主要针对Windows操作系统,用于方便、快捷地卸载插入的U盘或移动硬盘。在日常使用中,我们通常通过"我的电脑"或"资源管理器"来移除USB设备,但有时候这个过程...