代码优化

代码优化

多层if嵌套的优化

多层嵌套的代码, 难读

/// <summary>
        /// 导入员工名单生成体检订单。
        /// 1. 更新员工表信息
        /// 2. 生成订单 
        /// </summary>
        /// <param name="excel">导入excel文档</param>
        /// <param name="configId">产品配置ID</param>
        /// <returns>新增订单列表</returns>
        public async Task<ICollection<Order>> CreateExcelOrdersAsync(IFormFile excel, int configId)
        {
            if (excel != null)
            {
                var workbook = WorkbookFactory.Create(excel.OpenReadStream());

                if (workbook.NumberOfSheets > 0)
                {
                    var sheet = workbook.GetSheetAt(0);

                    if (sheet != null && sheet.LastRowNum > 0)
                    {
                        var peopleDtoList = HCUtils.ConvertToObjs<PeopleDto>(sheet);    // excel转对象

                        if (peopleDtoList != null && peopleDtoList.Count > 0)
                        {
                            await fyuClient.ValidateEmpsInfoAsync(peopleDtoList); // 格式不正确不能创建订单
                            return await AddToOrderListAsync(peopleDtoList, configId);  // 创建体检个人订单
                        }
                    }
                }
            }

            return null;
        }

优化后,为一层嵌套, 易读

      /// <summary>
        /// 导入员工名单生成体检订单。
        /// 1. 更新员工表信息
        /// 2. 生成订单 
        /// </summary>
        /// <param name="excel">导入excel文档</param>
        /// <param name="configId">产品配置ID</param>
        /// <returns>新增订单列表</returns>
        public async Task<ICollection<Order>> CreateExcelOrdersAsync(IFormFile excel, int configId)
        {
            if (excel.IsNull())
                return null;

            var workbook = WorkbookFactory.Create(excel.OpenReadStream());

            if (workbook.NumberOfSheets <= 0)
                return null;

            var sheet = workbook.GetSheetAt(0);
            if (sheet.IsNull() || sheet.LastRowNum <= 0)
                return null;


            var peopleDtoList = HCUtils.ConvertToObjs<PeopleDto>(sheet);    // excel转对象
            if (peopleDtoList.IsNull() || peopleDtoList.Count <= 0)
                return null;

            await fyuClient.ValidateEmpsInfoAsync(peopleDtoList); // 格式不正确不能创建订单
            return await AddToOrderListAsync(peopleDtoList, configId);  // 创建体检个人订单
        }

嵌套代码的优化

        {
            var pageModel = _boProvider._packageRepo.GetPackageList(packageName, packageCode, type, isValid, isCompose, MinPrice, MaxPrice, PageIndex, PageSize);
            var pageDto = pageModel.ToPageDto<PackageDtoF, Package>();

            if (!string.IsNullOrEmpty(packageIds))
            {
                string[] pIds = packageIds.Split(',');
                for (int i = 0; i < pIds.Length; i++)
                {
                    if (pageDto.Data.FirstOrDefault(u => u.Id.ToString() == pIds[i]) != null)
                        pageDto.Data.FirstOrDefault(u => u.Id.ToString() == pIds[i]).Checked = true;
                }
            }
            return Ok(pageDto);
        }

改观后:

      {
            var pageModel = _boProvider._packageRepo.GetPackageList(packageName, packageCode, type, isValid, isCompose, MinPrice, MaxPrice, PageIndex, PageSize);
            var pageDto = pageModel.ToPageDto<PackageDtoF, Package>();

            if (packageIds.IsNullOrEmpty())
                return Ok(pageDto);

            string[] pIds = packageIds.Split(',');
            for (int i = 0; i < pIds.Length; i++)
            {
                if (pageDto.Data.FirstOrDefault(u => u.Id.ToString() == pIds[i]) != null)
                    pageDto.Data.FirstOrDefault(u => u.Id.ToString() == pIds[i]).Checked = true;
            }
            return Ok(pageDto);
        }

业务对象Bo优雅表达

面向数据库Entity的代码写法,可读性差,复用率低

var productConfig = _context.ProductConfigs.Find(input.ConfigId);
var contract = productConfig.ContractOrder.Contract;
if (contract.Status == ContractStatus.禁用 || contract.CheckExpireDate < DateTime.Now)
	throw ExceptionHelper.InvalidDataException($"体检已过期");

Bo对象的表达

var productConfig = _context.ProductConfigs.Find(input.ConfigId);
productConfig.CheckNull($"找不到指定的合同订单产品配置信息 {input.ConfigId}");
var contractBo = _boProvider.GetContractBo(productConfig.ContractOrder.Contract);
contractBo.CheckValid();

/// <summary>
/// 检查当前合同的有效性,无效则抛异常
/// </summary>
public void CheckValid()
{
    CheckIsExpired();
    CheckIsStarted();
}

internal void CheckIsExpired()
{
	if (Contract.CheckExpireDate < DateTime.Now)
		throw ExceptionHelper.InvalidOperationException($"合同已过期 ContractCode:{Contract.Code} CheckExpireDate:{Contract.CheckExpireDate}");
}

/// <summary>
/// 检查合同是否未开始过
/// </summary>
internal void CheckIsStarted()
{
    var StartedStatuses = new ContractStatus[] { ContractStatus.启用, ContractStatus.禁用 };
    if (!StartedStatuses.Contains(Contract.Status))
		throw ExceptionHelper.InvalidOperationException($"合同未启用{Contract.Id}");
	if (Contract.BeginDate > DateTime.Now)
		throw ExceptionHelper.InvalidOperationException($"合同还未开始 {Contract.Id}");
}

EF Model 埋坑写法

public class Coupon : BaseModel
{
       /// <summary>
        /// 套餐名称, 这个做法太坑了 W 2021/7/19,2022/7/5 禁止这样使用,Model本没有此字段,为了传递数据把Model变为DTO
        /// </summary>
        [NotMapped]
        public string PackageName { get; set; }

PackageName 只是用于临时传递数据使用, 便虚拟造出一个 不存在的字段 , 会引起很多误会.

posted on 2022-07-21 16:08  螺丝钉  阅读(56)  评论(1编辑  收藏  举报

导航