C#优化新对象的创建(太多、难看的代码)

C#优化新对象的创建(太多、难看的代码),c#,constructor,getter-setter,C#,Constructor,Getter Setter,我担心这个问题可能很愚蠢/我不知道该怎么问这个问题,但现在我们开始: 我目前正在做一个项目,需要创建很多新对象。 属性由多个ifs设置,代码在我看来非常混乱 /// <summary> /// Creates a new <see cref="StockItem"/> based on the <see cref="Article"/> of the given <param name="input"/>. /// </summary>

我担心这个问题可能很愚蠢/我不知道该怎么问这个问题,但现在我们开始:

我目前正在做一个项目,需要创建很多新对象。 属性由多个ifs设置,代码在我看来非常混乱

/// <summary>
/// Creates a new <see cref="StockItem"/> based on the <see cref="Article"/> of the given <param name="input"/>.
/// </summary>
/// <param name="input"></param>
public static StockItem CreateStockItem(InputParameterCreateStockItem input)
{
    var returnStockItem = new StockItem();

    //If there is an imob item, start from there and update everything
    if (input.StockItem != null)
    {
        returnStockItem = input.StockItem;
    }
    else
    {
        //When creating a stock item, the status is ALWAYS 1
        returnStockItem.Status = 1;
    }

    #region Properties
    returnStockItem.PartTypeNo = (Int32)input.Article.ArticleNumberPrefix + "-" + input.Article.ArticleNumber.Value.ToString("D8");
    returnStockItem.Kardex = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.KardexT) ?? String.Empty;
    returnStockItem.WeldNumber = input.WeldNumber;
    returnStockItem.ObjectNo = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ObjectNoT) ?? ConvertHelper.GetObjectNo(input.Article);
    returnStockItem.Synonymous = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.SynonymousT) ?? String.Empty;
    returnStockItem.ExtSerialNo = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ExtSerialNoT) ?? String.Empty;
    returnStockItem.ArticleReference = (ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ArticleReferenceT)) ??
                                   ConvertHelper.RemoveColorCodeFromReference(input.Article.Reference, input.ColorList);
    returnStockItem.ArticleName = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ArticleNameT) ??
                              ConvertHelper.GetCorrectTranslation(input.Article.Names, "ENG");
    returnStockItem.Length = ConvertHelper.GetMeasurementInMeters(input.Article, ConvertHelper.ImobLengthT, ConvertHelper.ClsLengthT);
    returnStockItem.Width = ConvertHelper.GetMeasurementInMeters(input.Article, ConvertHelper.ImobWidthT, ConvertHelper.ClsWidthT);
    returnStockItem.Height = ConvertHelper.GetMeasurementInMeters(input.Article, ConvertHelper.ImobHeightT, ConvertHelper.ClsHeightT);
    returnStockItem.Weight =
        Decimal.Parse(!String.IsNullOrEmpty(ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ImobWeightT))
            ? ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ImobWeightT)
            : ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ClsWeightT) ?? "0");
    returnStockItem.DepreciationCode = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.DepreciationCodeT) ??
                                   (input.Article.DepreciationCode != null ? input.Article.DepreciationCode.InsuranceValueCode.ToString() +
                                    input.Article.DepreciationCode.ActualValueCode.ToString() +
                                    input.Article.DepreciationCode.RevaluationCode.ToString() : String.Empty);
    returnStockItem.Value = ConvertHelper.GetValue(input.Article);
    returnStockItem.ValueDate = ConvertHelper.GetValueDate(input.Article);
    returnStockItem.Brand = ConvertHelper.GetBrand(input.Article);
    returnStockItem.Remarks = ConvertHelper.GetRemarks(input.Article);
    returnStockItem.InsuranceValue = ConvertHelper.GetInsuranceValue(input.Article);
    returnStockItem.StockItemGroupID = ConvertHelper.GetStockItemGroupId(input.Article, input.ClsImobArticleGroups, input.StockItemGroups);
    returnStockItem.StockAllocations = StockAllocationDAO.GetStockAllocationsForArticleGroupIDs(input.Article, input.ClsAssignedArticleGroups, input.ClsUnAssignedArticleGroups, input.ClsImobArticleGroups, input.StockAllocationsDictionaryByCode, input.StockAllocationsDictionaryByName);
    #endregion

    //AddMotherStockItemColorCode(input.Article, stockItem);

    return returnStockItem;
}
//
///基于给定对象的属性创建新的。
/// 
/// 
公共静态StockItem CreateStockItem(InputParameterCreateStockItem输入)
{
var returnStockItem=新StockItem();
//如果有imob项目,从那里开始并更新所有内容
if(input.StockItem!=null)
{
returnStockItem=input.StockItem;
}
其他的
{
//创建库存项目时,状态始终为1
returnStockItem.Status=1;
}
#区域属性
returnStockItem.PartTypeNo=(Int32)input.Article.ArticleNumberRefix+“-”+input.Article.ArticleNumber.Value.ToString(“D8”);
returnStockItem.Kardex=ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications,ConvertHelper.Kardex)??String.Empty;
returnStockItem.WeldNumber=输入.WeldNumber;
returnStockItem.ObjectNo=ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications,ConvertHelper.ObjectNoT)??ConvertHelper.GetObjectNo(input.Article);
returnStockItem.Synonymous=ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications,ConvertHelper.SynonymousT)??String.Empty;
returnStockItem.ExtSerialNo=ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications,ConvertHelper.ExtSerialNoT)?String.Empty;
returnStockItem.ArticleReference=(ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications,ConvertHelper.ArticleReference))??
ConvertHelper.RemoveColorCodeFromReference(input.Article.Reference,input.ColorList);
returnStockItem.ArticleName=ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications,ConvertHelper.ArticleNameT)??
ConvertHelper.GetCorrectTranslation(input.Article.Names,“ENG”);
returnStockItem.Length=ConvertHelper.GetMeasurementInMeters(input.Article、ConvertHelper.ImobLengthT、ConvertHelper.clsLengtt);
returnStockItem.Width=ConvertHelper.GetMeasurementInMeters(input.Article、ConvertHelper.imobWidth、ConvertHelper.ClsWidthT);
returnStockItem.Height=ConvertHelper.GetMeasurementInMeters(input.Article、ConvertHelper.ImobHeightT、ConvertHelper.ClsHeightT);
返回库存物品。重量=
Decimal.Parse(!String.IsNullOrEmpty(ConvertHelper.GetTechSpecValue(input.Article.technicalsspecifications,ConvertHelper.ImobWeightT))
?ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications,ConvertHelper.ImobWeightT)
:ConvertHelper.GetTechSpecValue(input.Article.technicalsspecifications,ConvertHelper.ClsWeightT)??“0”);
returnStockItem.DevalentionCode=ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications,ConvertHelper.DevalentionCodet)??
(input.Article.DistrictionCode!=null?input.Article.DistrictionCode.InsuranceValueCode.ToString()+
input.Article.DevalentionCode.ActualValueCode.ToString()+
input.Article.decivalioncode.rewavaluecode.ToString():String.Empty);
returnStockItem.Value=ConvertHelper.GetValue(input.Article);
returnStockItem.ValueDate=ConvertHelper.GetValueDate(input.Article);
returnStockItem.Brand=ConvertHelper.GetBrand(input.Article);
returnStockItem.Comments=ConvertHelper.getComments(input.Article);
returnStockItem.InsuranceValue=ConvertHelper.GetInsuranceValue(input.Article);
returnStockItem.StockItemGroupID=ConvertHelper.GetStockItemGroupId(input.Article,input.ClsImobArticleGroups,input.StockItemGroups);
returnStockItem.StockAllocations=StockAllocationDAO.GetStockAllocationsforArticleGroupId(input.Article,input.ClsAssignedArticleGroups,input.ClsUnAssignedArticleGroups,input.ClsMobArticleGroups,input.StockAllocationsDictionaryByCode,input.StockAllocationsDictionsDictionaryByName);
#端区
//AddMotherStockItemColorCode(input.Article,stockItem);
退货库存物品;
}
我想知道是否有更好(更具可读性)的方法来做到这一点

我已经做过的事情:

  • 将更复杂的代码移动到帮助器类(
    ConvertHelper
  • 创建了一个输入参数对象(我需要很多列表来检查某些东西)
  • 将整个方法转移到工厂(感觉没有必要?)
但我觉得整件事很混乱

/// <summary>
/// Creates a new <see cref="StockItem"/> based on the <see cref="Article"/> of the given <param name="input"/>.
/// </summary>
/// <param name="input"></param>
public static StockItem CreateStockItem(InputParameterCreateStockItem input)
{
    var returnStockItem = new StockItem();

    //If there is an imob item, start from there and update everything
    if (input.StockItem != null)
    {
        returnStockItem = input.StockItem;
    }
    else
    {
        //When creating a stock item, the status is ALWAYS 1
        returnStockItem.Status = 1;
    }

    #region Properties
    returnStockItem.PartTypeNo = (Int32)input.Article.ArticleNumberPrefix + "-" + input.Article.ArticleNumber.Value.ToString("D8");
    returnStockItem.Kardex = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.KardexT) ?? String.Empty;
    returnStockItem.WeldNumber = input.WeldNumber;
    returnStockItem.ObjectNo = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ObjectNoT) ?? ConvertHelper.GetObjectNo(input.Article);
    returnStockItem.Synonymous = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.SynonymousT) ?? String.Empty;
    returnStockItem.ExtSerialNo = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ExtSerialNoT) ?? String.Empty;
    returnStockItem.ArticleReference = (ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ArticleReferenceT)) ??
                                   ConvertHelper.RemoveColorCodeFromReference(input.Article.Reference, input.ColorList);
    returnStockItem.ArticleName = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ArticleNameT) ??
                              ConvertHelper.GetCorrectTranslation(input.Article.Names, "ENG");
    returnStockItem.Length = ConvertHelper.GetMeasurementInMeters(input.Article, ConvertHelper.ImobLengthT, ConvertHelper.ClsLengthT);
    returnStockItem.Width = ConvertHelper.GetMeasurementInMeters(input.Article, ConvertHelper.ImobWidthT, ConvertHelper.ClsWidthT);
    returnStockItem.Height = ConvertHelper.GetMeasurementInMeters(input.Article, ConvertHelper.ImobHeightT, ConvertHelper.ClsHeightT);
    returnStockItem.Weight =
        Decimal.Parse(!String.IsNullOrEmpty(ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ImobWeightT))
            ? ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ImobWeightT)
            : ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ClsWeightT) ?? "0");
    returnStockItem.DepreciationCode = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.DepreciationCodeT) ??
                                   (input.Article.DepreciationCode != null ? input.Article.DepreciationCode.InsuranceValueCode.ToString() +
                                    input.Article.DepreciationCode.ActualValueCode.ToString() +
                                    input.Article.DepreciationCode.RevaluationCode.ToString() : String.Empty);
    returnStockItem.Value = ConvertHelper.GetValue(input.Article);
    returnStockItem.ValueDate = ConvertHelper.GetValueDate(input.Article);
    returnStockItem.Brand = ConvertHelper.GetBrand(input.Article);
    returnStockItem.Remarks = ConvertHelper.GetRemarks(input.Article);
    returnStockItem.InsuranceValue = ConvertHelper.GetInsuranceValue(input.Article);
    returnStockItem.StockItemGroupID = ConvertHelper.GetStockItemGroupId(input.Article, input.ClsImobArticleGroups, input.StockItemGroups);
    returnStockItem.StockAllocations = StockAllocationDAO.GetStockAllocationsForArticleGroupIDs(input.Article, input.ClsAssignedArticleGroups, input.ClsUnAssignedArticleGroups, input.ClsImobArticleGroups, input.StockAllocationsDictionaryByCode, input.StockAllocationsDictionaryByName);
    #endregion

    //AddMotherStockItemColorCode(input.Article, stockItem);

    return returnStockItem;
}
谢谢,, 托马斯你试过AutoMapper吗? 花点时间浏览一下文档,你会发现你会很快恢复时间。

你试过AutoMapper吗?
花点时间浏览一下文档,你会发现你很快就能把时间花回来。

也许这对CodeReview()更好?你还应该澄清“更好”是什么意思?可读性/性能等。如果“使用”正确,您应该能够从ConvertHelper.GetMeasurementInMeters中删除ConvertHelper。删除所有
ConvertHelper
内容并创建扩展方法。C#不是java。@德拉佩,谢谢,那可能是发布这篇文章的更好地方。@Rawling我应该重命名我的返回值,我更新了代码。谢谢!:)也许这对CodeReview()更好?你还应该澄清“更好”是什么意思?可读性/性能等。如果“使用”正确,您应该能够从ConvertHelper.GetMeasurementInMeters中删除ConvertHelper。删除所有
ConvertHelper
内容并创建扩展方法。C#不是java。@德拉佩,谢谢,那可能是发布这篇文章的更好地方。@Rawling我应该重命名我的返回值,我更新了代码。谢谢!:)