减少if...的使用
最近维护一批代码,其中包括一堆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...的使用的更多相关文章
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- 初学seaJs模块化开发,利用grunt打包,减少http请求
原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...
- 小小改动帮你减少bundle.js文件体积(翻译)
我已经从事过好多年的SPA开发工作,我发现很多的程序猿都从来不往 bundle.js 文件的体积上动脑筋,这让我有点懵逼. “安心洗路,等俺把代码混淆压缩后就一切666了”,若是有人这么说,我会翻白眼 ...
- Effective前端5:减少前端代码耦合
什么是代码耦合?代码耦合的表现是改了一点毛发而牵动了全身,或者是想要改点东西,需要在一堆代码里面找半天.由于前端需要组织js/css/html,耦合的问题可能会更加明显,下面按照耦合的情况分别说明: ...
- LVM 管理减少swap分区空间增加到根分区
简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现 ...
- Arduino下LCD1602综合探究(下)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法
一.前言: 上文中,笔者系统的阐述了1602的两种驱动方式,并简单的提到了Arduino的LiquidCrystal库.本文紧接上文,对以下两个问题进行更加深入的探讨:如何能够使1602对Arduin ...
- SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句
原文出处:http://www.cnblogs.com/wy123/p/5933734.html 先看常用的一种表结构设计方式: 那么可能会遇到一种典型的查询方式,主子表关联,查询子表中的某些(或者全 ...
- FindBugs 入门——帮你减少代码中的bug数
FindBugs 入门 FindBugs 作用 开发人员在开发了一部分代码后,可以使用FindBugs进行代码缺陷的检查.提高代码的质量,同时也可以减少测试人员给你报的bug数. 代码缺陷分类 根据缺 ...
- CDN的combo技术能把多个资源文件合并引用,减少请求次数
CDN的combo技术能把多个资源文件合并引用,减少请求次数.比如淘宝的写法: <link rel="stylesheet" href="//g.alicdn.co ...
- 【前端开发】优化代码之减少引入,css预编译语言的优点,stylus的使用
前言:我必须得承认在最最最开始的时候,我对于css的预编译是非常不以为然的,这是错误的.一般在页面编写过程中,我会将需要reset的css放在reset.css中,讲会需要重复用到的放置到public ...
随机推荐
- JQuery踩过的坑,遇到就记下
1 乱用选择器 坑人指数:200 JQuery选择器调用代价很大,反复调用效率更低.应采用缓存对象的方法或采用链式调用的方式. //错误的写法 $("#button").click ...
- 初识Page Object
PageObject是UI自动化测试项目开发实践的最佳设计模式之一,它的主要特点体现在对界面交互细节的封装上,使测试用例更加专注于业务的操作,从而提高测试用例的可维护性. 1.认识Page Objec ...
- SpringBoot +Vue 前后端分离实例
今天下了Vue,想试一试前后端分离的实现,没想到坑还不少,这里就记录一下我遇到的坑和我的代码: 一.Vue的下载安装:从网上找就好了,没什么问题,除了下载以后,要把镜像库改成淘宝的,要不然太慢了. 二 ...
- JSONObject转换为map
http://cloudyxuq.iteye.com/blog/1618213 private static HashMap<String, String> toHashMap(Objec ...
- Gym101142G Gangsters in Central City
题目链接:https://cn.vjudge.net/problem/Gym-101142G 知识点: DFS序.LCA 题目大意: 给定一棵有根树(根为 \(1\)).每次修改叶子节点会被染成黑色( ...
- es6的数组操作
//foreach 迭代 var arr = [1, 2, 3]; var sum = 0; arr.forEach(function(value, index, array) { console.l ...
- java导入web项目httpservlet报错
于是开始了,调错之路. 解决方法:鼠标右击项目工程——>Build Path——>点击comfigure Build Path进入----->选择java Bulid Path--- ...
- SpringCloud(二)- Consul介绍、安装、使用
唯能极于情,故能极于剑有问题或错误请及时联系小编或关注小编公众号 “CodeCow”,小编一定及时回复和改正,期待和大家一起学习交流 此文由四部分组成(Consul简介.安装.实操.总结),别着急,慢 ...
- pycharm激活码,亲测有效
PyCharm是由著名的JetBrains公司所打造的一款功能强大的Python IDE,它具有一般IDE都具备的功能, 并且使用起来非常方便好用.最近需求PyCharm激活码的网友非常多,就在这里给 ...
- 前端基础进阶(十一):详细图解jQuery对象,以及如何扩展jQuery插件
早几年学习前端,大家都非常热衷于研究jQuery源码.我还记得当初从jQuery源码中学到一星半点应用技巧的时候常会有一种发自内心的惊叹,“原来JavaScript居然可以这样用!” 虽然随着前端的发 ...