【发布时间】:2012-05-26 01:05:52
【问题描述】:
我目前正在做一个项目,并且在设计上出现了一些问题。 我有一个名为 Key 的类,它由几个字段组成。这个 Field 类是一个母类,他们的儿子如 Age、Name 等实现了 Field。在 Key 类内部有一个属性,它是一个 Fields 数组,用于保存不同类型的 Fields。
class Key {
private:
Field * fieldList;
}
我在一个团队中工作,但出现了一个我无法辩护的设计选择,因为我不知道如何回答以下问题......或者可能缺乏它?我相信您能够让我对此敞开心扉。
这个 Key 类的目的是保存几个字段。这个类的存在是因为我要处理这种类型的数据。
(姓名,年龄....)
这就是我认为它已经实现的样子:
Key myKey = Key();
Age newAge = Age(50);
myKey.add(newAge);
Key 类的 add 方法的原型如下所示:
void Key::add(Field);
正如您可能已经假设的那样,由于 Key 类有一个 Field 数组,因此该方法接收一个 Field,并且由于 Age 也是 Field,这是继承的原因,所以这就像一个魅力。 Name 类和将来可能出现的其他类也是如此。
这与数据库中的想法相同,其中行包含数据,列属于属性,因此同一列具有相同类型的属性。
我们还想仅通过其中一个字段来比较 2 个 Key,例如:
假设我有 2 个包含此数据的密钥:
(约翰,50 岁)
(保罗,60 岁)
我的方法是这样的:
myKey1.compareTo(myKey2, 2)
如果第一个 myKey1 的第二个属性大于、等于或小于第二个 myKey2 上的属性,这将回答。
这有问题。当我使用 add 方法时,我随机将不同类型的字段添加到 Key 对象中,比如首先说 Age,然后是 Name,等等。我的 Key 对象按出现的顺序将它们添加到它的内部数组中。 因此,当我使用 compareTo 方法时,没有什么可以保证在两个对象中,它们数组的第二个元素将有一个字段,即名称字段,因此如果这不是真的,它可能会将名称与年龄,因为它里面只有一个字段数组,只要 Key 类知道,它们就是相同的类型。
这是我的解决方案,但我无法回答的是,如何解决这个问题。
我团队的另一位成员提出,我们为每个现有字段的键类实现一个方法,即:
myKey.addAge(newAge);
myKey.addName(newName);
里面仍然有 Field 数组,但是这一次,该类可以向您保证 Age 将位于数组的第 1 位,而 Name 将位于数组的第 2 位,因为每个方法都会使确定。
这个明显的问题是我必须为存在的每种类型的字段添加一个方法。这意味着如果将来我想添加说“出生日期”并创建新的 Date 类,我将不得不添加一个方法 addDate,依此类推…… 我的团队成员给我的另一个原因是,当指出我的方法为什么不好时,“我们不能相信外部用户会按照他们应该订购的方式添加字段”。
所以总结一下:
在第一种方法中,Key 类取决于添加字段的程序员,以确保它们具有应有的顺序,但作为好处,无需为每种类型的字段添加方法。
在第二种方法中,Key 类通过为存在的每种类型 Field 实现一个方法来确保顺序正确,但是随后,通过创建每种类型的新 Field,该类会变得更大并且更大。
对此有什么想法吗?有解决办法吗?
提前谢谢,如果我不清楚,我很抱歉,如果需要我会添加新的细节。
【问题讨论】:
-
您的所有问题不都源于您在结构体的 Field * fieldList inteasd 中使用原始指针数组吗?
-
在字段类中添加一个 ID 字段,然后使用 ID 的枚举来识别键中的正确字段。
标签: c++