重构第24天 分解复杂的判断(Remove Arrowhead Antipattern)
理解:
当你的代码中有很深的嵌套条件时,花括号就会在代码中形成一个长长的箭头。我们经常在不同的代码中看到这种情况,并且这种情况也会扰乱代码的可读性。
如下代码所示,HasAccess方法里面包含一些嵌套条件,如果再加一些条件或者增加复杂度,那么代码就很可能出现几个问题:1,可读性差。 2,很容易出现异常。 3,性能较差。
详解:重构前代码:
{
public ISecurityChecker SecurityChecker { get; set; }
public Security(ISecurityChecker securityChecker)
{
SecurityChecker = securityChecker;
}
public bool HasAccess(User user, Permission permission, IEnumerable<Permission> exemptions)
{
bool hasPermission = false;
if (user != null)
{
if (permission != null)
{
if (exemptions.Count() == )
{
if (SecurityChecker.CheckPermission(user, permission) || exemptions.Contains(permission))
{
hasPermission = true;
}
}
}
}
return hasPermission;
}
}
那么重构上面的代码也很简单,如果有可能的话,尽量将条件从方法中移除,我们让代码在做处理任务之前先检查条件,如果条件不满足就尽快返回,不继续执行。下面是重构后的代码:
public class Security
{
public ISecurityChecker SecurityChecker { get; set; } public Security(ISecurityChecker securityChecker)
{
SecurityChecker = securityChecker;
} public bool HasAccess(User user, Permission permission, IEnumerable<Permission> exemptions)
{
if (user == null || permission == null)
return false; if (exemptions.Contains(permission))
return true; return SecurityChecker.CheckPermission(user, permission);
}
}
我们看到,重构了就很容易阅读了。当我们看到很长很多的代码,就不想读了,像这些清爽的代码,其实并不是有多高的技术含量,但是读起来也很舒服。我们在做复杂的处理过程时,要经常考虑这个重构。
重构第24天 分解复杂的判断(Remove Arrowhead Antipattern)的更多相关文章
- 重构指南 - 分解复杂判断(Remove Arrowhead Antipattern)
当代码中有多层嵌套时,会降低代码的可读性,对于以后的修改也增加难度,所以我们需要分解复杂的判断并尽快返回. 重构前代码 public class Security { public ISecurity ...
- 重构24-Remove Arrowhead Antipattern(去掉箭头反模式)
基于c2的wiki条目.Los Techies的Chris Missal同样也些了一篇关于反模式的post. 简单地说,当你使用大量的嵌套条件判断时,形成了箭头型的代码,这就是箭头反模式(arrow ...
- 重构第22天 分解方法(Break Method)
理解:如果一个功能,里面比较复杂,代码量比较多,我们就可以把这个功能分解成多个小的method,每个方法实现该功能的一个小小的部分,并且方法命名成容易理解,和方法内容相关的名称,更有助于维护和可读性提 ...
- 重构第12天 分解依赖(Break Dependencies)
理解:“分解依赖” 是指对部分不满足我们要求的类和方法进行依赖分解,通过装饰器来达到我们需要的功能. 详解:今天我们所讲的这个重构方法对于单元测试是非常有用的.如果你要在你的代码中加入单元测试但有一部 ...
- 【Java重构系列】重构31式之封装集合
2009年,Sean Chambers在其博客中发表了31 Days of Refactoring: Useful refactoring techniques you have to know系列文 ...
- 重构手法之Split Temporary Variable(分解临时变量)
返回总目录 本小节目录 Split Temporary Variable(分解临时变量) Remove Assignments to Parameters(移除对参数的赋值) 6.6Split Tem ...
- Android Studio在代码重构中的妙用
代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...
- C#重构经典全面汇总
C#重构经典全面汇总 1. 封装集合 概念:本文所讲的封装集合就是把集合进行封装,仅仅提供调用端须要的接口. 正文:在非常多时候,我们都不希望把一些不必要的操作暴露给调用端,仅仅须要给它所须要的操作 ...
- java获取前一天时间SimpleDateFormat,java判断某个时间段
java获取前一天时间SimpleDateFormat SimpleDateFormat predf = new SimpleDateFormat("yyyy-MM-dd"); D ...
随机推荐
- android:themes.xml
<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2006 The Andr ...
- 没有公网IP的服务器如何通过有公网的服务器实现远程管理的功能?即VPN服务器搭建过程
由于很多PPPoE帐号都没有公网IP了,那我们如何实现远程管理呢? 答案是比较简单的,首先,你要拥有一台有公网IP的路由器,其他品牌的也可以,但是下面我以WayOs作为VPN服务器,给大家一个教程. ...
- iis,w3wp一直出现WerFault.exe应用程序错误
这个进程是Windows错误报告技术里的一个东西,来收集软件崩溃或者挂起后的数据然后向微软反馈报告.关闭系统的错误报告功能后看看 1:打开 运行 (热键:win+R)输入 gpedit.msc 打开 ...
- window环境下杀死tomcat
window环境下杀死进程 1.首先查找到占用8080端口的进程号PID是多少(tomcat默认是8080端口,假如你修改了tomcat的监听端口,请输入你的tomcat端口号) netstat -a ...
- 编译 curl with ssl
安装 openssh后,使用 curl 的 ./configure --with-ssl 时,报错“找不到 ssl”.因为 curl在 /usr/local/ssl的安装目录下找动态连接库.而ssl默 ...
- jQuery插件实现图片展开效果,jquery.gallery。仿腾讯QQ空间说说图片展示效果。
公司的项目http://www.umfun.com/,有个说说的页面(和腾讯QQ空间说说一样),里面有个发表图片功能,上传完图片,需要点击展开的效果. 当时手里面事情比较多(公司就我一个前端),忙不过 ...
- 使用B或BL跳转时,下一条指令的地址是这样计算的
B跳转指令:它是个相对跳转指令,其机器码格式如下: [31:28]位是条件码:[27:24]位为“1010”(0xeaffffff)时,表示B跳转指令,为“1011”时,表示BL跳转指令:[23:0] ...
- Android Studio开发JNI工程
转:http://www.2cto.com/kf/201412/361768.html 使用Android Sutdio创建一个新的工程后,接下来记录创建NDK工程的基本步骤. 本文将达到: 1. 创 ...
- OceanBase RPC机制简要说明
http://note.youdao.com/share/?id=d2163a7ba8ec1ec58e64683a961c5121&type=note RPC是OB一个比较重要的各个组件间进行 ...
- JavaScript中的String对象
String对象提供的方法用于处理字符串及字符. 常用的一些方法: charAt(index):返回字符串中index处的字符. indexOf(searchValue,[fromIndex] ...