2010-04-29 15 views
6

Supongamos que tengo una clase a:C++ OOP: ¿Qué funciones poner en la clase?

class a 
{ 
public: 
    void load_data(); 
private: 
    void check_data(); 
    void work_data(); 
    void analyze_data(); 
} 

Esas funciones todos hacer algo con la clase o uno de sus miembros.

Sin embargo esta función:

bool validate_something(myType myData) 
{ 
    if (myData.blah > 0 && myData.blah < 100) 
    { 
     return true; 
    } 
    return false; 
} 
  • está relacionada con la clase y sólo será llamado por él, por lo que no será necesaria ninguna otra parte

  • no hace nada con la clase o sus miembros: solo una pequeña función de "utilidad"

Dónde ubicar validate_something? Dentro o fuera de la clase?

+0

puede hacer que sea un miembro estático – Tim

Respuesta

4

Hazlo un miembro de la clase privado miembro de la clase. Solía ​​hacer estos miembros que no pertenecen a la clase y ponerlos en un espacio de nombre sin nombre en el archivo de implementación, pero parece que casi siempre terminan necesitando ser miembros de la clase (o necesitan ser trasladados a otra parte, tal vez a una validación biblioteca, en su ejemplo), a medida que el código cambia, por lo que ahora casi siempre los hago miembros estáticos.

Tenga en cuenta el uso de "casi" como calificador lo largo de esta respuesta :-)

+1

¿Por qué una función * necesita * ser un miembro estático en lugar de estar en un espacio de nombre sin nombre en el archivo impl? ¿O simplemente hace esto para ahorrar trabajo cuando necesita obtener datos de estado? –

+0

¿Y por qué los convierte en miembros 'estáticos' en lugar de simples funciones miembro? –

+0

@John Mi experiencia es que las funciones de ayuda en el archivo de implementación casi siempre terminan necesitando ser migradas a la clase. Esto es pura conveniencia. –

0

Si este método es una utilidad que solo está siendo utilizada por la clase, lo convertiría en un método privado de la clase. De esta forma, está encapsulado y no "contamina" tu API pública.

0

Suponiendo que myType es también una estructura/clase, ¿por qué no hace usted validate_something un método de myType?

0

Según tengo entendido, no es un método. Simplemente ponga su definición en el archivo cpp, arriba de las definiciones de los métodos que lo usan. Si tiene todas sus definiciones de método en línea en su clase, debe colocar el prototipo de la función en el encabezado sobre la definición de clase, pero la definición aún puede estar en un archivo cpp.

10

Si una función es

    no
  • requerido fuera de la clase, y,
  • no necesita acceder a miembros de la clase (o tal vez tiene sentido como una función gratuita con miembros como parámetros)

luego tiendo a convertirlo en una función gratuita dentro de un espacio de nombres privado en el archivo de implementación. Prefiero no usar funciones privadas porque exponen los detalles de implementación en el archivo de encabezado (y aún no han encontrado los problemas de Neil) y prefiero evitar la recompilación de cambios en la implementación.

Cuestiones relacionadas