代码优化
代码优化
多层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 只是用于临时传递数据使用, 便虚拟造出一个 不存在的字段 , 会引起很多误会.
浙公网安备 33010602011771号