我有这样一个条件:
if (string.IsNullOrEmpty(filename) || size != "Large" || size != "Medium" || size != "Small")
将来的可能性我必须在size
声明中管理更多if
。
我想知道是否存在一种更易于管理和可读的方式来编写这种情况。
请提供一个真实的例子,感谢你的时间。
答案 0 :(得分:6)
您可以保留单词的哈希集并检查:
HashSet<string> filterWords = new HashSet<string>();
// Put all words in the hash set
if (filterWords.contains(size))
{
// Do what ever you need
}
答案 1 :(得分:3)
// you could externalize and manage this list somewhere else
var sizes = new[] { "Large", "Medium", "Small" };
if (string.IsNullOrEmpty(filename) || !sizes.Contains(size))
{
...
}
答案 2 :(得分:3)
将尺寸放入某种集合中,并使用“包含”。有关示例,请参阅MSDN:http://msdn.microsoft.com/en-us/library/bb352880.aspx
答案 3 :(得分:1)
选项1:
编写一个返回bool且只包含大小测试的小函数,并在if
中使用它。
if (string.IsNullOrEmpty(filename) || GoodSize(size))
{
//...
}
private bool GoodSize(string size)
{
return size != "Large" || size != "Medium" || size != "Small";
}
选项2:
创建要测试的尺寸列表并使用Contains
:
var goodSizes = new[] { "Large", "Medium", "Small" };
if (string.IsNullOrEmpty(filename) || !goodSizes.Contains(size))
{
//...
}
您可以将两种选项结合起来,以获得更好的清晰度和封装效果。
答案 4 :(得分:1)
如果他们要改变,也许静态列表更好:
private static List<string> Sizes = new List<string> { "large", "medium", "small" };
if (string.IsNullOrEmpty(filename) || Sizes.Contains(size.ToLower()))
{
}
对于更清晰的代码,将大小检查封装到自己的方法中,并在需要时修改该方法:
if (MeetsSizeRequirementsOrIsNull(filename, size))
{
}
private static bool MeetsSizeRequirementsOrIsNull(string filename, string size)
{
List<string> sizes = new List<string>() { "..." };
return string.IsNullOrEmpty(filename) || sizes.Contains(size.ToLower())
}
答案 5 :(得分:1)
如果测试结果有多件事要做,那么将其作为开关/案例写出来可能更具可读性。
否则,如果你有这些值的负载,那么将列表保存在某些字典中可能更好 - 让我们说notHandledSizes
。分配“大”=&gt;是的,“中”=&gt;是的,...并且只检查该字典中是否存在size
并且为真。
答案 6 :(得分:1)
你所做的事情看起来是最直接的做法。任何修改都只会将其他地方的混乱。如果您不需要在其他任何地方重用此代码,我会保持原样。
答案 7 :(得分:1)
以下换行符使其更具可读性。
if (string.IsNullOrEmpty(filename) ||
size != "Large" ||
size != "Medium" ||
size != "Small")
设计提示
如果许多对象涉及long if条件,那么编写在这些类中返回true / false的小属性/方法是很好的。
if (string.IsNullOrEmpty(filename) || object.IsProperSize)
有时枚举标志属性也有助于此类情况。请查看here以获得更好的解释。