2011-03-27 119 views
5

¿Cuáles son las ventajas y desventajas de usar archivos de encabezado en un idioma como C o C++ en un idioma como Java? Creo que las clases deben diseñarse desde el exterior, por lo que es bueno tener archivos de encabezado y no tener que pasar por los detalles de implementación. Sin embargo, nuevamente, cada declaración de función está duplicada en dos archivos. Si C y C++ se inventaran hoy, ¿usarían archivos de cabecera? ¿Este mecanismo está desactualizado o es necesario?Ventajas/desventajas de los archivos de encabezado

+1

java? ¿Me he perdido algo? – CromTheDestroyer

+0

[mu] (http://en.wikipedia.org/wiki/Mu_%28negative%29) ... pero los archivos de encabezado me permiten ser flojo y no escribir todas las declaraciones (y tipos y enumeraciones y define macros) en todos los archivos de código fuente "simple" – pmg

+1

Las clases de Java (al menos en mi escuela) generalmente se definen en un archivo. Las clases C, C++ y Object C generalmente se definen en dos archivos. – jeffythedragonslayer

Respuesta

12

tomada de un relacionado blog post por Eric Lippert, quien lo expresa muy bien:

que habría pedido el equivalente pregunta ¿por qué cabecera C++ necesidad archivos? Los archivos de encabezado parecen un gran punto de falla potencial ; todo el tiempo edito código C++ y cambio la firma de un método; si me olvido de actualizar el archivo de encabezado, entonces el código no se compila y a menudo da un mensaje de error críptico . Esperemos que este gran costo realmente te compre algo.

Compra una cosa al compilador, y al usuario una cosa.

lo que compra el usuario es que se puede compilar cada individuo “CPP” archivo en un archivo “obj” de forma independiente, siempre y cuando tenga todos los cabeceras necesarias. Toda la información necesaria para generar los cuerpos que se encuentran en un archivo cpp determinado se puede obtener del conjunto de encabezados. Esto significa que el sistema de compilación puede recompilar solo aquellos archivos cpp que cambiaron, siempre que no haya un encabezado cambiado.

Lo que compra el escritor del compilador es que cada archivo se puede compilar en "one pass". Debido a que cada tipo y método declaración se procesan antes su primer uso, el compilador puede simplemente empezar desde el principio del archivo, tracción en todas las cabeceras incluidos y proceder de arriba hacia abajo, escupiendo fuera del archivo obj como va, nunca teniendo que volver atrás y volver a visitar algo que ya se ve.

Esto está en contraste con idiomas como C# (sobre el cual la publicación del blog es) y Java, que es un pariente muy cercano.

+2

Lo interesante de esto es lo que compra el usuario. Le permite al usuario volver a compilar archivo por archivo. Pero esto solo es realmente necesario debido a los extravagantes tiempos de compilación/enlace de C y especialmente C++. Entonces, en mi opinión, todo se trata del compilador y el desarrollador deficiente es el ciudadano de segunda clase. –

+2

Java es un pariente cercano de C#. Java es el padre de C#. – irreputable

+0

@irreputable: Eso me hizo reír. También es una opinión que comparto. – Jon

-2

En pocas palabras, en C o C++, los archivos de encabezado permiten que diferentes archivos compartan definiciones o declaraciones comunes.

En Java todo es un objeto, por lo que no existe el concepto de compartir nada excepto objetos. Cada objeto es un archivo; si desea acceder al objeto, importe el archivo.

1

Sigue siendo una buena idea separar la interfaz y la implementación. Pero no tiene que ser una separación física. En Java puedes ver la interfaz de javadoc. Los IDE de Java generalmente pueden mostrar estructuras de API, y pueden doblar bloques. No hay razones convincentes que requieran separación física. C se inventó hace décadas, así que no necesitamos elegirlo.

Cuestiones relacionadas