La hermana Xie está de viaje.
El alcance de la definición de datos. A esto también se le llama diseño de caja negra. La idea básica del tipo de datos abstracto
-Este módulo tiene
Descripción de funciones: las tareas realizadas por el módulo
y descripción de la interfaz: el uso de el módulo
Los usuarios de un módulo no necesitan conocer ningún detalle de la implementación del módulo, y los usuarios no pueden acceder al módulo de ninguna otra manera que no sean las interfaces que se han definido.
La restricción del acceso a los módulos se logra mediante el uso razonable de palabras clave estáticas, que pueden restringir el acceso a palabras clave no estáticas
Funciones de interfaz y acceso a datos.
Por ejemplo, un módulo para mantener una lista de direcciones/números de teléfono. Los módulos deben basarse en el nombre, dirección y número de teléfono especificados. Pero la forma en que se almacena la lista depende de la implementación específica y esta información es privada para el módulo.
Los clientes no lo saben y no necesitan saberlo.
Es hora de ver un ejemplo. El siguiente programa ilustra una posible implementación de este módulo.
Los archivos de encabezado definen algunas interfaces utilizadas por los clientes.
/*Nombre de archivo: addrlist.h*/
/*
*Declaración del módulo de dirección
*/
/*
*Características de los datos
*La longitud máxima de varios datos (incluidos los bytes NUL al final) y el número máximo de direcciones.
*/
#Definir nombre_longitud 30
#Definir DIRECCIÓN _longitud 100
#Definir PHONE_LENGTH 11
#Defina la dirección máxima 1000
/*
*Funciones de interfaz
*Encuentre la dirección correspondiente según el nombre de pila.
*/
Constante de carácter*
lookup _ dirección(char const * nombre);
/*Encuentra el nombre correspondiente a un nombre dado Número de teléfono*/
Carácter constante*
búsqueda _ teléfono(char const * nombre);
-
/ *Nombre de archivo: addrlist.c*/
/*Tipo de datos abstractos utilizados para mantener la lista de direcciones*/
#Incluye " addrlist.h "
# Incluye
/*
*Las tres partes de cada dirección se almacenan en tres elementos numéricos correspondientes.
*
*/
Nombre de carácter estático [dirección máxima] [longitud del nombre]
Dirección de carácter estático [dirección máxima]; [Longitud de ADDR];
Teléfono público estático [dirección máxima][longitud del teléfono];
/*
*Encuentre un nombre en la matriz y devuelva el índice de la ubicación que buscas.
*Si no se puede encontrar la consulta, se devolverá -1 directamente.
*/
Int estático
find_entry(Constante de carácter *name_find)
{
int Entrada;
for(entrada = 0; entrada ltMAX _ ADDRESSESentry)
if(strcmp(name_to_find, nombre[entrada]) == 0)
Devolver entrada;
return-1;
}
/*
*Dado un nombre, busca y devuelve la dirección correspondiente.
*Si no se encuentra el nombre, se devuelve directamente un puntero nulo.
*/
Constante de carácter*
lookup_address(Constante de carácter*nombre)
{
entrada int ;
entrada = buscar _ entrada(nombre);
if(entrada == -1)
Devolver NULL
Otros
Dirección de devolución [entrada];
}
/*
*Busca y devuelve el número de teléfono correspondiente según el nombre de pila, si el nombre no existe, devuelve un puntero nulo.
*/
Constante de carácter*
lookup_phone(char const *name)
{
entrada int ;
entrada = buscar _ entrada(nombre);
if (entrada == -1)
Devolver NULL
Otros
Devolver teléfono [entrada];
}
Este ejemplo puede ilustrar bien el papel de la caja negra. Las cajas negras brindan acceso a usuarios externos especificando interfaces específicas.
En este ejemplo, las funciones de la interfaz son lookup_address y lookup_phone. Los usuarios no pueden acceder directamente a los datos del módulo dependientes de la implementación, como matrices o la función auxiliar find_entry, porque están declarados estáticos.
Este concepto de caja negra aísla los detalles de implementación del mundo exterior, eliminando la tentación de los usuarios de intentar acceder a estas implementaciones directamente.
La única forma posible de acceder a un módulo es a través de la interfaz definida por el módulo.
Este modelo de desarrollo es muy importante, especialmente en la planificación de grandes proyectos. Muchas veces sólo consideramos cuestiones de interfaz.
Podemos ignorar temporalmente los detalles de implementación específicos y primero aumentar la velocidad del desarrollo colaborativo general del equipo.