Enciclopedia de Conocimientos Fundamentales
UNAM ˜ SIGLO XXI


regreso








3.3 ABSTRACCIÓN CON DATOS

La sección anterior se centró en procesos computacionales y en el diseño de procedimientos: datos básicos (números) y operaciones primitivas para manejarlos; cómo combinar procedimientos, condicionales, parámetros y cómo utilizar define para definir nuevos procedimientos o abstraer el comportamiento deseado de procesos. Ahora se verá cómo representar otros datos y cómo combinar distintas representaciones. Esto permite elevar el nivel conceptual con el que se diseñan problemas.

3.3.1 Definición de estructuras

La definición de estructuras es un mecanismo importante de Scheme para representar todo tipo de objetos con un número fijo de propiedades. Por ejemplo, los puntos en un plano cartesiano, los datos de un estudiante, etcétera.

(define-struct nombre (propiedad1 … propiedadn))

Cuando DrScheme evalúa una definición de estructura, crea n + 1 operaciones por el usuario, que puede utilizar para programar y crear datos complejos:

1] make-nombre, el constructor de estructuras nombre.

2] Para extraer cada una de las propiedades, como la propiedad i de una estructura de tipo nombre nombre-propiedadi.

Por ejemplo, supóngase que se debe diseñar un proceso que consuma una estructura tiempo y que deba producir el número de segundos que transcurren desde la medianoche hasta la hora que representa la estructura. A continuación se da la definición de la estructura tiempo:

(define-struct tiempo (horas minutos segundos))

Esto dará origen a cuatro procedimientos: make-tiempo, tiempo-horas, tiempo-minutos y tiempo-segundos. Por ejemplo, las 08:25:30 se representan así: (maketiempo 8 25 30). Ahora, pasando al análisis del problema, que no es muy complicado, el número de segundos es una cuestión de multiplicaciones. Una hora tiene 60 minutos, un minuto tiene 60 segundos. La receta de diseño, considerando la estructura tiempo, es:

;; Contrato: estructura-tiempo -> número

;; Propósito: Calcular el número de segundos desde la media

;; noche, hasta la hora que representa el argumento.

;; Ejemplo: (tiempo->segundos (make-tiempo 8 25 30))

;; debe producir 30330

;; Definición:

(define (tiempo->segundos t)

(+ (* (+ (* (tiempo-horas t) 60) ;; # horas en minutos

(tiempo-minutos t)) ;; minutos

60)

(tiempo-segundos t)))

;; Pruebas:

(tiempo->segundos (make-tiempo 8 25 30))

Las estructuras permiten ordenar los datos de un problema en forma compacta y útil; se seguirán utilizando más adelante.

Además de los procedimientos para construir y extraer los datos de una estructura, DrScheme crea un predicado5  para preguntar si un objeto es o no miembro de esa estructura. Éste permite distinguir un ejemplo de una estructura particular:

> (tiempo? (make-tiempo 8 25 30))

#t

Aprovechando esta nueva herramienta; se van a representar los puntos del plano cartesiano y reescribir el procedimiento de distancia con estos puntos.

(define-struct punto (x y))

;; Contrato: distancia2 punto punto -> númerov

;; Propósito: Calcular la distancia entre dos puntos

;; cualesquiera en el plano

;; Ejemplo: (distancia2 (make-punto -3 1) (make-punto 2 3))

;; debe producir 5.38

(define (distancia2 punto1 punto2)

(let ((dif-x (- (punto-x punto1) (punto-x

punto2)))

(dif-y (- (punto-y punto1) (punto-y punto2))))

(sqrt (+ (* dif-x dif-x)

(* dif-y dif-y)))))

;; Pruebas:

(distancia2 (make-punto -3 1) (make-punto 2 3))

Esto ofrece un mayor encapsulamiento de la información involucrada, en este caso sobre puntos en el plano, que permite a los programadores ver el programa y entender claramente qué hace, sin necesidad de imaginar que x1 y x2 son coordenadas X de dos puntos en el plano. Es más fácil dar mantenimiento a este programa o hacer modificaciones que en la versión anterior.


Inicio de página