【问题标题】:Designing sets of data and support class extension OO approach, in c++在 C++ 中设计数据集并支持类扩展 OO 方法
【发布时间】: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++


【解决方案1】:

扩展@tp1 在 Field 类中的 ID 字段和枚举的出色想法,您实际上可以使其非常灵活。如果您愿意将字段类型的数量限制为 32,您甚至可以将一组标志作为 CompareTo 中的 ID。然后您可以同时比较多个字段。这种方法有意义吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多