• 消除eliminate remove If-Else


    测试消除If-Else代码如下:

    #region 消除eliminate remove If-Else
            public static void TestRemoveIfElse()
            {
                Console.WriteLine($"TestRemoveIfElse");
                TestIfElse testIfElse = new TestIfElse();
                TestIfElse.TestOrder order = new TestIfElse.TestOrder { Id = 1, Name = "zhansan" };
                var result = TestIfElse.RemoveIfElse(order, "json");
                Console.WriteLine($"消除eliminate remove If-Else:{result}");
                result = TestIfElse.RemoveIfElse1(order, "json");
                Console.WriteLine($"消除eliminate remove If-Else:{result}");
                result = TestIfElse.RemoveIfElse3(order, "json");
                Console.WriteLine($"消除eliminate remove If-Else:{result}");
                result = testIfElse.RemoveIfElse4(order, "json");
                Console.WriteLine($"消除eliminate remove If-Else:{result}");
                result = testIfElse.RemoveIfElse4(order, "plaintext");
                Console.WriteLine($"消除eliminate remove If-Else:{result}");
            }
    
            public class TestIfElse
            {
                /// <summary>
                /// 第一种方式,最常见的方式
                /// </summary>
                /// <param name="order"></param>
                /// <param name="formatType"></param>
                /// <returns></returns>
                public static string RemoveIfElse(TestOrder order, string formatType)
                {
                    string result = string.Empty;
                    if (formatType.Equals("json", StringComparison.OrdinalIgnoreCase))
                    {
                        result = JsonConvert.SerializeObject(order);
                    }
                    else if (formatType.Equals("plaintext", StringComparison.OrdinalIgnoreCase))
                    {
                        result = $"id={order.Id},name={order.Name}";
                    }
                    else
                    {
                        result = $"Unknown format";
                    }
                    return result;
                }
    
                /// <summary>
                /// 第二种方式,假设只有两种情况,也就是json和plaintext这两种格式
                /// </summary>
                /// <param name="order"></param>
                /// <param name="formatType"></param>
                /// <returns></returns>
                public static string RemoveIfElse1(TestOrder order, string formatType)
                {
                    //先决条件
                    if (string.IsNullOrWhiteSpace(formatType))
                        return $"Unknown format";
                    //if (formatType is null)
                    //    return $"Unknown format";
    
                    //处理逻辑
                    return formatType == "json" ? JsonConvert.SerializeObject(order) : $"id={order.Id},name={order.Name}";
                }
    
                /// <summary>
                /// 第三种方式,使用字典处理key格式名称,value是Func<TestOrder, string>(对应的处理逻辑)
                /// </summary>
                /// <param name="order"></param>
                /// <param name="formatType"></param>
                /// <returns></returns>
                public static string RemoveIfElse3(TestOrder order, string formatType)
                {
                    //先决条件
                    if (string.IsNullOrWhiteSpace(formatType))
                        return $"Unknown format";
                    //字典应该是在其他位置预先设置好的,然后在这里使用,这里只为演示
                    Dictionary<string, Func<TestOrder, string>> dict = new Dictionary<string, Func<TestOrder, string>>
                    {
                        ["json"] = a => JsonConvert.SerializeObject(a),
                        ["plaintext"] = a => $"id={a.Id},name={a.Name}"
                    };
    
                    //处理逻辑
                    return dict[formatType]?.Invoke(order);
                }
    
                #region 第四种方式使用反射和特性还有字典
                /// <summary>
                /// 第四种方式使用反射和特性还有字典
                /// </summary>
                /// <param name="order"></param>
                /// <param name="formatType">特性标记的名称(特性中定义的字段Name)</param>
                /// <returns></returns>
                public string RemoveIfElse4(TestOrder order, string formatType)
                {
                    //先决条件
                    if (string.IsNullOrWhiteSpace(formatType))
                        return $"format is null";
    
                    ////字典应该是在其他位置预先设置好的,然后在这里使用,这里只为演示
                    var dict = GetType().Assembly
                        .GetExportedTypes()
                        .Where(t => t.GetInterfaces().Contains(typeof(IFormat123)))
                        .ToDictionary(t => t.GetCustomAttribute<FlagFormatAttribute>().Name);
    
                    if (dict[formatType] is null)
                        return $"No valid format";
    
                    //处理逻辑
                    var format = Activator.CreateInstance(dict[formatType]) as IFormat123;
                    return format.Format(order);
                }
    
                /// <summary>
                /// 格式化接口
                /// </summary>
                public interface IFormat123
                {
                    /// <summary>
                    /// 格式化处理方法
                    /// </summary>
                    /// <param name="order"></param>
                    /// <returns></returns>
                    string Format(TestOrder order);
                }
    
                /// <summary>
                /// json格式化
                /// </summary>
                [FlagFormat(Name = "json")]
                public class JsonFormat : IFormat123
                {
                    public string Format(TestOrder order)
                    {
                        return JsonConvert.SerializeObject(order);
                    }
                }
    
                /// <summary>
                /// plaintext格式化
                /// </summary>
                [FlagFormat(Name = "plaintext")]
                public class PlainTextFormat : IFormat123
                {
                    public string Format(TestOrder order)
                    {
                        return $"id={order.Id},name={order.Name}";
                    }
                }
                /// <summary>
                /// xml格式化
                /// </summary>
                [FlagFormat(Name = "xml")]
                public class XMLFormat : IFormat123
                {
                    public string Format(TestOrder order)
                    {
                        return $"<id>{order.Id}></id>,<name>{order.Name}</name>";
                    }
                }
    
                #endregion
    
                /// <summary>
                /// 测试类
                /// </summary>
                public class TestOrder
                {
                    public int Id { get; set; }
                    public string Name { get; set; }
                }
    
                /// <summary>
                /// 自定义特性,主要用于区分不同的对象
                /// </summary>
                [AttributeUsage(AttributeTargets.Class)]
                public class FlagFormatAttribute : Attribute
                {
                    /// <summary>
                    /// 名称
                    /// </summary>
                    public string Name { get; set; }
                }
            }
            #endregion

    测试结果如下:

    public class Program
        {
            static void Main(string[] args)
            {
                #region 消除eliminate remove If-Else
                TestRemoveIfElse();
                #endregion
                Console.Read();
            }
        }

  • 相关阅读:
    Mysql_大字段问题Row size too large.....not counting BLOBs, is 8126.
    Pycharm快捷键设置(鼠标滚动控制字体大小)
    python实现将base64编码的图片下载到本地
    [CentOS_7.4]Linux编译安装ffmpeg
    contenOs7
    文本特征提取方法研究
    Mahout中相似度计算方法介绍
    基于Mahout的电影推荐系统
    向Python女神推荐这些年我追过的经典书籍
    Mahout推荐算法API详解
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/14154857.html
Copyright © 2020-2023  润新知