我有一个庞大的,独立的环境模型。在模型中,我有一个名为cell
的大型类,它包含许多(~100)vectors
和doubles
,它们共同决定了许多属性中cell
的当前状态。这些属性由不同的环境和生物过程(其他classes
)改变,其中包含过程特定的功能/方法。我很想在cell
类中创建所有这些流程类(20+)的朋友类,这样我就不必编写近200个get / set函数。
它还允许我的代码更简单易读:
cell->variableA = (cell->variableA * someInput)/(somOtherInput)
VS
cell->setVariableA(cell->getVariableA * someInput)/(someOtherInput)
有没有坚实的理由反对这样做?我是否应该只考虑将数据成员公开?
该模型是一个自包含的应用程序 - 我不与其他人共享代码以使用/耦合任何内容。
答案 0 :(得分:0)
我不确定你的班级概念是否应该遵循。您应该使您的数据更具可读性和紧凑性。无论如何,要回答你的问题:当你想要在将来改变实现时,使用私有成员和getter / setter函数。它们还可以帮助您使用断点和/或验证值进行调试。如果要隐藏实现并组合功能,请首选encapsulation和abstraction。你绝对应该让你的课程更抽象。例如。 my_vector.copyAbcDataFrom(other_vector)
比my_vector.member = other_vector.member
好得多。
如果您不关心这些论点,可以使用公共成员。
顺便说一下,您还可以使用宏为您的班级自动创建getter / setter函数。
#define MEMBER(datatype, name) \
private: \
datatype name; \
public: \
datatype get ## name() const { return name; }
class Foo
{
MEMBER(int, abc)
MEMBER(char, blub)
};
int main()
{
Foo f;
int val = f.getabc();
return 0;
}
答案 1 :(得分:0)
你做错了。类的目的是隔离逻辑,以便您可以完成所有操作。只需要从全局变量中提升功能,这是一个进步。
如果您有200个不同的参数,则不应将它们粘贴在200个不同的变量中。存在关联容器是有原因的。枚举存在是有原因的。
class Cell {
public:
enum class ParameterType { Param1, Param2, };
double getParameter(ParameterType type) { return variables.at(type); }
void setParameter(ParameterType type, double value) { variables[type] = value; }
private:
std::map<ParameterType, double> variables;
};
获取/设置100的位置在哪里?设计紧凑,可读。
您不想交朋友的原因是出于可维护性原因。这与您不使用全局变量的原因相同。如果你改变了内部的工作方式,你就不希望在课堂之外破坏它。
提示:如果您的班级声明超过几页,则需要将其拆分。