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”应该代表什么,再看一看它会有很大帮助吗?