Cuando estaba investigando las ventajas de C sobre C ++, me encontré con este párrafo:
La forma estándar en C de encapsular es declarar hacia adelante una estructura y solo permitir el acceso a sus datos a través de funciones. Este método también crea la encapsulación en tiempo de compilación. La encapsulación en tiempo de compilación nos permite cambiar los miembros de las estructuras de datos sin recompilar el código del cliente (otro código utilizando nuestra interfaz). La forma estándar de encapsular C ++ por otro lado (usando clases) requiere la recompilación del código del cliente al agregar o eliminar variables de miembros privados.
Entiendo cómo declarar hacia adelante una estructura y acceder a sus miembros a través de funciones oculta los detalles de implementación de la estructura. Lo que no entiendo es esta línea específicamente:
La encapsulación en tiempo de compilación nos permite cambiar los miembros de las estructuras de datos sin recompilar el código del cliente (otro código utilizando nuestra interfaz).
¿En qué escenario es esto aplicable?
struct
es una caja negra con elementos internos desconocidos. Si el cliente no conoce las partes internas, nunca podrá acceder a ellas directamente y puede cambiarlas a voluntad. Esto es similar a la encapsulación en OOP. Los elementos internos son privados y solo cambia el objeto utilizando métodos públicos.Respuestas:
Un posible escenario del mundo real en el que esto ocurriría es cuando una biblioteca de base de datos, escrita en los días en que el espacio en el disco duro era muy limitado, usaba un solo byte para almacenar el campo 'año' de una fecha (por ejemplo, 11-NOV-1973 tendría
73
para el año). Pero, cuando llegó el año 2000, esto ya no sería suficiente, y el año tuvo que ser almacenado como un entero corto (16 bits). El encabezado relevante (muy simplificado) para esta biblioteca podría ser este:Y un programa 'cliente' sería:
La implementación 'original':
Luego, en el enfoque de Y2K, este archivo de implementación se cambiaría de la siguiente manera (todo lo demás no se modifica):
Cuando el cliente necesita ser actualizado para usar la nueva versión (segura para Y2K), no se requerirán cambios de código. De hecho, es posible que ni siquiera tenga que volver a compilar: simplemente volver a vincular a la biblioteca de objetos actualizada (si eso es lo que es) podría ser suficiente.
fuente
Nota: La siguiente lista no será exhaustiva. ¡Las ediciones son bienvenidas!
Los escenarios aplicables incluyen:
La estructura más conocida de este tipo es
FILE
. Simplemente llamefopen()
y obtenga un puntero si tiene éxito. Este puntero se entrega entre sí a la función que funciona en los archivos. Pero no sabe, y no quiere saber, los detalles, como los elementos contenidos y el tamaño.fuente