在构造函数上传递参数或在每个方法上传递参数

时间:2019-07-18 17:34:35

标签: c++ design-patterns software-design

我正在学习C ++,并且有这个头文件:

#ifndef _ROBOT_MOVE_H__
#define _ROBOT_MOVE_H__ 1

#include "ros/ros.h"

class RobotMove
{
private:
    double current_linear;
    double current_angular;
public:
    void TurnLeft(const ros::Publisher& publisher, ros::Rate& loop_rate);
    void TurnRight(const ros::Publisher& publisher, ros::Rate& loop_rate);
    void TurnAround(const ros::Publisher& publisher, ros::Rate& loop_rate);
    void Forward(const ros::Publisher& publisher, ros::Rate& loop_rate);
    void Backward(const ros::Publisher& publisher, ros::Rate& loop_rate);
    void Stop();

    RobotMove();
    ~RobotMove();
}


#endif

我不知道在构造函数上一次传递const ros::Publisher& publisher, ros::Rate& loop_rate还是每次我调用其他方法时都传递一次更好。

是否最好在构造函数中传递这两个参数并将指针存储在类中或在每个方法上传递它们?

顺便说一句,这两个参数将始终是相同的对象。

3 个答案:

答案 0 :(得分:5)

  

顺便说一句,这两个参数将始终是相同的对象。

对我来说,这表明它们应该是该类的成员变量。使它们成为类的成员变量遵循Don't Repeat Yourself (DRY) principle。因此,将它们传递给构造函数并让对象将它们存储为成员变量是有意义的。

答案 1 :(得分:3)

我想说,从编程的角度来看,一次又一次地复制和粘贴相同代码的次数越少越好。这就是编程的要点,使计算机可以为您重复一遍。我会将那些参数传递给构造函数,然后将它们存储为属性。我相信您可以像下面这样实现它:

class RobotMove
{
private:
    double current_linear;
    double current_angular;
    const ros::Publisher * publisher;
    ros::Rate * loop_rate;

public:
    RobotMove(const ros::Publisher& publisher, ros::Rate& loop_rate)
    {
        this->publisher = &publisher;
        this->loop_rate = &loop_rate;
    }
};

答案 2 :(得分:3)

这是一个很好的基本问题。

要回答,您可以问自己are these parameters specific to each action(method) or are they objects used by an instance of the class in general ?

在给出了类名和方法名的示例中,有这么多方法使用了它们,并另外指定了它们不变,我建议将它们传递给构造函数,而不是每次调用时。

尽管这并非始终是正确的答案,但您必须基于您认为这些参数可能会更改的频率以及要给类赋予的语义含义以及与这些参数的关系来进行判断和平衡。

我知道这听起来像是一头雾水,但通常设计选择取决于上下文。