viernes, 26 de abril de 2013

Página 6. Estructura de Datos en C++



  • 1.5. ABSTRACCIÓN EN LENGUAJES DE PROGRAMACIÓN
Los lenguajes de programación son las herramientas mediante las cuales los diseñadores de programas pueden implementar los modelos abstractos. La abstracción ofrecida por los lenguajes de programación se pueden dividir en dos categorías: abstracción de datos (perteneciente a los datos) y abstracción de control  (perteneciente a las estructuras de control).

Desde comienzo del decenio de los sesenta, en que se desarrollaron los primeros lenguajes de programación de alto nivel, ha sido posible utilizar las abstracciones más primitivas de ambas categorías (variables, tipos de datos, funciones, control de bucles (lazos), etc.).

  • 1.5. Abstracciones de control
Los microprocesadores ofrecen directamente sólo dos mecanismos para controlar el flujo y ejecución de las instrucciones: secuencia y  salto. Los primeros lenguajes de programación de alto nivel introdujeron las estructuras de control: sentencias de bifurcación (if) y bucles (for, while, do-loop, do-while, etc.).

Las estructuras de control describen el orden en que se ejecutan las sentencias o grupos de sentencia (unidades de programa). Las unidades de programa se utilizan como bloques básicos de la clásica descomposición "descendente". En todos los casos, los subprogramas sustituyen una herramienta potente de abstracción ya que durante su implementación, el programador describe en detalle cómo funcionan. Cuando el subprograma se llaman, basta con conocer lo que hace y no cómo lo hace. De este modo se convierten en cajas negras que amplían el lenguaje de programación a utilizar. En general, los subprogramas son los mecanismos más ampliamente utilizados para reutilizar código, a través de colecciones de subprogramas en bibliotecas.

Las abstracciones y estructuras de control se clasifican en estructuras de control a nivel de sentencia y a nivel de unidades. La abstracción de control a nivel de unidad se conoce como abstracción procedimental.

Abstracción procedimental (por procedimientos o funciones)

Es esencial para diseñar software modular y fiable. La abstracción procedimental se basa en la utilización de procedimientos o funciones sin preocuparse de cómo se implementan. Esto es posible sólo si conocemos qué hace el procedimiento; esto es, conocemos la sintaxis y semántica que utiliza el procedimiento o función. La abstracción aparece en los subprogramas debido a las siguientes causas:

  • Con el nombre de los subprogramas, un programador puede asignar una descripción abstracta que captura el significado global del subprograma. Utilizando el nombre en lugar de escribir el código permite al programador aplicar la acción en términos de su descripción de alto nivel en lugar de sus detalles de bajo nivel.
  • Los subprogramas proporcionan ocultación de la información. Las variables locales y cualquier otra definición local se encapsulan en el subprograma, ocultándolas realmente de forma que no se pueden utilizar fuera del subprograma. Por consiguiente el programador no tiene que preocuparse por las definiciones locales.
  • Los parámetros de los subprogramas, junto con la ocultación de la información anterior, permiten crear subprogramas que constituyen entidades de software propias. Los detalles locales de implementación pueden estar ocultos mientras que los parámetros se pueden utilizar para establecer la interfaz público.
En C++ la abstracción procedimental se establece  con los métodos o funciones miembro de clases.

Otros mecanismos de abstracción de control

La evolución de los lenguajes de programación ha permitido la aparición de otros mecanismos para la abstracción de control, tales como manejo de excepciones, corrutinas, unidades concurrentes o plantillas (templates). Estas construcciones las soportan los lenguajes de programación basados y orientados a objetos, tales como C++, C#, Java, Modula-2, Ada, Smalltalk o Eiffel.

  • 1.5.2. Abstracciones de datos
Los primeros pasos hacia la abstracción de datos se crearon con lenguajes tales como FORTRAN, COBOL y ALGOL 60, con la introducción de tipos de variables diferentes, que manipulan enteros, números reales, caracteres, valores lógicos, etc. Sin embargo estos tipos de datos no podrían ser modificados y no siempre se ajustan al tipo necesitado. Por ejemplo, el tratamiento de cadenas es una deficiencia en FORTRAN, mientras que la precisión y la fiabilidad para cálculos matemáticos es muy alta.

La siguiente generación de lenguajes, PASCAL, SIMULA-67 y ALGOL 68, ofreció una amplia selección de tipos de datos y permitió al programador modificar y ampliar los tipo de datos existentes mediante construcciones específicas (por ejemplo, arrays y registros). Además SIMULA-67 fue el primer lenguaje que mezcló datos y procedimientos mediante la construcción de clases, que eventualmente se convirtió en la base del desarrollo de programación orientada a objetos.

La abstracción de datos es la técnica de programación que permite inventar o definir nuevos tipo de datos (tipos de datos definidos por el usuario) adecuados a la aplicación que se desea realizar. La abstracción de datos es una técnica muy potente que permite diseñar programas más cortos, legibles y flexibles. La esencia de la abstracción es similar a la utilización de un tipo de dato, cuyo uso se realiza sin tener en cuenta cómo está representado o implementado. 

Los tipos de datos son abstracciones y el proceso de construir nuevos tipos se llaman abstracciones de datos. Los nuevos tipos de datos definidos por el usuario se llaman tipos abstractos de datos. (ADT Abstract Data Types).

El concepto de tipo, tal como se definió en PASCAL y ALGOL 68, ha construido un hito importante hacia la realización de un lenguaje capaz de soportar programación estructurada.
Sin embargo, estos lenguajes no soportaban totalmente una metodología orientada a objetos. La abstracción de datos útil para este propósito, no sólo clasifica objetos de acuerdo a su estructura de representación, sino que se clasifican de acuerdo al comportamiento esperado. Tal comportamiento es expresable en términos de operaciones que son significativas sobre esos datos, y las operaciones son el único medio para crear, modificar y acceder a los datos.

En términos más precisos, Ghezzi indica que un tipo de dato definido por el usuario se denomina tipo abstracto de dato (TAD) si:
  • Existe una construcción del lenguaje que le permite asociar la representación de los datos con las operaciones que lo manipulan;
  • La representación del nuevo tipo de dato está oculta de las unidades de programa que lo utilizan.
Las clases de C++, C# y Java cumplen las dos condiciones, agrupa los datos junto a las operaciones y su representación queda oculta de otras clases.

Los tipos abstractos de datos proporcionan un mecanismo adicional mediante el cual se realiza una separación clara entre la interfaz y la implementación del tipo de dato. La implementación de un tipo abstracto de dato consta de:

1.- Representación: elección de las estructuras de datos.
2.- Operaciones: elecciones de los algoritmos.




No hay comentarios:

Publicar un comentario