2010-08-12 7 views
36

Me he encontrado que tiendo a no tener funciones de clase privadas. Si es posible, todos los candidatos a la clase privada funcionan en lugar de poner en el espacio de nombres sin nombre y pasar toda la información necesaria como parámetros de función. No tengo una buena explicación de por qué estoy haciendo eso, pero al menos me parece más natural. Como consecuencia, necesito exponer menos detalles internos en el archivo de encabezado.Funciones de clases privadas vs Funciones en el espacio de nombre sin nombre

¿Cuál es su opinión? ¿Es una práctica correcta?

+2

Creo que es una pregunta realmente difícil (+1). Y creo que todavía hay algunas respuestas válidas abiertas ... – Wolf

Respuesta

16

En los proyectos semi grandes en los que suelo trabajar (más de 2 millones de líneas de código), prohibiría las funciones de clase privadas si pudiera. La razón es que una función de clase privada es privada, pero aún así es visible en el archivo de encabezado. Esto significa que si cambio la firma (o el comentario) de todos modos, a veces me recompensan con una recompilación completa que cuesta varios minutos (u horas dependiendo del proyecto).

Solo di no a eso y oculta lo que es privado en el archivo cpp.

Si comenzara de cero en un gran proyecto de C++ haría cumplir PIMPL Idiom: http://c2.com/cgi/wiki?PimplIdiom para mover aún más detalles privados en el archivo cpp.

+1

No es una regla del 100%. El espacio de nombre anónimo tiene un inconveniente masivo de no poder escribir UT para las funciones en él.La recompilación completa puede ser un precio insignificante a pagar en comparación. Personalmente, simplemente prohibiría los espacios de nombres anónimos y exigiría la cobertura de UT para funciones de clase privadas, al menos para proyectos no tan estables. – sankalpn

3

Creo que esta es una buena práctica. A menudo tiene el beneficio de ocultar estructuras auxiliares y tipos de datos también, lo que reduce la frecuencia y el tamaño de las reconstrucciones. También hace que las funciones sean más fáciles de dividir en otro módulo si resulta que son útiles en otros lugares.

5

Básicamente se trata de si la función en cuestión realmente tiene sentido como parte de la clase. Si su única intención es mantener los detalles de la clase fuera del encabezado, consideraría usar el idioma pimpl en su lugar.

10

He hecho esto en el pasado, y siempre ha terminado mal. No puede pasar objetos de clase a las funciones, ya que necesitan acceder a los miembros privados, presumiblemente por referencia (o termina con listas de parámetros intrincados) por lo que no puede llamar a los métodos de clase pública. Y no puede llamar a funciones virtuales, por el mismo motivo. Creo firmemente (basado en la experiencia) que esta es una mala idea.

En pocas palabras: Esto suena como el tipo de idea que podría funcionar cuando el "módulo" de implementación tiene algún acceso especial a la clase, pero este no es el caso en C++.

+0

Tiene razón en que a veces la lista de parámetros es lo suficientemente grande. Eso es definitivamente un inconveniente de este enfoque. Por otro lado, estoy tratando de mantenerme alejado del uso de cualquier función virtual, por lo que muy rara vez me siento obligado a llamar a funciones virtuales. De todos modos, ¡gracias por la respuesta! – drumsta

+2

@kriau ¿Por qué evitar el uso de funciones virtuales? Y no ha eliminado su dependencia en el encabezado. Me sorprende que lo que esté buscando aquí sea el modismo PIMPL. –

+0

+1 para Pimpl (aunque no es parte de la respuesta original) –

Cuestiones relacionadas