2017-03-06 18 views
1

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

+0

_color' '@user彼らが有効とおそらくまったく同じコードにコンパイルされます両方だ – UnholySheep

+3

プライベートです。私は宣言されたクラスであなたのセッターを投げ始めるのが混乱するかもしれないと思う。また、 'Car :: setColor'は、' Car :: getColor'関数を持っていて、 'Car :: setColor'にバリデーションを追加しないと仮定して、検証をしていないように見えます。setters/getterがすべてカプセル化を破棄しています'_color'の中であなたは全く気にしないかもしれません。 – Geoff

+0

@UnholySheep確かに、申し訳ありません。長くて – user

答えて

3

今後の変更に対して可能な限り免責されるコードを作成することをお勧めします。これは、通常、自分のプライベートデータに直接アクセスするのではなく、独自のセッター(およびゲッター)を使用することを意味します。

たとえば、_colorenumまたはRGBタプルに変更するとします。 _colorを直接使用すると、変更する場所が増えます。 setColor(int)を使用すると、intから新しい内部ストレージがある場所に変換できる場所は1つだけです。

setColorpublicであるため、特定の例では、colorCarWithRandomColor()メソッドは非結合の非友人機能になり、結合がさらに減少する可能性があります。 (もちろん、それはあなたのgetRandomColor()メソッドの動作を正確にどのように依存します。)

void colorCarWithRandomColor(Car& car) { 
    // Imagine that there is a function called getRandomColor and that returns random color. 
    car.setColor(Car::getRandomColor()); 
} 
2

独自のクラス内の変数を直接参照するのは完全に正しいです。

アクセッサ/ミューテータの考え方は、クラス外のデータを使用する関数は、その格納方法について何も仮定してはいけないということです。

もちろん、クラス自体はデータの格納方法を知っているため、直接操作することは自由です。