通过唯一的成员 ID 来识别对象是个好主意吗?
Posted
技术标签:
【中文标题】通过唯一的成员 ID 来识别对象是个好主意吗?【英文标题】:Is it a good idea to identify objects by an unique member id? 【发布时间】:2015-09-11 18:36:03 【问题描述】:我的问题是,我应该如何将对象相互关联。
我有两个向量,vector<Baby> babies
和 vector<Toy> toys
。每个婴儿和每个玩具都有一个独特的成员int id
。因此所有的婴儿和玩具都从 0 到 n 编号。
现在,每个婴儿都有一个喜欢的玩具,每个玩具都有一个首选的婴儿。到目前为止,我使用了指针:Baby 有一个指向他喜欢的 Toy 的指针,而这个 Toy 有一个指向 Baby 的指针。 (没关系,因为我永远不会改变向量) 然而,婴儿和玩具的区别在于它们的 ID,而不是它们在向量中的位置。
随着我的进展,我质疑我的设计并发现指针有效,但它们可能会导致将来出现问题。相反,如果我使用 ID 就可以了,但我需要访问整个婴儿或玩具向量。
在这种情况下是否有一种常见的做法?使用指针是个好主意吗?我是否应该编写自己的容器以智能方式使用 ID?
编辑: 我想补充一点,我考虑过一张将婴儿和玩具联系起来的地图。但是,我在运行时确定婴儿与玩具的关系(反之亦然)。找到这种关系是该计划的主要部分。因此我不确定我是否可以使用地图。但是,我会看看它(直到现在还没有使用它)。更重要的是,关于首选玩具和婴儿的信息必须是对象的一部分,而不是(仅)高级数据结构的一部分。
【问题讨论】:
您考虑过使用std::map<int, int>
吗?您可以将矢量中婴儿的位置用作key
,并将相应玩具在其矢量中的位置用作value
,尤其是在您不更改矢量的情况下。或者,如果您不想要这些职位,您可以使用 ID 作为键和值
如果你还没有听说过“字符串类型的接口”,我鼓励你去查一下。不要为每个 ID 使用 int
,而是使 BabyId
和 ToyId
是不同的类型;您不想意外回收婴儿,是吗?
指针没问题。尽量不要使用 ID - 或仅用作名称等简单属性...指针始终是唯一的,ID 可能会被错误地重复。
如果你害怕有泄漏指针 - 然后考虑使用智能指针(弱和 shared_ptr)
如果您的“ID”只是向量的索引,那么是的,这是个好主意。因为这样您就不会遇到矢量重新分配移动矢量并使指针无效的问题。如果比较复杂,那么你开始需要一个std::map
记录ID和向量索引的关联。
【参考方案1】:
为关系使用唯一 ID 有一些优势。 ID 不能像指针一样悬空,也不能像向量索引那样越界。它们可以很容易地序列化。当向量被重新分配或重新排序时,它们不会失效。
但它们也有一些缺点。您可以确保它们保持唯一性(使用 GUID 可以帮助解决此问题)。使用它们也可能非常低效。要通过 ID 查找对象,您必须搜索整个向量。您可以通过向量创建一个查找 map
/unordered_map
/vector
,其中键是 ID,值是指向向量中对象或索引的指针。
【讨论】:
在我的情况下,通过 ID 查找元素没有问题,因为它们可以在向量中具有相应的位置。 @dani 好的,我以为你说每个对象的区别在于它的 ID,而不是它在向量中的位置。在这种情况下,你很好。唯一的缺点是您的数据结构非常固定,您无法轻松删除对象或重新排序。 好吧,如果我使用 ID,我可以重新排序它们。我不会破坏或创建新对象。只需在整个程序中将它们相互分配即可。【参考方案2】:另一种方法是使用std::map<Baby, Toy>
/std::map<Toy, Baby>
甚至std::unordered_map<Baby, Toy>
/std::unordered_map<Toy, Baby>
。
#include <map>
std::map<Baby, Toy> babyMap;
std::map<Toy, Baby> toyMap;
// ...
babyMap[theBaby] = theToy;
toyMap[theToy] = theBaby;
如果Baby
“碰巧”喜欢不止一个玩具,反之亦然,您可以使用std::map<Baby, std::set<Toy>>
s/std::map<Toy, std::set<Baby>>
。
P.D:通常,int
风格的 ID 是一种不好的代码味道,并且可能在以后导致严重的问题。
【讨论】:
【参考方案3】:这个结构中的一个向量呢?
struct BabyToy Baby B; Toy T;;
或
class BabyToy
public:
Baby B;
Toy T;
BabyToy(Baby b, Toy t)
B=b;
T=t;
;
【讨论】:
这个问题并没有说明一个玩具是否喜欢喜欢该玩具的同一个婴儿,或者实际上只有一个婴儿喜欢一个玩具。 @Ben Voigt - 你是对的,我的错误是由于对问题的误解,也是因为我的英语不好:我认为这是婴儿和玩具之间的 1:1 关系......无论如何,我是这个网站的新手,我为我的回答的肤浅和仓促道歉......将来我会尝试更仔细地阅读问题,只有在理解问题后才能给出我的答案。 PS:我刚才添加了这个评论,因为当我提供我的答案时,我刚刚记录并且还不知道所有规则(以及被投反对票的风险!)【参考方案4】:抱歉,但在您的问题 J 中阅读:
现在,每个婴儿都有一个喜欢的玩具,每个玩具都有一个喜欢的玩具 宝贝。
【讨论】:
@ KemyLand - 对不起,这不是一个答案,而是添加到我之前的答案的评论(我是这个网站的新手,我的英语有些困难,我通过阅读支持中心了解规则>刚刚回答)以上是关于通过唯一的成员 ID 来识别对象是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章
通过 Spring MVC 框架包含其他 JSP 是个好主意吗?