gpt4 book ai didi

c++ - 当要访问的对象被多次封装时,如何正确使用setter?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:42 24 4
gpt4 key购买 nike

我经常为这个问题而苦恼,找不到任何明确的解决方案。我想我知道 getters/setters 的动机。

先验信息:

在实现现实生活中的数据时,通常会将数据封装在多个层中。例如:

// 1st stage data types ------------------------------
struct Cartesian
{
int32_t x;
int32_t y;
int32_t z;
}

struct GeoLocation
{
double_t latitude;
double_t longitude;
int32_t altitude;
}

// 2nd stage data types ------------------------------
struct Drone
{
Cartesian baseOffset; // m
Cartesian velocity; // m/s
}

struct Plane
{
GeoLocation location; // semicircle
Cartesian velocity; // knots
}

// 3rd stage data types ------------------------------
struct Swarm
{
Plane base;
Drone member[10];
}

在 C++ 中,我使用类而不是结构(因为为什么不呢?)。当通过某个通信 channel 接收到关于 Swarm[3].member[8].velocity.x 的数据时,问题就出现了。意识到一个系统中可以有多个群。

要求:

根据 MISRA C++ 规则,函数不能返回对任何类成员的非常量引用,因为在没有类的许可/知识的情况下不应更改成员。

问题:

当我使用 getter 和 setter 时,我不能说“Swarm[3].member[8].velocity.x”;相反,我可以用几种方式来表达这一点:

1. 这是不允许的,因为 get() 函数返回 const 引用并且不能调用 set()。

Swarm[3].getMember(8).getVelocity().setX(5); (or set("X", 5))

2. 该方法将所有负担都转移到 Swarm 类中。虽然代码对于调用 Swarm 类的人来说似乎更短,但在发生更改时编码和在后台进行维护是非常繁重的。

Swarm[3].setMemberVelocity(8,X,5)

3. 这种方法有点介于两者之间,但这里的问题是您可能会牺牲效率,因为每次新数据首先到达时,您都会创建一个临时变量,获取它,填充它并设置它

Cartesian tempVelocity = Swarm[3].getMember(8).getVelocity();

tempVelocity.x = 5;

Swarm[3].setMemberVelocity(8, tempVelocity);

这三种方法中哪一种最好?或者我可以使用任何替代方案吗?

提前致谢。

最佳答案

我可能不完全了解 MISRA。但是,它似乎对灵活的设计(而且根本不是 c++ish)适得其反。假设我发现我需要:

struct SuperSwarm {
Swarm swarms[10];
};

然后按照您的选项 2,我需要为所有内部聚合实现大量 setter / getter ,因为在您的情况下听起来有点像您需要能够单独设置所有数据。如果您需要更改 Drone 中的某些内容,也会发生同样的事情,那么所有内容都需要更新。对于良好且灵活的设计,您可以看到这真的是一场噩梦。遵守您制定的规则并没有真正好的选择。这就是为什么您通常返回一个非常量引用并在不需要特殊处理时使用它的原因。这在某些方面让您的代码经得起 future 考验,而不仅仅是一个公共(public)成员变量。

您可以“作弊”(并使用您的选项 3)并在设计方面仍然灵活的一种方法是代理所有内容——例如 std::shared_ptr。当你返回一个 std::shared_ptr 时,它看起来像是一个拷贝而且它确实是 - 但它实际上只是同一个指向对象的代理(这类似于事情在引擎盖下的工作方式一些其他的 OO 编程语言)。不过,您可能需要更合适的代理类。但又何必呢?为什么不直接使用结构并说它是一个数据结构,而不是某个承担(另一个)责任的类。毕竟,你会清楚地表达你的意图。

关于c++ - 当要访问的对象被多次封装时,如何正确使用setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52661597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com