zoukankan      html  css  js  c++  java
  • 减少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 > 8, m => 5 * m * m - 3),
                new MeasureTransform(m => m > 4, m => 4 * m - 2),
                new MeasureTransform(m => m >= 0, m => 3 * m - 1),
                new MeasureTransform(m => true, m => 2 * m)
               };
    
            private static void Main(string[] args)
            {
                var executor = Transformations.First(t => t.CanApply(16));
                Console.Write(executor.Transform(16));
            }
        }
    
        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 = 10;
                int b = 10;
    
                // 优化前
                if (a > 5)
                {
                    if (b > 10)
                    {
                        Console.Write("");
                    }
                }
    
                // 优化后
                if (a > 5 && b > 10)
                {
                    Console.Write("");
                }
            }
        }
    }

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

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

    第四种:使用三元运算符

    优化前

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

    优化后

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

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

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

    第七种:使用goto(注意:goto块是会按顺序执行的 例如:有label1、label2、label3 块按顺序写,如果label1执行完没有goto label3,则label2也会执行)

  • 相关阅读:
    Weekly blog for week 1908
    Weekly blog for week 1907
    Weekly blog for week 1905&1906
    Weekly blog for week 1904
    Write Week 3 Blog beforehand
    Add Week 2 Blog
    First week of a new year
    Andriod-Log
    bat
    学习方法
  • 原文地址:https://www.cnblogs.com/bibi-feiniaoyuan/p/13044352.html
Copyright © 2011-2022 走看看