将所有参数传递给类构造函数vs将参数传递给成员函数



这个问题是关于面向对象设计的。将所有参数传递给类构造函数与将参数传递给成员函数的优点/缺点是什么?

在我的例子中,我知道程序开始时的所有参数,在程序结束之前我不需要更改它们。

在c++中,情况是这样的(尽管在我的代码中,我需要解析更多的参数和成员函数更复杂):

// All arguments in class constructor
Rectangle::Rectangle(float base, float height, string rectColor){
    this->area = 0;
    this->base = base;
    this->height = height;
    this->rectColor = rectColor;
}
void Rectangle::calcArea(){
    area = base * height;
}
void Rectangle::paintRectangle(){
    // use area
    // whatever
}

// Arguments in member functions
Rectangle::Rectancle(){
    this->area = 0;
}
void Rectangle::calcArea(float base, float height){
    area = base * height;
}
void Rectangle::paintRectangle(string rectColor){ 
    // use area
    // whatever
}

我使用的一个策略是:如果我在多个成员函数中需要这个变量,我就把它变成一个类变量。这是好的还是最好的方法?

将所有参数传递给构造函数有一个不好的地方,那就是它会有很多参数。而且我也不需要在main中调用类成员函数。

请解释一下我应该遵循的主要原则。

在构造函数中添加参数的好处:

  • 实例被完全初始化(调用函数的顺序没有问题,以获得一个"完整的"有用的实例。

为特定函数提供实参的好处:

  • 更灵活,因为函数使用变量而不是传递给构造函数的"常量"
  • 传递给函数的参数倾向于更好地属于函数(例如,对于paintRectangle,传递颜色是合乎逻辑的,但如果它永远不会改变,为什么要灵活地改变颜色之后?)

防止构造函数

中有太多参数
  • 创建一个结构来传递变量
  • 创建一个子类…如果需要超过5-7个参数,可能是类的责任太大了。
  • 使用命名参数(更清晰,但参数数量不变)

一般来说,使类尽可能的有限,不要使它们比需要的更灵活,除非你事先知道在以后的阶段需要这个功能。

关于构造函数的最重要的事情之一是它们使您的OOP代码保持一致。对于任何对象,如果您已经知道,使用属性创建的对象必须存在,那么这是一种很好的方法。

。没有"height"的矩形是不存在的。

因此,"最小参数构造函数"具有很大的优势。(当计算即面积时,对象所需的最小参数需要可用且不能崩溃)

如果你有更多的参数,它们是不必要的,最好创建更多的构造函数基于什么可能是"经常使用"的对象。

最新更新