分解复杂推断

概念:本文中的”分解复杂推断”是指把原来复杂的条件推断等语句用尽快返回等方式简化代码。

正文:简单的来说,当你的代码中有非常深的嵌套条件时,花括号就会在代码中形成一个长长的箭头。

我们常常在不同的代码中看到这样的情况,而且这样的情况也会扰乱代码的可读性。

例如以下代码所看到的,HasAccess方法里面包括一些嵌套条件,假设再加一些条件或者添加复杂度,那么代码就非常可能出现几个问题:1,可读性差。 2,非常easy出现异常。 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;
        }
    }
}

那么重构上面的代码也非常easy。假设有可能的话。尽量将条件从方法中移除,我们让代码在做处理任务之前先检查条件,假设条件不满足就尽快返回。不继续运行。

以下是重构后的代码:

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);
        }
    }
}

总结:这个重构非常重要。它和后面讲的”尽快返回“有些类似。我们在做复杂的处理过程时,要常常考虑这个重构,用好了它,会对我们的帮助非常大。

时间: 2024-08-09 14:40:06

分解复杂推断的相关文章

C#重构经典全面汇总

C#重构经典全面汇总 1.  封装集合 概念:本文所讲的封装集合就是把集合进行封装,仅仅提供调用端须要的接口. 正文:在非常多时候,我们都不希望把一些不必要的操作暴露给调用端,仅仅须要给它所须要的操作或数据即可,那么做法就是封装.这个重构在微软的代码库也常常遇到. 比方最经典的属性对字段的封装就是一个非常好的样例,那么以下我们将看到对集合的封装.例如以下代码所看到的,调用端仅仅须要一个集合的信息,而我们则提供了一个IList的集合.大家都知道IList具有对集合的全部操作,所以这会带来非常多隐患

Mahout分布式运行实例:基于矩阵分解的协同过滤评分系统

Apr 08, 2014  Categories in tutorial tagged with Mahout hadoop 协同过滤  Joe Jiang 前言:之前配置Mahout时测试过一个简单的推荐例子,当时是在Eclipse上运行的,由于集成插件的缘故,所以一切进行的都比较顺利,唯一不足的是那是单机运行的,没有急于分布式系统处理.所以基于测试分布式处理环境的目的,下午找了一个实例来运行,推荐系统原型是一个电影评分的系统. 一.问题描述 对于协同过滤(Collaborative Filt

基于两两交互张量分解模型的个性化标签推荐

基于PITF的个性化标签推荐 摘要 关键词 引言 相关工作 个性化标签推荐 非个性化标签推荐 张量分解模型 成对交互模型 个性化标签推荐 形式化定义 数据分析 标签推荐的贝叶斯个性化排序BPR BPR最优化准则 BPR学习算法 张量分解模型 塔克分解模型TDTF 规范化分解模型CDTF 成对交互张量分解模型PITF TDCD和PITF之间的关系 实验评价 数据集 评价方法 实验结果 学习运行时间 预测质量 ECMLPKDD 2009知识发现挑战赛 结论和未来工作 基于PITF的个性化标签推荐 摘

JDK将新增局部变量类型推断功能

OpenJDK 提出一个新的计划, 准备为 Java 增加局部变量类型推断功能(local-variable type inference capability), 这让代码编写更简单, 同时也保证原有的静态类型安全特性. 该计划于3月8号提出,文档地址为: JEP-286(JDK Enhancement Proposal,JDK增强方案). 目前没有指定具体在哪个JDK版本中实现. 提案中说: "We seek to improve the developer experience by re

java求最大公约数(分解质因数)

下面是四种用java语言编程实现的求最大公约数的方法: package gcd; import java.util.ArrayList; import java.util.List; public class gcd { public static void main(String[] args) { long startTime; long endTime; long durationTime; int[] testArray1 = new int[]{784, 988, 460, 732,

数据库 无损连接分解

无损连接分解的形式定义如下:设R是一个关系模式,F是R上的一个函数依赖(FD)集.R分解成数据库模式δ={R1,……,Rk}.如果对R中每一个满足F的关系r都有下式成立: 那么称分解δ相对于F是“无损连接分解”,否则称为“损失连接分解”.其中表示自然连接. 从上述形式定义中可知,若直接根据定义来判断某个分解是否具有无损连接性,那么就得“对R中每一个满足F的关系r”进行测试,看是否满足上面的等式,这显然不可操作,因为“对R中每一个满足F的关系r”进行测试就意味着“对R中所有满足F的关系r”进行测试

推荐系统中的矩阵分解演变方式

推荐算法主要分为基于内容的算法和协同过滤. 协同过滤的两种基本方法是基于邻居的方法(基于内容/物品的协同过滤)和隐语义模型. 矩阵分解乃是实现隐语义模型的基石. 矩阵分解根据用户对物品的评分, 推断出用户和物品的隐语义向量, 然后根据用户和物品的隐语义向量来进行推荐. 推荐系统用到的数据可以有显式评分和隐式评分. 显式评分时用户对物品的打分, 显式评分矩阵通常非常稀疏. 隐式评分是指用户的浏览, 购买, 搜索等历史记录, 表示的是用户行为的有无, 所以是一个密集矩阵. 1. 基本矩阵分解 矩阵分

概率图模型推断之Belief Propagation

初步打算把概率图模型中推断方法都介绍一下,包括Belief Propagation,变分方法,MCMC,以及像是Graph cut也做一些说明. 关于Belief Propagation是什么? Belief Propagation是一种信息传递方法,一般用来解关于概率图模型中的推断问题,在这些问题中,单纯地通过公式推导或者MC模拟是很难得到准确答案的,这就需要BP,能够很有效地求解一些特定问题得边缘概率. 首先说明一下为什么边缘概率如此难求,wiki上的例子: X={x i } 是一个离散的随

HDU1164_Eddy&amp;#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6664    Accepted Submission(s): 3997 Problem Description Eddy's interest is very extensive, recently he is interested in prime