zoukankan      html  css  js  c++  java
  • 代码重构之移动方法

    核心:将方法移到更加合适的位置,即放在更加合适的类中,

               就像JSON转换,图片处理,要单独放在一个帮助类中,而不是直接放在需要调用该函数的类中,这样可以让代码组织结构更加清晰,合理,方便以后维护。

    场景:根据上端传入的枚举值修改查询数据中的单位字段同枚举描述一致

    代码演示:

    1、移动前

      1-1、DAL层代码

    using MoveMethod.Common;
    using MoveMethod.Model;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Reflection;
    
    namespace MoveMethod
    {
        public class DAL
        {
    
            ProductDbContext prodDbContext = new ProductDbContext();
            /// <summary>
            /// 获取数据集合
            /// </summary>
            /// <returns></returns>
            public IEnumerable<Product> GetProductList()
            {
                return prodDbContext.Database.SqlQuery<Product>("select * from product").AsEnumerable();
            }
    
            /// <summary>
            /// 处理单位转换逻辑
            /// </summary>
            /// <param name="moneyType"></param>
            /// <returns></returns>
            public IEnumerable<Product> GetProductListChangePriceUnit(MoneyType moneyType, IEnumerable<Product> list)
            {
                string unitName = GetEnumDescription(moneyType); //获取枚举的描述值
                return ChangeUnit(unitName, list.ToList());      //根据枚举描述值修改单位名称  
            }
    
            /// <summary>
            /// 单位转换函数
            /// </summary>
            /// <param name="unitName"></param>
            /// <param name="list"></param>
            /// <returns></returns>
            private IEnumerable<Product> ChangeUnit(string unitName, IList<Product> list)
            {
                foreach (var item in list)
                {
                    item.Unit = unitName;
                }
                return list.AsEnumerable();
            }
            /// <summary>
            /// 获取枚举值上的Description特性的说明
            /// </summary>
            /// <typeparam name="T">枚举类型</typeparam>
            /// <param name="obj">枚举值</param>
            /// <returns>特性的说明</returns>
            private string GetEnumDescription<T>(T obj)
            {
                var type = obj.GetType();
                FieldInfo field = type.GetField(Enum.GetName(type, obj));
                DescriptionAttribute descAttr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
                if (descAttr == null)
                {
                    return string.Empty;
                }
                return descAttr.Description;
            }
        }
    }
    View Code

      1-2、BLL层代码

    using MoveMethod.Common;
    using MoveMethod.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MoveMethod
    {
        public class BLL
        {
    
            private DAL dal = new DAL();
            public IEnumerable<Product> Query(MoneyType monyeType)
            {
                return dal.GetProductListChangePriceUnit(monyeType,dal.GetProductList());
            }
        }
    }
    View Code

      1-3、客户端

    using MoveMethod.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    /// <summary>
    /// 移动方法
    /// </summary>
    namespace MoveMethod
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                IEnumerable<Product> list =  new BLL().Query(MoneyType.Dollar);
                foreach (var item in list)
                {
                    Console.WriteLine("{0} {1} {2}",item.FullName,item.Price,item.Unit);
                }
                Console.Read();
            }
        }
    }
    View Code

    在DAL层,数据就只负责数据的查询(满足面向对象设计的单一职责原则),而不需要进行业务的处理(根据枚举的描述值修改单位字段),关于业务的处理的方法应该放在BLL层中,另外,获取枚举的描述值是一个通用的函数,其他地方可能使用到,不应放在产品实体的DAL层,而是应该封在成工具类 

    2、移动后 

      2-1、DAL层代码

    using MoveMethod.Common;
    using MoveMethod.Model;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Reflection;
    
    namespace MoveMethod
    {
        public class DAL
        {
            ProductDbContext prodDbContext = new ProductDbContext();
            /// <summary>
            /// 获取数据集合
            /// </summary>
            /// <returns></returns>
            public IEnumerable<Product> GetProductList()
            {
                return prodDbContext.Database.SqlQuery<Product>("select * from product").AsEnumerable();
            }
        }
    }
    View Code

      2-2、BLL层代码

    using MoveMethod.Common;
    using MoveMethod.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MoveMethod
    {
        public class BLL
        {
            private DAL dal = new DAL();
    
            public IEnumerable<Product> QueryWithMoveFethod(MoneyType monyeType) {
                return GetProductListChangePriceUnit(monyeType, dal.GetProductList());
            }
    
            /// <summary>
            /// 根据传入的不同枚举值修改单位并返回结果
            /// </summary>
            /// <param name="moneyType"></param>
            /// <param name="list"></param>
            /// <returns></returns>
            public IEnumerable<Product> GetProductListChangePriceUnit(MoneyType moneyType, IEnumerable<Product> list)
            {
                string unitName = EnumHelper.GetEnumDescription(moneyType); //调用工具类中的获取枚举描述值的函数
                return ChangeUnit(unitName, list.ToList());
            }
            /// <summary>
            /// 改变单位函数
            /// </summary>
            /// <param name="unitName"></param>
            /// <param name="list"></param>
            /// <returns></returns>
            private IEnumerable<Product> ChangeUnit(string unitName, IList<Product> list)
            {
                foreach (var item in list)
                {
                    item.Unit = unitName;
                }
                return list.AsEnumerable();
            }
        }
    }
    View Code

      2-3、工具类代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MoveMethod.Common
    {
        public class EnumHelper
        {
            /// <summary>
            /// 获取枚举值上的Description特性的说明
            /// </summary>
            /// <typeparam name="T">枚举类型</typeparam>
            /// <param name="obj">枚举值</param>
            /// <returns>特性的说明</returns>
            public static string GetEnumDescription<T>(T obj)
            {
                var type = obj.GetType();
                FieldInfo field = type.GetField(Enum.GetName(type, obj));
                DescriptionAttribute descAttr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
                if (descAttr == null)
                {
                    return string.Empty;
                }
                return descAttr.Description;
            }
        }
    
    }
    View Code

      2-4、客户端

    using MoveMethod.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    /// <summary>
    /// 移动方法
    /// </summary>
    namespace MoveMethod
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Console.WriteLine("==================方法转移之前=====================");
                IEnumerable<Product> list =  new BLL().Query(MoneyType.Dollar);
                foreach (var item in list)
                {
                    Console.WriteLine("{0} {1} {2}",item.FullName,item.Price,item.Unit);
                }
    
                Console.WriteLine("==================方法转移之后=====================");
                list = new BLL().QueryWithMoveFethod(MoneyType.Dollar);
                foreach (var item in list)
                {
                    Console.WriteLine("{0} {1} {2}", item.FullName, item.Price, item.Unit);
                }
    
                Console.Read();
            }
        }
    }
    View Code

    结果展示:

    写写博客,方便自己也方便有需的人~~

  • 相关阅读:
    POJ 2388
    POJ 2387
    POJ 2389
    POJ 2379
    POJ 2385
    文件及输入输出流模拟ATM机
    文件及输入输出流模拟学生系统
    第六讲 字符串
    第四节课练习
    第四次上课练习
  • 原文地址:https://www.cnblogs.com/Yisijun/p/13214010.html
Copyright © 2011-2022 走看看