2010-03-27 62 views
1

我有一个对象具有大量的类似的领域(如超过10个),我必须从一个可变长度的数组中分配他们的值。该解决方案将是IFS的基于每个时间检查阵列的长度和分配的每个字段或者一个巨大的嵌套一堆重构许多嵌套的ifs或链接如果语句

OR

IFS上的长度是否检查的链超出范围,和后的各时间分配该检查。

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

回答

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!"); 
} 
+0

如果是情况15,我需要从15分配到所有的方式...并继续这样。 – 2010-03-27 17:20:04

+0

@Icarus:由于在开关/情况下,上面的代码*将分配所有15个字段,当数组长度为15时 – 2010-03-27 19:43:04

+0

我使用的是c#,并且在其中不起作用。我不得不用案例来实现这一点。此外,曾尝试使用var args,但C#不允许使用带参数的params。 – 2010-03-29 10:33:45

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

也就是说,保持字段的数组对应于你的价值观的阵列。

+0

我真的不认为这回答了这个问题。总的来说,他试图将这些值应用于类/对象*的字段*。使所有的字段都有特殊的类型,并且使用它们自己的'value'属性并使它们可以索引(和安全),这正是他试图解决的问题,只是被重新定义为更复杂的东西。 – Aaronaught 2010-03-27 16:11:54

+0

但是,如果你已经创建了字段数组 - 通过任何方式 - 那么你可以简单地应用它,就像我上面所做的那样。与代码中的许多点解决相同的问题。做一次可转位和安全的工作,然后使用产品简化代码。这就是我所说的。 – 2010-03-27 16:28:41

+0

如果您将此定义为创建索引器属性或某些类似*特定*解决方案,我可能会同意。但事实是,您建议通过创建另一个数组来解决将数组映射到字段的问题......然后必须将其映射到完全相同的字段。 – Aaronaught 2010-03-27 16:36:37

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. 

的适用方法看起来像:

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

这显然是依赖于语言,但一些思考不管。


,我们可能会俯瞰另外一个很简单的选择是,如果你实际上是试图初始化从这个数值数组(而不是更新现有对象)一个对象,只是接受默认值如果数组不够大。

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); 
} 

有时哑溶液是最明智的选择。

+0

这可以通过创建一个代表数组并循环遍历它们变得更清洁。 – 2010-03-27 16:16:19

+0

@Hosam Aly:不是,你只需要编写与我已经编写的相同的代码来创建数组。除非你在多个地方做这件事,否则它不会保存任何东西。 – Aaronaught 2010-03-27 16:18:45

+0

除了用于跟踪索引的变量之外,它至少可以省去必须编写函数调用的次数。如果更新对象结构,恕我直言,更新它也会更容易。 – 2010-03-27 16:28:38

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]); 
} 
+0

这似乎难以置信地不可能,即使它是真实的,也是极其危险的。一个简单的类重构会破坏这个,直到运行时才会知道它;你甚至可能不会得到运行时错误,你最终会得到损坏的数据。你绝不应该依赖于类中的字段声明的顺序。 – Aaronaught 2010-03-27 16:20:11

+0

我同意这很危险,但是如果你来自Python背景,那么你可能会发现它是可以接受的。无论如何,这是一个可用于善恶的工具。 – 2010-03-27 16:25:34

+0

我不想使用这个,因为不确定反射会给我的字段顺序与在课堂上声明的顺序相同。情况总是如此吗? – 2010-03-27 17:17:40