7 de enero de 2019

Abstracción de datos.

   La abstracción es una característica, al menos hasta donde sabemos, inherente a la especie humana. Ahora bien, desde el punto de vista de la programación, por medio de la abstracción se puede comprender o describir un concepto sin tener que entrar en los detalles de su representación o especificación.

   En todo el blog se ha utilizado dicho concepto en forma de diagramas, imágenes o figuras de las representaciones de algunos de los tipos de datos en la memoria de la computadora, o de las estructuras de datos presentadas (como los arreglos y las matrices).

   Al escuchar conceptos como casa, automóvil, etcétera, se genera de manera casi inconsciente en nuestra mente una representación de ellos, y ésta podría variar de persona a persona, pero en esencia, la idea sería esencialmente la misma.

   En este sentido, si alguien nos solicitara dibujar en una hoja de papel nuestro concepto de casa o de automóvil, con toda seguridad habría unos dibujos más elaborados que otros, algunos con más detalles y otros con menos, pero sería poco probable que, en condiciones "normales" alguien dibujara una casa con una vaca en lugar de un techo o una pared; alguien podría quizá colocar en su dibujo la silueta de una chimenea, pero sería poco probable que alguien dibuje un piano sobre el techo.

   Para el caso de un automóvil, alguna persona podría dibujar un auto deportivo o quizá algo más modesto, pero al igual que antes, sería poco probable que alguien dibujara un automóvil que, en lugar de ruedas, tuviera unas guitarras eléctricas. La abstracción es en este sentido lo que nos permite comunicarnos con otras personas o colegas a un nivel conceptual.

   En las entradas subsecuentes se echará mano de un par de mecanismos utilizados en C para reforzar la abstracción en la programación a través de la representación de "nuevos" tipos de datos: struct y typedef. Cabe mencionar desde ahora que en realidad no se generarán nuevos tipos de datos, ya que un tipo de dato requiere de una representación, una interpretación, y un conjunto de operaciones bien definidas y establecidas asociadas a él; de ahí que sólo se utilizarán, y en todo caso se agruparán, los tipos de datos existentes de manera conveniente, para proporcionar o dotar al programador de una mejor abstracción.

Conceptos, representación y estructura.
   Una estructura (struct) es una colección de una o más variables de tipos de datos posiblemente diferentes, agrupadas bajo un solo nombre para un mejor y más conveniente manejo de las mismas.

   Las estructuras ayudan a organizar mejor los datos mejorando así la abstracción y la representación de información para el programador.

   Un ejemplo clave de una estructura es la representación de los empleados de una nómina. Un empleado se describe en dicho contexto por un conjunto de atributos o características, tales como (entre otros):
  • Número de empleado.
  • Nombre(s).
  • Apellido paterno.
  • Apellido materno.
  • Clave Única de Registro de Población (CURP).
  • Número de seguro social.
  • Puesto.
  • Domicilio.
  • Teléfono.
  • Salario.
   En C no es posible declarar una variable de tipo empleado o persona por ejemplo, ya que no existen dichos tipos de datos; sin embargo es posible, con los tipos de datos existentes, abstraer de manera conveniente variables que permitan representar objetos que sirvan como un tipo de datos.

   Una estructura (struct) en C tiene la siguiente estructura (la redundancia es necesaria):

         struct identificador{
               tipo_de_dato1 lista_de_identificadores1;
               tipo_de_dato2 lista_de_identificadores2;
                             .
                             .
                             .
               tipo_de_datoN lista_de_identificadoresN;
         };


donde:
  • identificador es un identificador válido en C y denota el nombre de la estructura.
  • tipo_de_dato es alguno de los tipos de datos de C.
  • lista_de_identificadores es una lista de identificadores separada por comas, para cada una de las variables definidas.
   Observe que una estructura en C puede contener diferentes tipos de datos y distintas variables de cada uno de ellos.

   A cada una de las variables que se declaran dentro de una estructura se les denomina: elemento miembro de la estructura, y cada elemento miembro se distingue por su respectivo identificador, el cual fue definido en la lista_de_identificadores.

   Al igual que antes, no puede haber identificadores repetidos para los elementos miembro de una estructura determinada. Los identificadores o nombres de las variables de los elementos miembro de una estructura son locales a ella y sólo pueden accederse a través de una variable del tipo correspondiente, tal y como se mostrará en el Ejemplo 8.1 de la entrada Abstracción en acción.

   Los elementos miembro de una estructura e1 pueden ser arreglos, apuntadores, e incluso variables cuyo tipo de dato se derive de otra estructura e2 por ejemplo, el único requisito será que e2 esté definida antes que e1.

   El número de estructuras que se pueden definir está limitado por las necesidades del programador, C no impone ninguna restricción en este sentido.

   Una estructura sólo define una plantilla o molde que agrupa otras variables. Es importante recalcar que por sí misma no crea las variables de sus elementos miembro, sólo las declara. Los elementos miembro de la estructura se crean cuando se define una variable cuyo tipo es una estructura, de ahí que se diga que las estructuras definen nuevos tipos de datos. En C una variable puede declararse varias veces pero sólo puede definirse una vez, la definición de una variable se da cuando ésta se crea y existe propiamente, mientras que la declaración sólo determina su existencia.

   Las estructuras en C se pueden copiar, asignar, pasar a funciones, y ser regresadas como valor de retorno de una función; sin embargo, no existe una relación de orden predefinida, es decir, no pueden ser comparadas.

   Sean e1 y e2 dos variables derivadas de la misma estructura, las operaciones:

e1 < e2, e1 > e2, e1 <= e2, e1 >= e2, e1 == e2, e1 != e2 

son inválidas.