2017-03-06 2 views
1

Car.hDois-je utiliser setters/getters en classe, je leur ai fait

#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 
} 

Alors, qui d'entre eux est mieux utilisation. _color = getRandomColor(); ou setColor(getRandomColor()); dans ce cas? Dois-je appeler setColor fonction ou il est correct de changer directement _col

+0

@user '_color' est – UnholySheep

+3

privé Ils sont à la fois valides et seront probablement compilés au même code. Je pense qu'il pourrait être déroutant de commencer à lancer vos setters dans leur classe déclarée. De même, 'Car :: setColor' semble n'avoir aucune validation, en supposant que vous ayez une fonction' Car :: getColor' et que vous n'allez pas ajouter de validation à 'Car :: setColor' tous les setters/getters détruisent l'encapsulation de '_color', vous pourriez aussi bien ne pas en avoir du tout. – Geoff

+0

@UnholySheep En effet, désolé..long jour – user

Répondre

3

Vous devriez préfèrer écrire du code qui sera aussi immunisé que possible aux changements futurs, cela signifie généralement utiliser votre propre setter (et getter) plutôt que d'accéder directement à vos propres données privées. Par exemple, supposons que vous décidiez de remplacer _color par enum ou un tuple RGB. Si vous utilisez _color directement, vous aurez plus d'endroits à modifier. En utilisant setColor(int) vous avez juste un endroit pour convertir de int à tout ce que votre nouveau stockage interne pourrait être.

En outre, dans votre exemple particulier, puisque setColor est public, votre méthode colorCarWithRandomColor() peut être capable d'être une fonction non-membre non-ami qui diminue davantage le couplage. (Bien sûr, cela dépend exactement comment votre méthode fonctionne getRandomColor().)

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

Il est parfaitement correct de se référer directement à une variable au sein de sa propre classe.

L'idée d'accesseurs/mutateurs est que les fonctions utilisant les données en dehors de la classe ne doivent pas faire d'hypothèses sur la façon dont elle est stockée.

De toute évidence, la classe elle-même sait comment les données sont stockées et est donc libre de les manipuler directement.