C++ 将函数调用转发给成员是错误的做法吗?
在我最近编写的代码中,我被迫直接访问对象的成员以调用其函数,然而,这样做感觉是错误的,因为这似乎违反了封装和Demeter定律。然而,我能想到的唯一好的选择是在类中为我可能要调用的成员的每个函数编写我自己的函数,这将是非常乏味和冗余的。例如:C++ 将函数调用转发给成员是错误的做法吗?,c++,oop,C++,Oop,在我最近编写的代码中,我被迫直接访问对象的成员以调用其函数,然而,这样做感觉是错误的,因为这似乎违反了封装和Demeter定律。然而,我能想到的唯一好的选择是在类中为我可能要调用的成员的每个函数编写我自己的函数,这将是非常乏味和冗余的。例如: class Object { public: void setNum(int x) { num = x; } private: int num; };
class Object
{
public:
void setNum(int x)
{
num = x;
}
private:
int num;
};
class Object2
{
public:
Object obj;
};
int main()
{
Object2 obj2;
obj2.obj.setNum(5);
}
vs
对Object2
中的setNum
的调用被转发到Object
中的相同函数。这样的设计被认为是不好的做法吗?直接访问obj
是否更好
我也可以让Object2
从Object
继承,但在这种情况下,我将要继承的类不是设计为基类的,它会将受保护的成员暴露给Object2
,并且似乎不适合开始,因为它不是is-a关系,最好是组合
我的具体情况:我正在使用SFML制作一个游戏,有一个类Ship
,当然需要一个精灵来代表它。任何时候我想设置或获取飞船的位置、旋转等,我必须直接访问它的精灵,或者在飞船
中编写一个冗余转发功能。问题是,做这两件事中的任何一件似乎都像是一种代码气味:要么违反封装和德米特定律,要么编写冗余代码
这里的最佳实践是什么?我是否对编写简单的转发函数过于挑剔?或者在这种情况下,直接访问Ship
的精灵真的没有错吗
这个问题:事实上正是我要问的,然而,两个答案都没有给出一个好的解决方案。一个没有得到宽恕,显然封装性很差,另一个只是使用了一个getter,它似乎是一种安慰剂(如果有的话),没有人回答我的主要问题,即什么是最优雅和可接受的解决方案?什么解决方案是最好的,这在很大程度上取决于封装的基本语义。您需要尽可能地解耦代码。我将通过以下示例对此进行描述:
所以:如果封装的类太具体,不应该在外部可见,或者必须与主对象一致操作,那么编写一组代理方法是一个很好的解决方案。否则这些方法只会使代码膨胀,最好提供一种获取嵌套对象的方法。但在这种情况下,我会选择getter方法,而不是公共属性。尽管经典的javanese oop学派会这么想,但永远不要忘记,同样干燥(不要重复自己)也被认为是一种好的做法 尽管OOP只是C++编程支持的众多编程范例之一,但自从第一个汇编程序获得宏之后,WAR就是所有编程的精髓,这在OOP发明家甚至离自己父母的思想和愿望很远之前就已经成立了。 尽管我的经历不公平。。。如果尊重良好的oop实践迫使您编写重复代码的无用样板,那么这意味着
- 您所使用的语言根本不符合您想要达到的目的,无法正确支持范例或
- OOP因您试图达到的目的而中断。而C++中的机会是OOP真的是一个破碎的范例。
- 它的授权方式可以改变或改变
- 委托将隐藏成员接口的一部分
a.b.m()
减少为a.m()
。如果你写的超过。。。让我们假设三个“不做任何事只是转发”函数,这是在浪费时间
如果b有50个方法,而您只将其中的5个方法授权为私有,那么它将生成p
class Object
{
public:
void setNum(int x)
{
num = x;
}
private:
int num;
};
class Object2
{
public:
void setNum(int x)
{
obj.setNum(x);
}
private:
Object obj;
};
int main()
{
Object2 obj2;
obj2.setNum(5);
}