[TOC]

方法

减少嵌套

更改前

public CommonResponse SaveTest(Order order){
    if(order!=null){
        //业务逻辑
        if(order.ID>0){
            orderService.EditOrder(order);
        }else{
            orderService.AddOrder(order);            
        }
    }else{
        return new CommonResponse(false,"订单不能为空");
    }
}

更改后

public CommonResponse SaveTest(Order order){
    if(order==null) return new CommonResponse(false,"订单不能为空");
    //业务逻辑
    if(order.ID>0){
        orderService.EditOrder(order);
    }else{
        orderService.AddOrder(order);            
    }
}

判断提前,聚焦业务逻辑,减少嵌套,方便维护

职责唯一

方法要注意职责唯一,不要往一个方法中写入过多的代码,否则他人难以维护。

注意提取一些小方法(注重方法的命名和注释!),方便维护和公用,一般主体流程的函数都是有多个小的方法组装而成。

示例

SalesDeliveryOrderManager类的AddSalesDeliveryOrderFromSalesOrder方法

一个方法多达150+行,十分不好维护

public class SalesDeliveryOrderManager : BaseManager
    {
    //...
public CommonResponse AddSalesDeliveryOrderFromSalesOrder(int salesOrderId)
        {
            if (salesOrderId <= 0) return new CommonResponse(false, "销售订单不存在,请检查");
            int operatorId = ToothFacModel.Model.Globalparameter.s_OperatorId;
            string operatorName = ToothFacModel.Model.Globalparameter.s_OperatorName;
            string version = ToothFacModel.Model.Globalparameter.s_Version;
            string computerName = ToothFacModel.Model.Globalparameter.s_ComputerName;
            using (var serviceFactory = new ServiceFactory())
            {
                var salesOrderService = serviceFactory.GetService<QueryInterface.DAL.ProductMgt.SalesOrderService>();
                var salesOrderDetailService = serviceFactory.GetService<SalesOrderDetailService>();
                var saleService = serviceFactory.GetService<DAL.WareHouseMgt.SaleService>();
                var salesDeliveryOrderService = serviceFactory.GetService<SalesDeliveryOrderService>();
                var salesDeliveryOrderDetailService = serviceFactory.GetService<SalesDeliveryOrderDetailService>();
                var salesOrderOperationLogService = serviceFactory.GetService<SalesOrderOperationLogService>();
                var salesReturnOrderService = serviceFactory.GetService<SalesReturnOrderService>();

                var salesOrder = salesOrderService.SelectSalesOrder(salesOrderId);
                if (salesOrder == null) return new CommonResponse(false, "销售订单不存在,请检查");
                if (salesOrder.AuditStatus != (int)SalesOrderAuditStatus.审核通过) return new CommonResponse(false, "销售订单需要进行审核,请检查");
                if (salesOrder.DiscountAuditStatus == (int)SalesOrderDiscountAuditStatus.待审核 || salesOrder.DiscountAuditStatus == (int)SalesOrderDiscountAuditStatus.不通过)
                {
                    return new CommonResponse(false, "销售订单需要进行折扣审核,请检查");
                }


                var now = salesOrderService.GetCurrentDate();

                return serviceFactory.Database.UsingTransaction(System.Data.IsolationLevel.ReadCommitted, transaction =>
                {
                    //如果已有流程中的销售发货单不能再添加销售发货单!
                    var existDeliveryOrder = salesDeliveryOrderService.PartialSelectSalesDeliveryOrders(new SelectSalesDeliveryOrdersParameter
                    {
                        SalesOrderID = salesOrder.ID,
                        IsHistorical = false
                    }, "ID").FirstOrDefault();
                    var existReturnOrder = salesReturnOrderService.PartialSelectSalesReturnOrders(new SelectSalesReturnOrdersParameter
                    {
                        SalesDeliveryOrderID = existDeliveryOrder?.ID ?? 0,
                        IsHistorical = false
                    }, "ID").FirstOrDefault();

                    if (existDeliveryOrder != null && existReturnOrder == null)
                    {
                        return new CommonResponse(false, "不能重复生成发货单,请检查");
                    }
                    //将已有的发货单修改为历史单状态
                    if (existDeliveryOrder != null && existReturnOrder != null)
                    {
                        salesDeliveryOrderService.PartialUpdateSalesDeliveryOrder(new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder
                        {
                            ID = existDeliveryOrder?.ID ?? 0,
                            IsHistorical = true
                        }, "IsHistorical");
                    }

                    //获取编号
                    var deliveryNo = "F" + now.ToString("yyMMdd") + "0001";
                    var maxNo = salesDeliveryOrderService.SelectDailyMaxNo(now);
                    if (!string.IsNullOrEmpty(maxNo))
                    {
                        var maxNum = "000" + (int.Parse(maxNo.Substring(maxNo.Length - 4, 4)) + 1);
                        deliveryNo = "F" + now.ToString("yyMMdd") + maxNum.Substring(maxNum.Length - 4, 4);
                    }

                    //添加主表
                    var salesDeliveryOrder = new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder
                    {
                        DeliveryNo = deliveryNo,
                        SalesOrderID = salesOrder.ID,
                        CustomNum = salesOrder.CustomNum,
                        HospitalId = salesOrder.HospitalId,
                        DoctorId = salesOrder.DoctorId,
                        PatientName = salesOrder.PatientName,
                        AcceptDate = salesOrder.AcceptDate,
                        PlanDate = salesOrder.PlanDate,
                        FinishDate = salesOrder.FinishDate,
                        DeliveryTime = salesOrder.DeliveryTime,
                        WearTime = salesOrder.WearTime,
                        InputDate = salesOrder.InputDate,
                        InputerId = salesOrder.InputerId,
                        DeliveryOrderRemark = salesOrder.DeliveryOrderRemark,
                        DeliveryRemind = salesOrder.DeliveryRemind,
                        TotalPrice = salesOrder.TotalPrice,
                        OriginalTotalPrice = salesOrder.OriginalTotalPrice,
                        AuditStatus = (int)SalesOrderAuditStatus.待审核,
                        PrintState = (int)SalesOrderPrintState.未打印,
                        SalesRange = salesOrder.SalesRange,
                        IsDiscount = salesOrder.IsDiscount,
                        DiscountReason = salesOrder.DiscountReason,
                        DiscountAuditStatus = salesOrder.DiscountAuditStatus,
                        Guid = Guid.NewGuid(),
                        CreatorID = operatorId,
                        CreationTime = now,
                        IsHistorical = false,
                        SaleTypeID = salesOrder.SaleTypeID
                    };
                    var salesDeliveryOrderId = salesDeliveryOrderService.InsertSalesDeliveryOrder(salesDeliveryOrder);
                    //添加明细
                    var salesOrderDetails = salesOrderDetailService.SelectSalesOrderDetails(new SelectSalesOrderDetailsParameter
                    {
                        SalesOrderID = salesOrder.ID
                    });
                    var salesDeliveryOrderDetails = salesOrderDetails.Select(x => new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrderDetail
                    {
                        ID = x.ID,
                        SortNo = x.SortNo ?? 0,
                        SalesDeliveryOrderID = salesDeliveryOrderId,
                        ProductID = x.ProductID,
                        PJID = x.PJID,
                        Quantity = x.Quantity ?? 0,
                        OriginalUnitPrice = x.OriginalUnitPrice ?? 0,
                        OriginalSumPrice = x.OriginalSumPrice ?? 0,
                        UnitPrice = x.UnitPrice ?? 0,
                        SumPrice = x.SumPrice ?? 0,
                        NoTaxUnitPrice = x.NoTaxUnitPrice ?? 0,
                        NoTaxSumPrice = x.NoTaxSumPrice ?? 0,
                        TaxRate = x.TaxRate,
                        TaxPrice = x.TaxPrice ?? 0,
                        DiscountType = x.DiscountType,
                        DiscountRate = x.DiscountRate,
                        DiscountAmount = x.DiscountAmount,
                        UnitId = x.UnitId,
                        TP1 = x.TP1,
                        TP2 = x.TP2,
                        TP3 = x.TP3,
                        TP4 = x.TP4,
                        Jaw1 = x.Jaw1,
                        Jaw2 = x.Jaw2,
                        Jaw3 = x.Jaw3,
                        Jaw4 = x.Jaw4,
                        MissingTP1 = x.MissingTP1,
                        MissingTP2 = x.MissingTP2,
                        MissingTP3 = x.MissingTP3,
                        MissingTP4 = x.MissingTP4,
                        Color = x.Color,
                        NeckMiddleCuttingColor = x.NeckMiddleCuttingColor,
                        ProductState = x.ProductState,
                        LotNumber = x.LotNumber,
                        ExpirationDate = x.ExpirationDate,
                    }).ToList();
                    salesDeliveryOrderDetailService.InsertSalesDeliveryOrderDetails(salesDeliveryOrderDetails);
                    //添加日志
                    salesOrderOperationLogService.InsertSalesOrderOperationLog(new ToothFacModel.Entity.ProductMgt.SalesOrderOperationLog
                    {
                        SalesOrderID = salesOrder.ID,
                        OperationType = (int)SalesOrderOperationLogOperationType.新建,
                        Content = "销售订单生成销售发货单",
                        SalesOrderNo = salesOrder.SalesOrderNo,
                        OperatorId = operatorId,
                        OperationTime = now,
                        OperatorName = operatorName,
                        SoftwareVersion = version,
                        ComputerName = computerName,
                        Interface = "销售订单"
                    });
                    saleService.UpdateSalesDeliveryOrderIDBySalesOrderId(salesDeliveryOrder);
                    return new CommonResponse(true, salesDeliveryOrderId.ToString());
                }, e => new CommonResponse(false, e.Message));
            }
        }
    //...
}

优化1:

全局变量operatorId和operatorName等,不要定义在方法体中,可以定义成为类SalesDeliveryOrderManager的字段,方便所有方法公用

优化2:

提出获取编号部分代码,封装成为单独的函数

/// <summary>
        /// 新增销售发货单时,生成单号
        /// </summary>
        /// <param name="salesDeliveryOrderService"></param>
        /// <param name="now"></param>
        /// <returns></returns>
        public string GetNewDeliveryNo(SalesDeliveryOrderService salesDeliveryOrderService, DateTime now)
        {
            var deliveryNo = "F" + now.ToString("yyMMdd") + "0001";
            var maxNo = salesDeliveryOrderService.SelectDailyMaxNo(now);
            if (!string.IsNullOrEmpty(maxNo))
            {
                var maxNum = "000" + (int.Parse(maxNo.Substring(maxNo.Length - 4, 4)) + 1);
                deliveryNo = "F" + now.ToString("yyMMdd") + maxNum.Substring(maxNum.Length - 4, 4);
            }
            return deliveryNo;
        }

优化3:

验证数据的部分封装成单独函数

/// <summary>
        /// 判断销售订单是否可以用来生成发货单
        /// </summary>
        /// <param name="salesOrder"></param>
        /// <param name="existDeliveryOrder"></param>
        /// <param name="existReturnOrder"></param>
        /// <returns></returns>
        public CommonResponse ValidateSalesOrderToDelivery(ToothFacModel.Entity.ProductMgt.SalesOrder salesOrder
            , ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder existDeliveryOrder, SalesReturnOrder existReturnOrder)
        {
            if (salesOrder == null) return new CommonResponse(false, "销售订单不存在,请检查");
            if (salesOrder.AuditStatus != (int)SalesOrderAuditStatus.审核通过) return new CommonResponse(false, "销售订单需要进行审核,请检查");
            if (salesOrder.DiscountAuditStatus == (int)SalesOrderDiscountAuditStatus.待审核 || salesOrder.DiscountAuditStatus == (int)SalesOrderDiscountAuditStatus.不通过)
            {
                return new CommonResponse(false, "销售订单需要进行折扣审核,请检查");
            }
            //如果已有生效的销售发货单(且未被退货) 不能再添加销售发货单!
            if (existDeliveryOrder != null && existReturnOrder == null)
            {
                return new CommonResponse(false, "不能重复生成发货单,请检查");
            }
            return new CommonResponse(true);
        }

优化4:

添加主表的部分封装成单独函数

/// <summary>
        /// 销售订单对象转化为销售出货单对象
        /// </summary>
        /// <param name="salesOrder">销售订单</param>
        /// <param name="deliveryNo">销售出货单号</param>
        /// <param name="now">当前时间</param>
        /// <returns></returns>
        private ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder ConvertToSalesDeliveryOrder(ToothFacModel.Entity.ProductMgt.SalesOrder salesOrder, string deliveryNo, DateTime now)
        {
            return new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder
            {
                DeliveryNo = deliveryNo,
                SalesOrderID = salesOrder.ID,
                CustomNum = salesOrder.CustomNum,
                HospitalId = salesOrder.HospitalId,
                DoctorId = salesOrder.DoctorId,
                PatientName = salesOrder.PatientName,
                AcceptDate = salesOrder.AcceptDate,
                PlanDate = salesOrder.PlanDate,
                FinishDate = salesOrder.FinishDate,
                DeliveryTime = salesOrder.DeliveryTime,
                WearTime = salesOrder.WearTime,
                InputDate = salesOrder.InputDate,
                InputerId = salesOrder.InputerId,
                DeliveryOrderRemark = salesOrder.DeliveryOrderRemark,
                DeliveryRemind = salesOrder.DeliveryRemind,
                TotalPrice = salesOrder.TotalPrice,
                OriginalTotalPrice = salesOrder.OriginalTotalPrice,
                AuditStatus = (int)SalesOrderAuditStatus.待审核,
                PrintState = (int)SalesOrderPrintState.未打印,
                SalesRange = salesOrder.SalesRange,
                IsDiscount = salesOrder.IsDiscount,
                DiscountReason = salesOrder.DiscountReason,
                DiscountAuditStatus = salesOrder.DiscountAuditStatus,
                Guid = Guid.NewGuid(),
                CreatorID = _operatorId,
                CreationTime = now,
                IsHistorical = false,
                SaleTypeID = salesOrder.SaleTypeID
            };
        }

优化5:

添加明细时,需要将销售订单明细转化为销售发货单明细,封装成单独函数

/// <summary>
        /// 将销售单明细转化为销售发货单明细
        /// </summary>
        /// <param name="salesOrderDetail">销售单明细</param>
        /// <param name="salesDeliveryOrderId">销售发货单ID</param>
        /// <returns></returns>
        private ToothFacModel.Entity.ProductMgt.SalesDeliveryOrderDetail ConvertToSalesDeliveryOrderDetail(ToothFacModel.Entity.ProductMgt.SalesOrderDetail salesOrderDetail, int salesDeliveryOrderId)
        {
            return new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrderDetail
            {
                ID = salesOrderDetail.ID,
                SortNo = salesOrderDetail.SortNo ?? 0,
                SalesDeliveryOrderID = salesDeliveryOrderId,
                ProductID = salesOrderDetail.ProductID,
                PJID = salesOrderDetail.PJID,
                Quantity = salesOrderDetail.Quantity ?? 0,
                OriginalUnitPrice = salesOrderDetail.OriginalUnitPrice ?? 0,
                OriginalSumPrice = salesOrderDetail.OriginalSumPrice ?? 0,
                UnitPrice = salesOrderDetail.UnitPrice ?? 0,
                SumPrice = salesOrderDetail.SumPrice ?? 0,
                NoTaxUnitPrice = salesOrderDetail.NoTaxUnitPrice ?? 0,
                NoTaxSumPrice = salesOrderDetail.NoTaxSumPrice ?? 0,
                TaxRate = salesOrderDetail.TaxRate,
                TaxPrice = salesOrderDetail.TaxPrice ?? 0,
                DiscountType = salesOrderDetail.DiscountType,
                DiscountRate = salesOrderDetail.DiscountRate,
                DiscountAmount = salesOrderDetail.DiscountAmount,
                UnitId = salesOrderDetail.UnitId,
                TP1 = salesOrderDetail.TP1,
                TP2 = salesOrderDetail.TP2,
                TP3 = salesOrderDetail.TP3,
                TP4 = salesOrderDetail.TP4,
                Jaw1 = salesOrderDetail.Jaw1,
                Jaw2 = salesOrderDetail.Jaw2,
                Jaw3 = salesOrderDetail.Jaw3,
                Jaw4 = salesOrderDetail.Jaw4,
                MissingTP1 = salesOrderDetail.MissingTP1,
                MissingTP2 = salesOrderDetail.MissingTP2,
                MissingTP3 = salesOrderDetail.MissingTP3,
                MissingTP4 = salesOrderDetail.MissingTP4,
                Color = salesOrderDetail.Color,
                NeckMiddleCuttingColor = salesOrderDetail.NeckMiddleCuttingColor,
                ProductState = salesOrderDetail.ProductState,
                LotNumber = salesOrderDetail.LotNumber,
                ExpirationDate = salesOrderDetail.ExpirationDate,
            };
        }

优化6:

返回参数需要返回出货单的主键,所以返回参数改为CommonResponse<int>类型

优化结果

主流程方法里面代码减少,每一步写上注释,方便维护人员理解业务逻辑、定位bug和修改bug

public CommonResponse<int> AddSalesDeliveryOrderFromSalesOrder(int salesOrderId)
        {
            if (salesOrderId <= 0) return new CommonResponse<int>(false, "销售订单不存在,请检查");
            using (var serviceFactory = new ServiceFactory())
            {
                var salesOrderService = serviceFactory.GetService<QueryInterface.DAL.ProductMgt.SalesOrderService>();
                var salesOrderDetailService = serviceFactory.GetService<SalesOrderDetailService>();
                var saleService = serviceFactory.GetService<DAL.WareHouseMgt.SaleService>();
                var salesDeliveryOrderService = serviceFactory.GetService<SalesDeliveryOrderService>();
                var salesDeliveryOrderDetailService = serviceFactory.GetService<SalesDeliveryOrderDetailService>();
                var salesOrderOperationLogService = serviceFactory.GetService<SalesOrderOperationLogService>();
                var salesReturnOrderService = serviceFactory.GetService<SalesReturnOrderService>();

                return serviceFactory.Database.UsingTransaction(System.Data.IsolationLevel.ReadCommitted, transaction =>
                {
                    //获取销售订单
                    var salesOrder = salesOrderService.SelectSalesOrder(salesOrderId);
                    //当前已生效的销售发货单
                    var existDeliveryOrder = salesDeliveryOrderService.PartialSelectSalesDeliveryOrders(new SelectSalesDeliveryOrdersParameter
                    {
                        SalesOrderID = salesOrder.ID,
                        IsHistorical = false
                    }, "ID").FirstOrDefault();
                    //当前已生效的销售退货单
                    var existReturnOrder = salesReturnOrderService.PartialSelectSalesReturnOrders(new SelectSalesReturnOrdersParameter
                    {
                        SalesDeliveryOrderID = existDeliveryOrder?.ID ?? 0,
                        IsHistorical = false
                    }, "ID").FirstOrDefault();
                    //数据验证
                    var validateResult = ValidateSalesOrderToDelivery(salesOrder, existDeliveryOrder, existReturnOrder);
                    if (!validateResult.Success) return validateResult;
                    var now = salesOrderService.GetCurrentDate();
                    //将已有的发货单修改为历史单状态
                    if (existDeliveryOrder != null && existReturnOrder != null)
                    {
                        salesDeliveryOrderService.PartialUpdateSalesDeliveryOrder(new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder
                        {
                            ID = existDeliveryOrder?.ID ?? 0,
                            IsHistorical = true
                        }, "IsHistorical");
                    }
                    //获取编号
                    var deliveryNo = GetNewDeliveryNo(salesDeliveryOrderService, now);
                    //添加主表
                    var salesDeliveryOrder = ConvertToSalesDeliveryOrder(salesOrder, deliveryNo, now);
                    var salesDeliveryOrderId = salesDeliveryOrderService.InsertSalesDeliveryOrder(salesDeliveryOrder);
                    //添加明细
                    var salesOrderDetails = salesOrderDetailService.SelectSalesOrderDetails(new SelectSalesOrderDetailsParameter
                    {
                        SalesOrderID = salesOrder.ID
                    });
                    var salesDeliveryOrderDetails = salesOrderDetails.Select(x => ConvertToSalesDeliveryOrderDetail(x, salesDeliveryOrderId)).ToList();
                    salesDeliveryOrderDetailService.InsertSalesDeliveryOrderDetails(salesDeliveryOrderDetails);
                    //添加日志
                    salesOrderOperationLogService.InsertSalesOrderOperationLog(new ToothFacModel.Entity.ProductMgt.SalesOrderOperationLog
                    {
                        SalesOrderID = salesOrder.ID,
                        OperationType = (int)SalesOrderOperationLogOperationType.新建,
                        Content = "销售订单生成销售发货单",
                        SalesOrderNo = salesOrder.SalesOrderNo,
                        OperatorId = _operatorId,
                        OperationTime = now,
                        OperatorName = _operatorName,
                        SoftwareVersion = _version,
                        ComputerName = _computerName,
                        Interface = "销售订单"
                    });
                    saleService.UpdateSalesDeliveryOrderIDBySalesOrderId(salesDeliveryOrder);
                    //更新售出单
                    return new CommonResponse<int>(salesDeliveryOrderId);
                }, e => new CommonResponse<int>
                {
                    Success = false,
                    Message = e.Message
                });
            }
        }

封装继承多态

示例1

foreach (var detail in salesOrder.SalesOrderDetails)
            {
                detail.ToothPositions = ToothHelper.SetTooth(new SetToothParam
                {
                    TP1 = detail.TP1,
                    TP2 = detail.TP2,
                    TP3 = detail.TP3,
                    TP4 = detail.TP4,
                    Jaw1 = detail.Jaw1,
                    Jaw2 = detail.Jaw2,
                    Jaw3 = detail.Jaw3,
                    Jaw4 = detail.Jaw4,
                    MissingTP1 = detail.MissingTP1,
                    MissingTP2 = detail.MissingTP2,
                    MissingTP3 = detail.MissingTP3,
                    MissingTP4 = detail.MissingTP4,
                });
            }

这里我们发现很多类都有TP1~4 Jaw1~4 MissginTP1~4 并且有一些通用的方法

这里推荐创建一个父类

public class FDIToothPosition
    {
        public string TP1 { get; set; }
        public string TP2 { get; set; }
        public string TP3 { get; set; }
        public string TP4 { get; set; }
        public int Jaw1 { get; set; }
        public int Jaw2 { get; set; }
        public int Jaw3 { get; set; }
        public int Jaw4 { get; set; }
        public string MissingTP1 { get; set; }
        public string MissingTP2 { get; set; }
        public string MissingTP3 { get; set; }
        public string MissingTP4 { get; set; }
    }

有这几个字段的ViewModel类可以继承该类,泪如

public class SalesOrderView_SalesOrderDetail : FDIToothPosition

然后给ToothHelper增加方法

public static Heng9.ToothDesign.Tooth GetTooth(FDIToothPosition toothPosition)
        {
            Heng9.ToothDesign.Tooth tooth = Heng9.ToothDesign.Tooth.FromFDIString(toothPosition.TP1, toothPosition.TP2, toothPosition.TP3, toothPosition.TP4,
                MarshalToothUpPositions(toothPosition.Jaw1, toothPosition.Jaw2), MarshalToothDownPositions(toothPosition.Jaw3, toothPosition.Jaw4));
            SetToothState(tooth, toothPosition.MissingTP1, 1);
            SetToothState(tooth, toothPosition.MissingTP2, 2);
            SetToothState(tooth, toothPosition.MissingTP3, 3);
            SetToothState(tooth, toothPosition.MissingTP4, 4);
            return tooth;
        }

更改后的代码

foreach (var detail in salesOrder.SalesOrderDetails){
    detail.ToothPositions = ToothHelper.GetTooth(detail);
}

示例2

对多个if else 或者 switch case 里面包含复杂业务逻辑的代码

可以考虑多态(扩展代码为主,修改代码为辅)

尤其是各种复杂工具和业务开发,可以考虑进行更好的代码设计与优化

更改前

switch (order.OrderType){
    case OrderType.Test1:
        //业务1 大量业务逻辑
        return 1;
        break;
    case OrderType.Test2:
        //业务2 大量业务逻辑
        return 2;        
        break;
    case OrderType.Test3:
        //业务3 大量业务逻辑
        return 3;        
        break;
}
//或者
if(order.OrderType==OrderType.Test1){
    //业务1 大量业务逻辑
    return 1;    
}else if(order.OrderType==OrderType.Test2){
    //业务2 大量业务逻辑
    return 2;        
}else if(order.OrderType==OrderType.Test3){
    //业务3 大量业务逻辑
    return 3;        
}

并且条件之后还可能会扩展

更改后

public interface IDealOrderType{
    int dealOrderType();
}
public class OrderType1:IDealOrderType{
    public int dealOrderType(){
        //业务1 大量业务逻辑
        return 1;
    }
}
public class OrderType2:IDealOrderType{
    public int dealOrderType(){
        //业务2 大量业务逻辑        
        return 2;
    }
}
public class OrderType3:IDealOrderType{
    public int dealOrderType(){
        //业务3 大量业务逻辑
        return 3;
    }
}
// 业务逻辑代码(可以考虑工厂封装)
IDealOrderType dealOrderType;
if(order.OrderType==OrderType.Test1){
    dealOrderType=new OrderType1();
}else if(order.OrderType==OrderType.Test2){
    dealOrderType=new OrderType2();
}else if(order.OrderType==OrderType.Test3){
    dealOrderType=new OrderType3();
}
return dealOrderType.dealOrderType();

LINQ

不少linq语句可以更加直观的反应业务逻辑,并减少嵌套

foreach (var detail in salesOrder.SalesOrderDetails)
            {
                if (salesOrder.SalesRange == EnumSalesRange.产品销售)
                {
                    var returnDetail = returnDetails.Where(x => x.ProductID == detail.ProductID).FirstOrDefault();
                    if (returnDetail != null)
                    {
                        detail.Checked = true;
                        detail.ID = returnDetail.ID;
                    }
                    else
                    {
                        detail.ID = 0;
                    }
                }
                else
                {
                    var returnDetail = returnDetails.Where(x => x.PJID == detail.PJID).FirstOrDefault();
                    if (returnDetail != null)
                    {
                        detail.Checked = true;
                        detail.ID = returnDetail.ID;
                    }
                    else
                    {
                        detail.ID = 0;
                    }
                }

修改后

foreach (var detail in salesOrder.SalesOrderDetails){
    detail.ID = 0;
                if (salesOrder.SalesRange == EnumSalesRange.产品销售 && returnDetails.Exists(x => x.ProductID == detail.ProductID))
                {
                    detail.ID = returnDetails.FirstOrDefault(x => x.ProductID == detail.ProductID).ID;
                }
                else if (salesOrder.SalesRange == EnumSalesRange.经营销售 && returnDetails.Exists(x => x.PJID == detail.PJID))
                {
                    detail.ID = returnDetails.FirstOrDefault(x => x.PJID == detail.PJID).ID;
                }
                detail.Checked = detail.ID > 0;
}

results matching ""

    No results matching ""