Saltar al contenido

Estilo de codificación getters/setters de C++

Puede que se de el caso de que halles algún error con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes subir el código al trabajo final.

Solución:

El uso de un método getter es una mejor opción de diseño para una clase de larga duración, ya que le permite reemplazar el método getter con algo más complicado en el futuro. Aunque parece menos probable que esto se necesite para un valor constante, el costo es bajo y los posibles beneficios son grandes.

Aparte, en C++, es una idea especialmente buena dar tanto el getter como el setter para un miembro el mismo nombreya que en el futuro puede cambiar el par de métodos:

class Foo 
public:
    std::string const& name() const;          // Getter
    void name(std::string const& newName);    // Setter
    ...
;

En una única variable miembro pública que define un operator()() para cada:

// This class encapsulates a fancier type of name
class fancy_name 
public:
    // Getter
    std::string const& operator()() const 
        return _compute_fancy_name();    // Does some internal work
    

    // Setter
    void operator()(std::string const& newName) 
        _set_fancy_name(newName);        // Does some internal work
    
    ...
;

class Foo 
public:
    fancy_name name;
    ...
;

Por supuesto, será necesario volver a compilar el código del cliente, ¡pero no se requieren cambios de sintaxis! Obviamente, esta transformación funciona igual de bien para valores constantes, en los que solo se necesita un getter.

Tiende a ser una mala idea hacer públicos los campos que no son constantes porque entonces se vuelve difícil forzar las restricciones de verificación de errores y/o agregar efectos secundarios a los cambios de valor en el futuro.

En su caso, tiene un campo const, por lo que los problemas anteriores no son un problema. La principal desventaja de convertirlo en un campo público es que está bloqueando la implementación subyacente. Por ejemplo, si en el futuro quisiera cambiar la representación interna a una C-string o un Unicode string, o algo más, entonces rompería todo el código del cliente. Con un getter, puede convertir a la representación heredada para los clientes existentes mientras proporciona la funcionalidad más nueva a los nuevos usuarios a través de un nuevo getter.

Todavía sugeriría tener un método getter como el que ha colocado arriba. Esto maximizará su futura flexibilidad.

Aparte, en C++, es algo extraño tener un miembro de referencia const. Tienes que asignarlo en la lista de constructores. ¿Quién posee la memoria real de ese objeto y cuál es su tiempo de vida?

En cuanto al estilo, estoy de acuerdo con los demás en que no quieres exponer tus partes íntimas. 🙂 Me gusta este patrón para setters/getters

class Foo

public:
  const string& FirstName() const;
  Foo& FirstName(const string& newFirstName);

  const string& LastName() const;
  Foo& LastName(const string& newLastName);

  const string& Title() const;
  Foo& Title(const string& newTitle);
;

De esta manera puedes hacer algo como:

Foo f;
f.FirstName("Jim").LastName("Bob").Title("Programmer");

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *