我应该在 class 中使用 setters/getters 我做的吗
Should i use setters/getters in class I made them
Car.h
#ifndef CAR_H
#define CAR_H
class Car
{
public:
void setColor(int color);
void colorCarWithRandomColor();
private:
int _color;
};
#endif
Car.cpp
#include "Car.h"
void Car::setColor(int color){
_color = color;
}
void Car::colorCarWithRandomColor(){
// Imagine that there is a function called getRandomColor and that returns random color.
_color = getRandomColor();
// or
setColor(getRandomColor());
// which one is correct
}
所以这其中哪一个更好用。 _color = getRandomColor();
或 setColor(getRandomColor());
在这种情况下?我应该调用 setColor
函数还是直接更改 _col
是正确的
直接在变量自身中引用变量是完全正确的 class。
accessors/mutators 的想法是使用 class 之外的数据的函数不应该对数据的存储方式做出任何假设。
显然 class 本身知道数据是如何存储的,因此可以自由地直接操作它。
您应该更愿意编写尽可能不受未来更改影响的代码,这通常意味着使用您自己的 setter(和 getter)而不是直接访问您自己的私有数据。
例如,假设您决定将 _color
更改为 enum
或 RGB 元组。如果你直接使用 _color
,你将有更多的地方可以改变。使用 setColor(int)
,您只有一个地方可以将 int
转换为任何新的内部存储空间。
此外,在您的特定示例中,由于 setColor
是 public
,您的 colorCarWithRandomColor()
方法可能是非成员非友元函数,这进一步降低了耦合。 (当然,这完全取决于您的 getRandomColor()
方法的工作原理。)
void colorCarWithRandomColor(Car& car) {
// Imagine that there is a function called getRandomColor and that returns random color.
car.setColor(Car::getRandomColor());
}
Car.h
#ifndef CAR_H
#define CAR_H
class Car
{
public:
void setColor(int color);
void colorCarWithRandomColor();
private:
int _color;
};
#endif
Car.cpp
#include "Car.h"
void Car::setColor(int color){
_color = color;
}
void Car::colorCarWithRandomColor(){
// Imagine that there is a function called getRandomColor and that returns random color.
_color = getRandomColor();
// or
setColor(getRandomColor());
// which one is correct
}
所以这其中哪一个更好用。 _color = getRandomColor();
或 setColor(getRandomColor());
在这种情况下?我应该调用 setColor
函数还是直接更改 _col
直接在变量自身中引用变量是完全正确的 class。
accessors/mutators 的想法是使用 class 之外的数据的函数不应该对数据的存储方式做出任何假设。
显然 class 本身知道数据是如何存储的,因此可以自由地直接操作它。
您应该更愿意编写尽可能不受未来更改影响的代码,这通常意味着使用您自己的 setter(和 getter)而不是直接访问您自己的私有数据。
例如,假设您决定将 _color
更改为 enum
或 RGB 元组。如果你直接使用 _color
,你将有更多的地方可以改变。使用 setColor(int)
,您只有一个地方可以将 int
转换为任何新的内部存储空间。
此外,在您的特定示例中,由于 setColor
是 public
,您的 colorCarWithRandomColor()
方法可能是非成员非友元函数,这进一步降低了耦合。 (当然,这完全取决于您的 getRandomColor()
方法的工作原理。)
void colorCarWithRandomColor(Car& car) {
// Imagine that there is a function called getRandomColor and that returns random color.
car.setColor(Car::getRandomColor());
}