我研究多体系统的动力学,并尝试将 OO 技术应用到我为各种机械系统建模的工作中。我在工作中遇到的一件事是,创建几个构建 block 类是有意义的,这些构建 block 类用作表示更复杂系统的更高级别类中的私有(private)成员变量。
我正在努力解决的问题是,数值分析中的一项常见任务是参数分析——本质上是查看系统的行为如何随着您改变其参数而变化。通过组合强加的层次嵌套,允许对包含更复杂对象的私有(private)成员变量中的参数进行细粒度控制的最佳方法是什么?返回引用我知道皱眉,但我看到的唯一其他选择是重复重建高级对象或提供大量包装器 setter /访问器来设置/获取私有(private)成员数据(并且可能有一些逻辑来确保数据完整性)。
这是一个典型的例子:
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 类的私有(private) i、j、k 成员的 w、x、y、z 数据的最佳(或首选)方法是什么?在 fooB 类中写 setter/getter,或者返回一个引用,或者别的什么?我的应用程序中的一个常见用例是想要对 fooB 实例的 i 成员的 w、x、y、z 数量做一个参数。
编辑: 我正在建模的对象是一辆自行车,我用总共 31 个参数来描述它。其中 30 个参数有前后模拟,所以我选择创建一个类来表示这 15 个参数,然后让自行车类将其中两个作为私有(private)成员变量。这 15 个参数中的 11 个可以分组到一组参数中,这些参数对其自己的类有意义,因此我再次将它们分组到一个类中,并使其成为具有 15 个参数的类的私有(private)成员。在该类别中,这 11 个参数中的 6 个可以进一步归为它们自己的类别。所以,我基本上有四层嵌套。因此,如果最高级别自行车类的客户想要调整最低级别的参数之一(这是我的应用程序中的典型用例),他们可以:
- 构造一个全新的对象,在构造函数中传递新的参数
- 我可以提供某种粒度级别的 setter/getter,也许一直到最低级别。如果我以最小的粒度级别提供 setter,我的高级类就会变得有点乱,正如许多帖子所提到的,这可能不是一个好的设计。但我不确定如何以其他方式允许访问。
也许我应该扁平化层次结构并将我提到的所有各种类都放入顶级自行车类的成员变量中,而不是将它们嵌套太多?这将导致自行车类的成员变量更多,但嵌套更少,并且会使自行车类的 setter/getter 的编写更加直接。想法?
最佳答案
至少在我工作过的地方,“通常”的做法是 一直按照以下方式使用 setter 和 getter:
class A
{
T myX;
public:
T x() const { return myX; }
void x( T const& newX ) { myX = newX; }
};
然而,一般来说,过多的 setter 和 getter 是性能差的标志
设计。在这种情况下,如果我理解正确的话,你的类(class)有一个
一组可以描述为“参数”的成员,它影响
它是如何完成它的工作的,但它是由以下人员定义的,并且可以由以下人员修改
类的用户。在这种情况下,我建议创建一个组件
代表他们;因为这是纯数据(无行为),所以一个 struct
会显得更合适。在这种情况下,您将有一个二传手
和 setter/getter 。或单个函数返回对
参数。在这种情况下,我认为返回一个引用是
相当合适;事实上你已经重新组合了客户的所有东西
代码可以在一个单独的实体中修改,具有语义意义
类型名,足以让整体逻辑清晰。
关于c++ - 具有大量嵌套组合的 setter 和 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9937850/