最近维护一批代码,其中包括一堆if...的使用,多的情况嵌套8、9层,痛苦不堪,所以搜寻一些可以降低if...else的方法来改善一下代码,写个简单总结。

第一种:

优化前

if (measuredValue > 8)
return 5 * measuredValue * measuredValue - 3; if (measuredValue > 4)
return 4 * measuredValue - 2; if (measuredValue >= 0)
return 3 * measuredValue - 1; return 2 * measuredValue;

使用列表和linq优化后(摘自:https://www.linkedin.com/pulse/if-less-programming-c-jiri-pokorny

using System;
using System.Linq; namespace ConsoleApp1
{
internal class Program
{
private static readonly MeasureTransform[] Transformations =
new MeasureTransform[]
{
// 这个顺序决定了判断先后顺序
new MeasureTransform(m => m > , m => * m * m - ),
new MeasureTransform(m => m > , m => * m - ),
new MeasureTransform(m => m >= , m => * m - ),
new MeasureTransform(m => true, m => * m)
}; private static void Main(string[] args)
{
var executor = Transformations.First(t => t.CanApply());
Console.Write(executor.Transform());
}
} internal class MeasureTransform
{
public MeasureTransform(Func<int, bool> canApply, Func<int, int> transform)
{
CanApply = canApply ?? throw new ArgumentNullException(nameof(canApply));
Transform = transform ?? throw new ArgumentNullException(nameof(transform));
}
public Func<int, bool> CanApply { get; set; }
public Func<int, int> Transform { get; set; }
}
}

第二种:使用逻辑运算符改善

using System;
using System.Linq; namespace ConsoleApp1
{
internal class Program
{ private static void Main(string[] args)
{
int a = ;
int b = ; // 优化前
if (a > )
{
if (b > )
{
Console.Write("");
}
} // 优化后
if (a > && b > )
{
Console.Write("");
}
}
}
}

第三种:从业务逻辑角度看看有没有多余的判断

using System;
using System.Linq; namespace ConsoleApp1
{
internal class Program
{ private static void Main(string[] args)
{
System.UInt32 a = ;
int b = (int)a + ; // 优化前
if (a > )
{
if (b > )
{
Console.Write("");
}
} // 优化后
if (a > )
{
Console.Write("");
}
}
}
}

第四种:使用三元运算符

优化前

namespace ConsoleApp1
{
internal class Program
{ private static void Main(string[] args)
{
System.UInt32 a = ;
uint c;
if (a > )
{
c = a;
}
else
{
c = a + ;
}
}
}
}

优化后

using System;
using System.Linq; namespace ConsoleApp1
{
internal class Program
{ private static void Main(string[] args)
{
System.UInt32 a = ;
int b = (int)a + ; // 优化前
var c = a > ? a : a + ; }
}
}

第五种:太多if..else if...效率低,使用switch...case...,也好看点。

第六种:从架构层面使用依赖注入,反射之类的,参考https://www.c-sharpcorner.com/forums/how-can-i-remove-multiple-if-statement

减少if...的使用的更多相关文章

  1. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  2. 初学seaJs模块化开发,利用grunt打包,减少http请求

    原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...

  3. 小小改动帮你减少bundle.js文件体积(翻译)

    我已经从事过好多年的SPA开发工作,我发现很多的程序猿都从来不往 bundle.js 文件的体积上动脑筋,这让我有点懵逼. “安心洗路,等俺把代码混淆压缩后就一切666了”,若是有人这么说,我会翻白眼 ...

  4. Effective前端5:减少前端代码耦合

    什么是代码耦合?代码耦合的表现是改了一点毛发而牵动了全身,或者是想要改点东西,需要在一堆代码里面找半天.由于前端需要组织js/css/html,耦合的问题可能会更加明显,下面按照耦合的情况分别说明: ...

  5. LVM 管理减少swap分区空间增加到根分区

    简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现 ...

  6. Arduino下LCD1602综合探究(下)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法

    一.前言: 上文中,笔者系统的阐述了1602的两种驱动方式,并简单的提到了Arduino的LiquidCrystal库.本文紧接上文,对以下两个问题进行更加深入的探讨:如何能够使1602对Arduin ...

  7. SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句

    原文出处:http://www.cnblogs.com/wy123/p/5933734.html 先看常用的一种表结构设计方式: 那么可能会遇到一种典型的查询方式,主子表关联,查询子表中的某些(或者全 ...

  8. FindBugs 入门——帮你减少代码中的bug数

    FindBugs 入门 FindBugs 作用 开发人员在开发了一部分代码后,可以使用FindBugs进行代码缺陷的检查.提高代码的质量,同时也可以减少测试人员给你报的bug数. 代码缺陷分类 根据缺 ...

  9. CDN的combo技术能把多个资源文件合并引用,减少请求次数

    CDN的combo技术能把多个资源文件合并引用,减少请求次数.比如淘宝的写法: <link rel="stylesheet" href="//g.alicdn.co ...

  10. 【前端开发】优化代码之减少引入,css预编译语言的优点,stylus的使用

    前言:我必须得承认在最最最开始的时候,我对于css的预编译是非常不以为然的,这是错误的.一般在页面编写过程中,我会将需要reset的css放在reset.css中,讲会需要重复用到的放置到public ...

随机推荐

  1. Ubuntu16.04 flask + nginx + uWSGI 部署

    前言 又有段时间没写博客了,最近一直在写外包项目,都没啥空余时间.这几天花了不少时间做项目部署,也看了不少教程,这里就记录下整个过程,也方便以后要做类似部署的时候不用再查来查去了. flask + u ...

  2. Antd 表格数据分页展示

    分页组件代码 render(){ const {total,size,currenPage} = this.state // 参数分别为数据总条数.每页数据条数.当前页页码 return ( // 渲 ...

  3. 2020版Adobe全家桶介绍及免费下载安装

    前言 Adobe公司创建于1982年,是世界领先的数字媒体和在线营销解决方案供应商.公司总部位于美国加利福尼亚州圣何塞.Adobe 的 客户包括世界各地的企业.知识工作者.创意人士和设计者.OEM合作 ...

  4. mybatis多对一与一对多

    步骤: 1.创建maven项目 2.编写工具类 3.编写实体类 4.编写mapper接口 5.配置xml 6.测试 多对一:多个学生关联一个老师 工具类: //sqlSessionFactory -- ...

  5. Oracle数据库连接、存储过程及调用

    Oracle数据库连接.存储过程及调用 1. 定义一个存储过程 create or replace procedure getuser(eid in number, na out varchar, e ...

  6. CF808E Selling Souvenirs

    题目链接: http://codeforces.com/contest/808/problem/E 题目大意: Petya 有 n 个纪念品,他能带的最大的重量为 m,各个纪念品的重量为 wi,花费为 ...

  7. SQL——模糊查询LIKE

    LIKE操作符 - 用于WHERE子句中搜索列中指定模式.    语法:SELECT columnName(s) FROM tableName WHERE columnName LIKE patter ...

  8. JSP页面基础用法和方法查询

    导包jar:jstl.jar    standard.jar jsp嵌套java代码,使用jsp脚本:1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 ...

  9. css变量的使用

    css变量的使用 1.介绍:我们也可以在css中定义变量,和less.sass一样,通过--来定义变量 div { /* 开始定义变量 */ --color: red; /* 通过var()函数来使用 ...

  10. [Axure教程]0003.元件的触发事件

    Axure RP 的每个元件都有着自己独有的和一些公共的触发事件,在不同的情况下触发不同的事件. 这里我们就以上图中文本输入框为例 A.改元件已使用的触发事件 [1].文字改变时:当一个元件内的文字改 ...