重构许多嵌套ifs或链接if语句

时间:2010-03-27 15:39:06

标签: refactoring

我有一个具有大量相似字段的对象(比如超过10个),我必须从可变长度的数组中分配它们。解决方案可能是基于每次检查数组长度并分配每个字段的巨大嵌套ifs

OR

一串ifs检查长度是否超出范围并在检查后每次分配。

两者似乎都是重复的。有更好的解决方案吗?

4 个答案:

答案 0 :(得分:4)

如果你的语言有切换的开关/案例,你可以这样做:

switch(array.length){
    case 15: field14 = array[14];
    case 14: field13 = array[13];
    case 13: field12 = array[12];
    // etc.
    case 1: field0 = array[0];
    case 0: break;
    default: throw Exception("array too long!");
}

答案 1 :(得分:1)

for (int i = 0; i < fieldCount; i++)
    fields[i].value = array[i];

也就是说,维护一个与您的数组值对应的字段数组。

答案 2 :(得分:1)

如果您的语言支持代理,匿名函数,那么您可以使用它们来清理它。例如,在C#中你可以这样写:

string[] values = GetValues();
SomeObject result = new SomeObject();
Apply(values, 0, v => result.ID = v);
Apply(values, 1, v => result.FirstName = v);
Apply(values, 2, v => result.LastName = v);
// etc.

apply方法如下:

void Apply(string[] values, int index, Action<string> action)
{
    if (index < values.Length)
        action(values[index]);
}

这显然取决于语言,但无论如何都要考虑。


我们可能忽略的另一个非常简单的选项是,如果您实际上尝试从此值数组初始化对象(而不是 update 现有对象) ,如果数组不够大,只接受默认值。

C#示例:

void CreateMyObject(object[] values)
{
    MyObject o = new MyObject();
    o.ID = GetValueOrDefault<int>(values, 0);
    o.FirstName = GetValueOrDefault<string>(values, 0);
    o.LastName = GetValueOrDefault<string>(values, 0);
    // etc.
}

void GetValueOrDefault<T>(object[] values, int index)
{
    if (index < values.Length)
        return (T)values[index];
    return default(T);
}

有时候,愚蠢的解决方案是最明智的选择。

答案 3 :(得分:0)

如果您的字段以与数组元素相同的顺序声明,则可以使用反射(如果您的语言可用)来设置这些值。以下是如何在Java中执行此操作的示例:

// obj is your object, values is the array of values
Field[] fields = obj.getClass().getFields();
for (int i = 0; i < fields.length && i < values.length; ++i) {
    fields[i].set(obj, values[i]);
}