当前位置: 首页 > news >正文

重构第24天 分解复杂的判断(Remove Arrowhead Antipattern)

理解

当你的代码中有很深的嵌套条件时,花括号就会在代码中形成一个长长的箭头。我们经常在不同的代码中看到这种情况,并且这种情况也会扰乱代码的可读性。

如下代码所示,HasAccess方法里面包含一些嵌套条件,如果再加一些条件或者增加复杂度,那么代码就很可能出现几个问题:1,可读性差。 2,很容易出现异常。 3,性能较差。

详解:重构前代码:

 1  {
 2         public ISecurityChecker SecurityChecker { get; set; }
 3 
 4         public Security(ISecurityChecker securityChecker)
 5         {
 6             SecurityChecker = securityChecker;
 7         }
 8 
 9         public bool HasAccess(User user, Permission permission, IEnumerable<Permission> exemptions)
10         {
11             bool hasPermission = false;
12 
13             if (user != null)
14             {
15                 if (permission != null)
16                 {
17                     if (exemptions.Count() == 0)
18                     {
19                         if (SecurityChecker.CheckPermission(user, permission) || exemptions.Contains(permission))
20                         {
21                             hasPermission = true;
22                         }
23                     }
24                 }
25             }
26 
27             return hasPermission;
28         }
29     }

那么重构上面的代码也很简单,如果有可能的话,尽量将条件从方法中移除,我们让代码在做处理任务之前先检查条件,如果条件不满足就尽快返回,不继续执行。下面是重构后的代码:

 1     public class Security
 2     {
 3         public ISecurityChecker SecurityChecker { get; set; }
 4 
 5         public Security(ISecurityChecker securityChecker)
 6         {
 7             SecurityChecker = securityChecker;
 8         }
 9 
10         public bool HasAccess(User user, Permission permission, IEnumerable<Permission> exemptions)
11         {
12             if (user == null || permission == null)
13                 return false;
14 
15             if (exemptions.Contains(permission))
16                 return true;
17 
18             return SecurityChecker.CheckPermission(user, permission);
19         }
20     }

我们看到,重构了就很容易阅读了。当我们看到很长很多的代码,就不想读了,像这些清爽的代码,其实并不是有多高的技术含量,但是读起来也很舒服。我们在做复杂的处理过程时,要经常考虑这个重构。

相关文章:

  • 数据库下载
  • 聊聊并发(四)深入分析ConcurrentHashMap
  • Android 使用ViewPager实现左右循环滑动图片
  • Python 命令行参数和getopt模块详解
  • 图的广度优先搜索(BFS)
  • Sql Server之旅——第九站 看公司这些DBA们设计的这些复合索引
  • svn服务器的搭建
  • Atitit.获取某个服务 网络邻居列表 解决方案
  • 通过Android源代码分析startActivity()过程(下)
  • 转:MyBatis学习总结(Mybatis总结精华文章)
  • 【LINUX 学习】使用find和xargs[转摘自《shell编程和unix命令》]
  • 关于PowerBuilder 9.0中如何修改项目工程名字
  • MapReduce实现TopK
  • toolBar和toolBarItem的定制
  • WebService学习总结(2)——WebService是什么?
  • bootstrap创建登录注册页面
  • golang中接口赋值与方法集
  • HTML5新特性总结
  • Java小白进阶笔记(3)-初级面向对象
  • magento 货币换算
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • php的插入排序,通过双层for循环
  • socket.io+express实现聊天室的思考(三)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 阿里云购买磁盘后挂载
  • 不上全站https的网站你们就等着被恶心死吧
  • 从伪并行的 Python 多线程说起
  • 看域名解析域名安全对SEO的影响
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 应用生命周期终极 DevOps 工具包
  • 怎么把视频里的音乐提取出来
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (33)STM32——485实验笔记
  • (9)STL算法之逆转旋转
  • (C++20) consteval立即函数
  • (windows2012共享文件夹和防火墙设置
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (算法)前K大的和
  • (一)Java算法:二分查找
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .equals()到底是什么意思?
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • /usr/bin/env: node: No such file or directory