我研究多体系统的动力学,并试图将OO技术应用于我的各种机械系统建模工作中。我在工作中遇到的一件事是,我创建几个构建块类是有意义的,这些类在更高级别的类中用作私有成员变量,代表更复杂的系统。
我正在努力的是,数值分析中的一个常见任务是参数分析 - 基本上看看系统的行为如何随着您的参数变化而变化。通过组合强加的分层嵌套,允许对包含更复杂对象的私有成员变量中的参数进行细粒度控制的最佳方法是什么?返回一个我知道的引用是皱眉,但我看到的唯一另一个选择是重复重建高级对象,或者提供许多设置/获取私有成员数据的包装器设置器/访问器(并且可能有一些逻辑来确保数据完整性)。
这是一个典型的例子:
template <typename T>
class fooA {
public:
/* setters, getters, etc... */
private:
T w,x,y,z;
};
template <typename T>
class fooB {
public:
/* setters, getters, etc... and maybe ways to set/get private members of type class A */
private:
T d, e, f, g, h;
fooA<T> i, j, k;
};
调整fooB类的私有i,j,k成员的w,x,y,z数据的最佳(或首选)方法是什么?在fooB类中编写setter / getter,或者返回引用,还是别的什么?我的应用程序中的一个常见用例是想要对fooB实例的i成员的w,x,y,z量进行参数。
编辑: 我正在建模的对象是一辆自行车,我用总共31个参数描述。这些参数中有30个具有前后模拟,因此我选择创建一个类来表示这15个参数,然后将自行车类中的两个作为私有成员变量。这15个参数中的11个可以被分组为一组参数,这些参数对于它自己的类是有意义的,所以我再次将它们分组到一个类中并使其成为具有15个参数的类的私有成员。在该类中,这11个参数中的6个可以进一步集中到他们自己的类中。所以,我基本上有四个级别的嵌套。因此,如果最高级自行车类的客户想要调整最低级别中的一个参数(这是我的应用程序中的典型用例),他们可以:
也许我应该压缩层次结构并将我提到的所有各种类都变成顶级自行车类的成员变量,而不是将它们嵌套得那么多?这将导致自行车类的更多成员变量,但更少的嵌套,并且将使自行车类的setter / getter的写入更加直接。思考?
答案 0 :(得分:1)
至少在我工作过的地方,这种做法的“通常”方式有 一直使用setter和getters:
class A
{
T myX;
public:
T x() const { return myX; }
void x( T const& newX ) { myX = newX; }
};
然而,一般来说,太多的二传手和吸气手都是不好的标志
设计。在这种情况下,如果我理解正确,你的班级就有了
可以被表征为“参数”的成员集,其影响
它如何完成它的工作,但是由哪些人定义,并且可以由
班级的用户。在这种情况下,我建议创建一个组件
代表他们;因为这是纯数据(没有行为),所以struct
看起来更合适。在这种情况下,你只有一个setter
并且得到了。或者单个函数返回对引用的引用
参数。在这种情况下,我认为返回引用将是
非常合适;事实上,你已经重新组织了客户的一切
代码可以在单独的实体中修改,具有语义上的重要性
类型名称,足以使整体逻辑清晰。
答案 1 :(得分:0)
如果您需要在每次更改w,x,y或z时检查完整性,则必须使用setter。任何其他东西都会在没有经过验证的情况下为价值变化创造一个漏洞。
由于某些原因,您似乎不愿意编写getter / setter,但这是非常标准的OO技术。
答案 2 :(得分:0)
对于只读操作,您始终可以返回const
引用。例如
class fooB
{
public:
fooA<T> const & get_i() const { return i; }
...
};
对于设置操作,您指出必须在合成中的组件之间保持一些约束。有两种方法可以实现这一目标:
fooB
类,并保持(子)系统的一致性。fooB
可以返回对组件的引用,因为当组件已经set
时,组件有责任向相关的其他人发送消息(即,调用更新功能)。设置组件之间的通信通道(例如,带有监听器和注册的观察者模式)可以通过fooB
来完成。