Concepto de abstracción

La abstracción en resolución de problemas consiste en destacar los detalles importantes e ignorar los irrelevantes. La abstracción siempre lleva asociada la ocultación de información.

Funciones y procedimientos ejemplifican esto separando el “qué” del “cómo”, es decir, la especificación de la implementación.

Abstracción de acciones

Los procedimientos y funciones abstraen los detalles de ejecución, permitiendo acciones virtuales parametrizadas mientras ocultan datos locales y secuencias de instrucciones.

Tipo abstracto de datos (TAD)

Un tipo abstracto de datos es “una colección de valores y de operaciones definidos mediante una especificación independiente de cualquier representación”.

La programación con TAD requiere dos pasos:

  1. Definición del tipo (parte sintáctica y semántica)
  2. Implementación del tipo (elección de representación e implementación de operaciones)

Encapsulación

La encapsulación implica privacidad de la representación y protección del tipo. El usuario no conoce los detalles del tipo y sólo puede utilizar las operaciones previstas.

Diseño modular

La programación a gran escala requiere partir el código en módulos con conexión mínima entre ellos y tamaños manejables.

Ejemplo: módulo genérico de ordenación

Declaración (ordenacion_g.ads)

generic
    type ind is (<>); -- cualquier tipo discreto
    type elem is private; -- cualquier tipo
    type vector is array (ind range <>) of elem;
    with function ">"(a,b:elem) return boolean;

package ordenacion_g is
    procedure ordena (v:in out vector);
end; -- del módulo de declaración

Implementación (ordenacion_g.adb)

package body ordenacion_g is
    procedure ordena (v: in out vector) is
        i,j:ind; m,t:elem; n:integer;
    begin
        -- iniciailización
        i:=v'first;
        j:=v'last;
        n:=ind'pos(i);
        n:=n+ind'pos(j);
        n:=n/2;
        m:=v(ind'val(n));
        -- partición del vector en dos
        while i<=j loop
            while m>v(i) loop
                i:=ind'succ(i);
            end loop;
            while v(j)>m loop
                j:=ind'pred(j);
            end loop;
        
    end ordena;
end ordenacion_g;

Uso del módulo (mi_programa)

with ordenacion_g;
procedure mi_programa is
    type color is (rojo, azul, gris);
    type dia is (lu,ma,mi,ju,vi,sa,do);
    type vect is array (dia range <>) of color;
    x:vect(ma..vi):=(gris,azul,rojo,gris);
    package o is new ordenacion_g(dia,color,vect,">");
begin
    
    o.ordena(x);
    
end mi_programa;

Pilas y colas

Las implementaciones concretas de pilas (pilas) y colas muestran cómo mantener interfaces permite cambiar la implementación sin afectar a los usuarios.

Pila estática: Vector con contador para el elemento en la cima.

Pila dinámica: Nodos enlazados con acceso basado en punteros.

De manera similar para las colas, con vectores circulares o implementaciones con listas doblemente enlazadas según las necesidades.