C# 如何重构此方法以降低其认知复杂性

C# 如何重构此方法以降低其认知复杂性,c#,asp.net,.net,c#-4.0,c#-3.0,C#,Asp.net,.net,C# 4.0,C# 3.0,我需要帮助,我正在尝试重构此方法以降低其认知复杂性 我们可以展示这个问题 private void PopulateBook(Book b) { if (b.page.num001 == null) b.page.num001 = string.Empty; if (b.page.num002 == null) b.page.num002 = string.Empty; if (b.page.num003 == null) b.page.num003 = string.E

我需要帮助,我正在尝试重构此方法以降低其认知复杂性 我们可以展示这个问题

private void PopulateBook(Book b)
{
    if (b.page.num001 == null) b.page.num001 = string.Empty;
    if (b.page.num002 == null) b.page.num002 = string.Empty;
    if (b.page.num003 == null) b.page.num003 = string.Empty;
    if (b.page.num004 == null) b.page.num004 = string.Empty;
    if (b.page.num005 == null) b.page.num005 = string.Empty;
    if (b.page.num006 == null) b.page.num006 = string.Empty;
    if (b.page.num007 == null) b.page.num007 = string.Empty;
    if (b.page.num008 == null) b.page.num008 = string.Empty;
    if (b.page.num009 == null) b.page.num009 = string.Empty;
    if (b.page.num010 == null) b.page.num010 = string.Empty;
    if (b.page.num011 == null) b.page.num011 = string.Empty;
    if (b.page.num012 == null) b.page.num012 = string.Empty;
    if (b.page.num013 == null) b.page.num013 = string.Empty;
    if (b.page.num014 == null) b.page.num014 = string.Empty;
    if (b.page.num015 == null) b.page.num015 = string.Empty;
    if (b.page.num016 == null) b.page.num016 = string.Empty;
    if (b.page.num017 == null) b.page.num017 = string.Empty;
    if (b.page.num018 == null) b.page.num018 = string.Empty;
    if (b.page.num019 == null) b.page.num019 = string.Empty;
    if (b.page.num020 == null) b.page.num020 = string.Empty;
}

如果您想减少代码行数,并假设“页面”是一个仅具有这些属性的类,那么您可以使用某种反射来使用循环设置属性

  private static void PopulateBook(Book b)
        {
            var page = b.page;
            PropertyInfo[] properties = typeof(page).GetProperties();
            foreach(var prop in properties)
            {
                if(prop.GetValue(page) == null)
                prop.SetValue(page, String.Empty);
            }
        }

您可以重新设计Page类

我不知道num001等是什么,指的是页面上的数字。是单词索引吗? 字符数,具体字符数? 或者完全是别的什么

但不管是什么:

public class Page {

   public List<Num> numList

   public Page()
   {
      NumList = InitializeNumList();
   }

   private List<Num> InitializeNumList()
   {
      NumList = new List<Num>{};
      for(int i = 0; i < 20; i++)
      {
          NumList.add(new Num(i))
      }
   }

} 

public class Num
{
   public int Id {get;set;};
   public string SomeString {get;set;}

   public Num(int id)
   {
       Id = id;
       SomeString = "";
   }
}
公共类页面{
公共列表numList
公共网页()
{
NumList=initializeEnumList();
}
私有列表初始化EnumList()
{
NumList=新列表{};
对于(int i=0;i<20;i++)
{
NumList.add(新的Num(i))
}
}
} 
公共类数
{
公共int Id{get;set;};
公共字符串SomeString{get;set;}
public Num(int-id)
{
Id=Id;
SomeString=“”;
}
}

什么是
b.page
?我猜它有20个编号字段?您能再显示一点上下文吗?首先将所有这些字段/属性放入一个数组或列表中。然后你就可以循环这个,然后做一行
if
我认为你可以完全摆脱这个代码,毕竟,让页面/nums可枚举可能是最好的解决方案。如果这是不可能的,你的语言版本是C>8或更高,你也可以考虑使用<代码>?例如
b.page.num001???=string.Empty。我不认为反射会提高代码的认知复杂性(这是问题的要求)。请不要每次觉得需要“修补”糟糕的体系结构时都求助于反射。除了maintainance-hell,你什么都得不到。然后你有一个对象列表,其中包含一个int。。。你赢了什么?你把明显的字符串值放在哪里?显然,这里没有分支。复杂性降低了。编辑的Num,要有一个字符串,也可以很容易地重置字符串。你可以为每一个循环建立一个合适的循环,然后将它们全部重置。如果我们知道“num”应该代表什么,再看一看它会有很大帮助吗?