31 天重构学习笔记24. 分解复杂判断

简介:
摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有 订阅 Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接过去的。记得当时一口气看完了整个系列并没有多少感觉,因为这些基本上项目都 在使用,只是我们没有专门把它标示和整理出来,所以也没有引起多大的重视。现在突然接手这个重构项目,由于团队成员技术和经验参差不齐,所以有必要专门整 理一个重构的纲要,当然这个系列也非常适合做新系统的代码规范参考,只要有代码的地方,这个重构规范就很有价值。周末也不想出去闲逛,因为在刚到这个美丽 的城市,没有亲戚或者朋友,所以才能静下心来两天时间写完这个重构参考规范。同时也感受了Windows Live writer写文章的快感。当然重构的整体架构得另当别论(整体架构在我的这篇文章有专门的讲解( http://www.cnblogs.com/zenghongliang/archive/2010/06/23/1763438.html)。 大的架构设计好了以后,这些重构细节点就成了东风之后的大火,对整个项目也是至关重要。31天重构这个系列和《代码大全》、《重构:改善既有代码的设计》 比较起来最大的特点就是比较简单、浅显易懂。那么我这些文章也都是学习Sean Chambers的31天重构的笔记整理,所以如果大家对这个笔记有任何异议也可以指出。
 
概念:本文中的”分解复杂判断”是指把原来复杂的条件判断等语句用尽快返回等方式简化代码。
 
正文:简单的来说,当你的代码中有很深的嵌套条件时,花括号就会在代码中形成一个长长的箭头。我们经常在不同的代码中看到这种情况, 并且这种情况也会扰乱代码的可读性。
如下代码所示,HasAccess方法里面包含一些嵌套条件,如果再加一些条件或者增加复杂度,那么代码就很可能出现几个问题:1,可读性差 2,很容易出现异常 3,性能较差
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LosTechies.DaysOfRefactoring.SampleCode.ArrowheadAntipattern.Before
{
public class Security
{
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() == 0)
{
if (SecurityChecker.CheckPermission(user, permission) || exemptions.Contains(permission))
{
hasPermission = true;
}
}
}
}

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

namespace LosTechies.DaysOfRefactoring.SampleCode.ArrowheadAntipattern.After
{
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);
}
}
}
 
 
总结:这个重构很重要,它和后面讲的”尽快返回“有些类似,我们在做复杂的处理过程时,要经常考虑这个重构,用好了它,会对我们的帮 助很大。


















本文转自KnightsWarrior51CTO博客,原文链接: http://blog.51cto.com/knightswarrior/342481 ,如需转载请自行联系原作者
相关文章
|
机器学习/深度学习 算法 Python
傅里叶变换算法和Python代码实现
傅立叶变换是物理学家、数学家、工程师和计算机科学家常用的最有用的工具之一。本篇文章我们将使用Python来实现一个连续函数的傅立叶变换。
282 8
|
前端开发 JavaScript 安全
TypeScript在React Hooks中的应用:提升React开发的类型安全与可维护性
【7月更文挑战第17天】TypeScript在React Hooks中的应用极大地提升了React应用的类型安全性和可维护性。通过为状态、依赖项和自定义Hooks指定明确的类型,开发者可以编写更加健壮、易于理解和维护的代码。随着React和TypeScript的不断发展,结合两者的优势将成为构建现代Web应用的标准做法。
|
11月前
|
Java
Java之for循环
Java 提供了三种 for 循环方式:fori、foreach 和 Stream.foreach。fori 是最早的循环形式,现已较少使用;foreach 是对 fori 的语法糖,编译时会自动转换;Stream.foreach 结合 lambda 表达式使用,代码更简洁,但不支持 break 和 return。
331 11
Java之for循环
|
Java Nacos 微服务
JSR-330 ‘javax.inject.Inject‘ annotation found and supported for autowiring
这篇文章讨论了在Spring Boot项目中遇到的JSR-330 `javax.inject.Inject`注解相关问题,以及如何解决因版本不兼容导致服务注册失败的问题。
|
网络协议 网络安全 数据安全/隐私保护
内容安全(DPI和DFI解析)
内容安全(DPI和DFI解析)
671 6
|
机器学习/深度学习 SQL 数据可视化
单细胞分析(Signac): PBMC scATAC-seq 整合
单细胞分析(Signac): PBMC scATAC-seq 整合
|
机器学习/深度学习 人工智能 算法
阿里云机器学习平台 PAI -推荐解决方案|学习笔记
快速学习阿里云机器学习平台 PAI -推荐解决方案。
1339 0
阿里云机器学习平台 PAI -推荐解决方案|学习笔记
|
算法 测试技术 编译器
蓝桥杯-02-python组考点与14届真题
蓝桥杯-02-python组考点与14届真题
|
JSON 负载均衡 网络协议
RPC远程调用协议
RPC远程调用协议
271 0
|
算法 固态存储 计算机视觉
双目测距 BM算法 Python版
首先进行双目定标,获取双目摄像头内部的参数后,进行测距。本次的双目视觉测距,基于BM算法。
562 0