You are on page 1of 11

Modularidad, Objetos, y Estado

Georgian Camilo Garca Beltrn


Jess Alejandro Noguera Balln
Musica de fondo: Under the Sunshine

Una estrategia que nos ayuda a estructurar sistemas de gran tamao es la modularidad, es
decir, dividir los sistemas de forma natural en partes coherentes, las cuales pueden ser
desarrolladas y mantenidas de forma separada.

Una estrategia para representar sistemas de forma computacional es ver los sistemas como
una coleccin de objetos los cuales pueden cambiar su comportamiento a travs del tiempo,
otra estrategia es concentrarse en el flujo de informacin que pasa a travs del sistema, tal
como un ingeniero elctrico observa la seal generada por un sistema.

3.1 Asignacin y estado local.


Para modelar de forma modular es necesario descomponer el sistema en objetos los cuales
tienen sus propias variables que describen el estado actual del objeto.

Qu beneficios tiene la asignacin?

El estado actual de un sistema se modela con las variables y los cambios en el estado son
asignados a esas variables.

Gracias a la asignacin y a las tcnicas de ocultar el estado en variables locales es posible


estructurar sistemas de una forma modular de tal forma que cada estado puede ser
manipulado explcitamente pasando parmetros adicionales.

Cul es el costo de la asignacin?


una variable de alguna forma puede referirse a un lugar en donde la variable es
almacenada y este valor almacenado puede ser cambiado.

La programacin que usa continuamente las asignaciones es conocida como programacin


imperativa, Esta programacin nos obliga a considerar el orden de las asignaciones para
asegurarnos Que cada variable sea cambiada de forma que se represente el modelo
fielmente.

3.2 El Ambiente
Una variable debe de alguna forma designar un lugar en el cual va a ser almacenada, en
nuestro modelo de evaluacin estos lugares son mantenidos en estructuras llamadas
ambientes.

Un ambiente es una secuencia de frames. Cada frame Es una tabla ( posiblemente vaca)
de enlaces los cuales asocian los nombres de las variables con sus correspondientes
valores.
Cada frame tambin apunta a un ambiente de cierre, a menos que el frame se ha
considerado global.

El ambiente es crucial en el proceso de evaluacin, porque ste determina el contexto en el


cual una expresin debe ser evaluada. de forma que una expresin adquiere su significado
slo con respecto a algn ambiente en el cual es evaluado.

3.2.1 Reglas para la evaluacin


Un procedimiento siempre es una pareja de algn cdigo y un apuntador algn ambiente.

Para aplicar un procedimiento a los argumentos, se crea un nuevo ambiente el cual


contiene un frame que enlaza los parmetros a los valores de los argumentos. El ambiente
de este es el ambiente especificado por el procedimiento.

3.2.3 Frames como repositorio de un estado local


Los procedimientos y las asignaciones pueden ser usados para representar objetos con
estados locales.

Como se observa en la figura llamar a W1 referencia el estado de la variable balance


almacenada en E1, Pero cuando se llama a W2 se referencia la variable balance
almacenada en E2, es por esto que cambios en el estado local de un objeto no afecta a
otros objetos.

3.2.4 Definiciones internas


Propiedades clave:

1. Los nombres de un procedimiento local no interfiere con los nombres


externos de procedimientos que los encierra.
2. Los procedimientos locales pueden acceder a los argumentos de los
procedimientos que los encierran simplemente usando los nombres de los
parmetros como variables.

3.3 Modelamiento con datos mutables.


Para modelar objetos compuestos con cambios de estado, usamos la abstraccin de datos,
la cual incluye adems de selectores y constructores, operaciones llamadas mutadores, las
cuales modifican los datos de los objetos.

3.3.1 Estructura de una lista mutable.

Como ejemplo vemos dos listas, x y Y, X tiene los valores de a b c y d, y la lista Y los
valores e y f, ahora evaluamos la expresin mutable (set-car! x y), la cual modifica la pareja
x reemplazandola por el valor de y. el resultado lo podemos observar en la figura 3.13
Compartir e Identidad:
Hay que tener cuidado cuando se realizan modificaciones en las estructuras ya que el
cambio se ver tambin en otras estructuras que compartan las partes modificadas.

3.3.2 Representacin de colas.


Una cola es una secuencia de elementos, en la cual los elementos son insertados por un
lado y eliminados por el otro. Es decir el primero que entra es el primero en salir (FIFO).

Como se observa en la figura 3.18 vemos al principio una cola vaca, luego se insertan los
elementos a y b, Luego a es removido, se inserta c y d, y b removido.

En trminos de abstraccin podemos definir en las colas las siguientes operaciones.


Como constructor ( make-queue ) Que retorna una cola vaca.
Dos selectores:
( empty-queue? <queue> ) verifica si la cola que est vaca.
( front-queue <queue> ) Retorna el objeto que se encuentra al frente de la
cola.
Dos Mutadores:
( insert-queue! <queue> <item> ) Inserta un elemento al final de la cola.
( delete-queue! <queue> ) remueve el elemento que se encuentra al frente
de la cola.

Entonces una cola puede ser representada como una pareja de apuntadores front-ptr y
rear-ptr, los cuales indican, respectivamente, inicio y final de una lista

3.3.3 Representacin de tablas:

Tablas de una dimensin:


Primero consideramos una tabla de una dimensin, en el cual los valores son almacenados
bajo un solo identificador. La tabla es implementada como una lista de elementos los cuales
son una pareja de un identificador asociado a un valor.

Tablas de dos dimensiones:


En una tabla de dos dimensiones cada valor es asociado a una pareja de identificadores.
3.3.4 Simulador para circuitos digitales

El diseo de sistemas digitales complejos, como las computadoras, es una actividad de


ingeniera importante. Los sistemas digitales se construyen interconectando elementos
simples; aunque las redes de ellos pueden tener un comportamiento muy complejo. Una
seal digital puede tener en cualquier momento slo uno de dos valores posibles, 0 y 1.

Las funciones digitales conectan cables que transportan seales de entrada a otros cables
de salida.

Podemos conectar funciones primitivas juntas para construir funciones ms complejas. Por
ejemplo, el circuito de medio-sumador consta de una compuerta OR, dos compuertas AND,
y un inversor. Se toman dos seales de entrada, A y B, y tiene dos seales de salida, S y C.

Para empezar a modelar el anterior circuito, debemos definir los procedimientos que
usaremos en la simulacin; Primero, definimos los cables, luego definimos las compuertas
asociando sus entradas y salidas.

Y finalmente definimos el procedimiento


Donde las entradas son A y B y las salidas S y C; los cables D y E los definimos localmente
,luedo D es el resultado de A y B en la compuerta OR, C es el resultado de A y B en la
primera compuerta AND, E es el valor inverso de C y S la salida de D y E en la segunda
compuerta AND.

Cajas de funciones primitivas

Las funciones primitivas implementan las '' fuerzas '' por las cuales un cambio en la seal de

un cable influye en las seales en otros cables. Para crear estas funciones, usamos las
siguientes operaciones en los c
ables:

: Retorna el valor actual de la seal sobre el cable

: Cambia el valor de la seal por


otro valor

:
Asigna el procedimiento que debe ejecutarse siempre que la seal cambie de valor

Adicionalmente, se puede utilizar el procedimiento que dice el tiempo


que un procedimiento se demora en ejecutar.

Representacin de cables
Un cable en nuestra simulacin ser un objeto computacional con dos variables de estado
locales: un valor de seal (inicialmente tomado como 0) y una coleccin de procedimientos
que se ejecutarn cuando la seal cambie de valor.

Implementamos el cable, usando el estilo de paso de mensajes, como una coleccin de


procedimientos locales junto con un procedimiento de envo

Agenda

Vamos ahora a crear una estructura de datos llamada agenda en la cual se encontrar el
calendario de las cosas que hay que hacer en un procedimiento. Una agenda se compone
de segmentos de tiempo donde cada segmento
es un par que consiste en un nmero (el tiempo) y una cola que contiene los procedimientos
que estn programados para ser ejecutados durante ese segmento de tiempo. sta tendr
las siguientes operaciones:

Retorna una nueva agenda vacia

Valida si la agenda esta vaca

Retorna el primer item de la agenda

Remueve el primer
item de la agenda

Agrega un
procedimiento a la agenda para ser ejecutado en un tiempo especifico

Retorna el tiempo actual de la simulacion

Una agenda se compone de segmentos de tiempo. Cada segmento de tiempo es un par que
consiste en un nmero (el tiempo) y una cola que contiene los procedimientos que estn
programados para ser ejecutados durante ese segmento de tiempo.

3.3.5 Propagacin de restricciones

Los elementos primitivos del lenguaje son restricciones primitivas que indican que ciertas
relaciones mantienen entre las cantidades. Combinamos las restricciones mediante la
construccin de redes de restriccin, en las que las restricciones se unen mediante
conectores. Un conector es un objeto que contiene un valor que puede participar en una o
ms restricciones.
Por ejemplo, sabemos que la relacin entre las temperaturas de Fahrenheit y Celsius es

Dicha restriccin puede considerarse como una red que tiene un sumador, 2 multiplicadores
y restricciones constantes, vemos a la izquierda una caja multiplicadora con tres terminales,
etiquetados m1, m2 y p. que mantendrn la temperatura Celsius. donde estan unidos a una
constante w que tiene el valor de 9. P obliga a m1 y m2 a ser un producto, asi como S a a1 y
a2 a ser una suma A la derecha vemos el otro producto con la constante 5 que con el
sumador representa a los grados farenheit.

Para simular el anterior sistema de restricciones, vamos a crear 2 conectores C y F,


llamando al constructor make-connector y enlazando C y F en una red apropiada:

El procedimiento para crear la red lo definimos de la siguiente manera:

Donde definimos el procedimiento con las entradas y salidas


Localmente definimos los conectores, y asignamos las operaciones (suma y producto) as
como las constantes.

Representando los conectores

Un conector se representa como un objeto de procedimiento con valores de variables de


estado locales,En el ejemplo anterior definimos los conectores de grados farenheit y celcius
y

3.4 Concurrencia

Construir modelos en trminos de objetos computacionales con el estado local nos


obliga a confrontar el tiempo como un concepto esencial en la programacin.Por lo
tanto, a menudo es natural modelar sistemas como colecciones de procesos
computacionales que se ejecutan simultneamente.

z
Pero tambin, es apropiado dividir modelos computacionales en partes que
evolucionan separadamente y simultneamente. Incluso si los programas se van a
ejecutar en una computadora secuencial, la prctica de escribir programas como si
fueran a ejecutarse simultneamente obliga al programador a evitar restricciones de
temporizacin no necesarias y, por lo tanto, hace que los programas sean ms
modulares.

Para explicar un poco mejor vamos a suponer que tenemos una cuenta compartida de 100
dolares para Peter y Paul, Peter retira $ 10 y Paul retira $ 25 dejando $ 65 en la cuenta.
Dependiendo del orden de los dos retiros, la secuencia de saldos en la cuenta es $ 100 $ 90
$ 65 o $ 100 $ 75 $ 65. En una implementacin informtica del sistema bancario, esta
secuencia cambiante de saldos podra ser modelada mediante asignaciones sucesivas a un
saldo variable.
Un problema para el banco es determinar el saldo en caso de que ambas personas retiren al
tiempo, ya que puede generar inconsistencias en el manejo del dinero; para controlar esto
se utiliza la serializacion, ya que con sta podemos forzar a que un procedimiento solo
ocurra una vez, entonces si llega un nuevo proceso y este no ha terminado entonces este
fuerza a que espere mientras notifica su finalizacion.

Los flujos son una idea inteligente que permite usar manipulaciones de secuencias
sin incurrir en los costos de manipular secuencias como listas. Con los flujos
podemos lograr lo mejor de ambos mundos: Podemos formular programas
elegantemente como manipulaciones de secuencias, al tiempo que obtenemos la
eficiencia de la computacin incremental.

Los streams, pueden mitigar algunas de las complejidades del estado de modelacin.

Por ejemplo Si el tiempo es medido en pasos discretos, entonces podemos modelar una
funcin temporal como una secuencia (infinito posible);

Los streams son una idea inteligente que permite usar manipulaciones de secuencias sin
incurrir en los costos de estas. Con esto podemos formular programas elegantemente

al tiempo que obtenemos la eficiencia de la computacin incremental.

Tambien tenemos streams infinitos como por ejemplo el generador de la serie de fibonacci
En la cual definimos los casos base y luego la serie determina los valores que siguen
mediante la secuencia dada.

You might also like