Está en la página 1de 48

Ámbito y tiempo de vida de

variables.
Ámbito de vida
• El ámbito de una variable u objeto es el espacio del programa en el
que esa variable existe. Por ello, se habla de “ámbito de vida”

• De forma general, la vida de una variable comienza con su


declaración y termina en el bloque en el que fue declarada. Por
ejemplo, ¿cuál es el ámbito de la variable ‘radio’ y del vector
‘args’?:

public static void main(String[] args)


{
double PI = 3.1416;
double radio = 3;
System.out.println( “El área es” + (PI*radio*radio) );
}

• Existen diferentes tipos de ámbito


Tipos de ámbito
• El ámbito de una variable u objeto es el espacio del programa en el
que esa variable existe.
– Por ello, se habla de “ámbito de vida”

• Los principales tipos de ámbitos son:


– Ámbito de objeto.
• Los atributos de un objeto (que no son static) viven en el espacio de vida
del objeto y son accesibles por cualquier método del objeto (siempre que
el método no sea static).
• Por ello, a veces se llaman variables de objeto o variables
de instancia
Tipos de ámbito
– Ámbito de método.
• Variables y objetos declarados en un método.
• Su ámbito de vida se ciñe al método en el que fueron declaradas, por ello
a veces se llaman variables de método o función
– Ámbito de clase.
• Las variables static viven con independencia de que hayamos hecho
instancias de la clase.
• Podemos acceder a ellas (si son públicas) usando el nombre de la clase y
viven desde que se declara la clase, por ello se llaman variables de clase
Ambitos de objeto y de método
package figuras.dominio;
En el ejemplo de los public class Circulo {
círculos, hay variables de private Punto posicion;
objeto como: private double radio;
static final public double PI = 3.1416;
– posicion
public Circulo() { }
– radio public Circulo( double nuevoRadio, Punto nuevaPosicion ) {
Y variables de clase (PI). setRadio( nuevoRadio );
setPosicion( nuevaPosicion );
También hay variables de }

método (locales a la public Circulo( double nuevoRadio, int posicionX, int posicionY ) {
setRadio( nuevoRadio );
función): posicion = new Punto( posicionX, posicionY );
}
public Circulo( Circulo circulo ) {
setRadio( circulo.getRadio() );
setPosicion( circulo.getPosicion());
}
public void setRadio( double radio ) { this.radio = radio; }
public void setPosicion( Punto posicion ) { this.posicion = posicion; }
public Punto getPosicion() { return posicion; }
public double getRadio() { return radio; }
public double getArea() { return radio * radio * PI; }
public String toString() {
return "Radio: " + radio + " Posicion: " + posicion.toString() +
" Area: " + getArea();
}
}
Ámbito de clase. static
• Las variables static viven con independencia de que hayamos hecho
instancias de la clase
• Podemos acceder a ellas (si son públicas) usando el nombre de la clase
(no hay que hacer instancias) y viven desde que se declara la clase, por
ello se llaman variables de clase. Ejemplo:
class Circulo {
public static void main(String[] args) {
private punto posicion;
System.out.println( circulo.PI);
private double radio;
}
static public double PI = 3.1416;
...

• Todas las instancias de la clase comparten la misma variable static.


– Cosa que no ocurre con las variables no static, en estas cada objeto tiene su variable.
• En el ejemplo es lógico que el atributo “PI” sea static: el número PI es
único y el mismo sea cual sea el círculo
Ámbito de clase. static
• Con los métodos static ocurre algo semejante. Son accesibles desde la
clase, sin necesidad de hacer instancias.
– Ejemplo que convierte una cadena en un double:

String c = new String( “123.72” );


double r;
r = Double.parseDouble( c ); // Double es una clase, no un objeto

• Ahora podemos explicarnos por qué main debe ser static: debe ser
accesible por el interprete Java antes de crear ningún objeto

• Tienen restricciones: no pueden utilizar atributos de objeto (variables no


static) ni pueden llamar a métodos de objeto (métodos no static)

• Por ello un método static no puede usar la expresión “this”, ya que un


método static tiene ámbito de clase y this por definición tiene ámbito de
objeto
final
• Cuando se declara una variable como final estamos dando la orden
de que no se modifique. Es como definir una constante
• Debe ser inicializada en la declaración, ya que cualquier intento de
modificarla provoca un error de compilación
• Utilidad: no permitir que un error de programación altere el valor de
una constante. Ejemplo:

class circulo {
private punto posicion;
private double radio;
static final public double PI = 3.1416;

• El uso de final en métodos tiene otro sentido: no permitir que una


clase hija sobreescriba un método de la clase padre
PATRONES DE DISEÑO
Patrones de Diseño
• La Banda de los 4: Libro “Design Patterns” 1995).

• “Cada patrón es un problema que ocurre infinidad de


veces, con la misma solución”.
– Se puede usar la misma solución sin tener que pensar
nuevamente.
Patrones de Diseño

• Los patrones de diseño pretenden:


– Elementos reusables en diseño de SW.
– Reusar solución a problemas ya conocidos.
• Reducir tiempo de búsqueda.
– Formalizar un vocabulario común entre diseñadores.
– Estandarizar el modo en que se realiza el diseño.
– Condensar conocimiento para las nuevas generaciones
de diseñadores de SW.
Patrones de Diseño

• Clasificación de patrones de diseño:


– Patrones creacionales.
• Para la instanciación de nuevos objetos.
– Patrones estructurales.
• Para la organización y relación de las instancias de clase de
un sistema.
– Patrones de comportamiento.
• Para la definición de comportamiento común de ciertas
clases.
Patrones de Diseño
• Patrones a tratar:

– Singleton.

– Facade.

– Mediator.
Singleton - Definición

Singleton es un tipo de patrón creacional que


asegura que una clase tiene una única
instancia y provee un medio de acceso global
a dicha instancia.
Singleton - Aplicabilidad
El patrón Singleton se utiliza cuando:

• Debe haber exactamente una instancia de una clase y ésta


debe ser accesible para los clientes desde un punto de
acceso conocido.

• La única instancia deba ser extensible a través de una


subclase y los clientes puedan usar una instancia que
extienda a la única sin modificar su código.
Singleton - Estructura
Singleton – Propósito y Motivación
• Propósito
– Asegurar que una clase tiene una única instancia y
proporciona un punto de acceso global a la misma
• Motivación
– A veces es importante asegurar que una clase sólo
tiene una instancia (por ejemplo una sola cola de
impresión, un gestor de ventanas, un sistema de
ficheros...)
Singleton – Solución
• Solución:
– Una variable global:
• No, ya que no impide crear múltiples objetos.
– Responsabilidad del constructor de la clase
Singleton - Beneficios
• Acceso controlado a la instancia única

• Es una mejora a las variables globales

• Permite un número variable de instancias


Singleton - Aplicabilidad
• Usa el patrón Singleton cuando:
– Debe haber exactamente una instancia de una
clase, que debe ser accesible a los clientes a través
de un punto de acceso conocido.

– La instancia única pueda tener subclases, y los


clientes deban ser capaces de usar las subclases
sin modificar su propio código.
Singleton – Problemas y
Consecuencias
• Problemas
– Programas con múltiples hilos de ejecución.
• Solución: Exclusión mutua

• Consecuencias
– Acceso controlado a la instancia única
– Espacio de nombres reducido (mejora sobre el uso de
variables globales)
– Permite refinamiento de operaciones (mediante
subclases)
Singleton – Problemas y
Consecuencias
• Consecuencias
– Permite un número variable de instancias
(cambiando la operación de acceso a la instancia
singleton)
– Es más flexible que los métodos (estáticos) de
clase
• ¿Cómo permitir más de una instancia de la clase?
Singleton - Implementación
• Los aspectos más importantes a tomar en
cuenta a la hora de implementar una clase
Singleton son:
– Asegurar una única instancia
• Partipante principal Singleton:
– Define una operación Instance estática que permite a los
clientes acceder a su instancia única
– Puede ser responsable de crear su única instancia
– Posibles subclases de la clase Singleton
Singleton - Declaración en Java
Singleton - Ejemplos
• Algunos ejemplos de clases que requieren una
única instanciación son:

– Ratón
– File System
– Impresora
Singleton - Ejemplos
• Ejemplo: 1 clase Singleton Producto, y 2 clases
que usan esta clase.
– Clase A: Vendedor.
– Clase B: Comprador.

– Clase Producto tendrá un estático atributo privado


para establecer número actual de productos.
Singleton - Ejemplos
• Ejemplo:
– Usar Windows Builder.
• Interfaz permite a Vendedor agregar productos.
• Interfaz permite a Comprador quitar productos.
Facade - Definición

Facade es un patrón fundamental de


diseño que provee una interfaz única
para un conjunto de interfaces dentro de
un subsistema. Define una interfaz de
nivel superior que hace que el uso del
subsistema sea mas fácil.
Facade - Motivación

• La estructuración del sistema en


subsistemas ayuda a reducir la
complejidad.
• La interfaz de las clases o de un grupo
de clases puede ser compleja.
Facade - Motivación

“Un subsistema es
análogo a una clase en cuanto que ambos
tienen interfaces y ambos encapsulan algo”
[Gamma]

¿Por qué?
Facade - Estructura
Facade - Beneficios

• Esconde la implementación de los


subsistemas de los clientes.
• Promueve un acoplamiento débil entre
el subsistema y sus clientes.
• Simplifica la portabilidad de los
subsistemas hacia otras plataformas.
Facade - Ejemplo no dirigido a software
Facade - Ejemplo no dirigido a software
Facade - Ejemplo dirigido a software
Facade - Ejemplo

• Crear clase Computadora.


– Definir atributos y métodos asociados al
inicio de la misma.
• Atributo de Estado de cada pieza de hardware.
• Atributo de Estado de inicio de computadora
que depende de estado de cada pieza de HW.
• Operaciones para verificar y «setear» estados.
– Asuma que no existe método que encapsule
cada una de las operaciones de inicio.
Facade - Ejemplo

• Crear clase Usuario.


– Incluye un atributo PC de clase
Computadora.
• Para que usuario logre que estado de inicio de
PC sea «Iniciado», debe ejecutar cada uno de los
procesos asociados y verificar que ellos están OK
(Sin Fachada).
• Escribir clase Fachada y analizar la
«simpleza» del usuario.
Mediator - Definición

Define a un objeto que encapsula cómo


interactúan un conjunto de objetos.
Promueve bajo acoplamiento, evitando que los
objetos se comuniquen entre sí
explícitamente, y permite variar la interacción
entre ellos de forma independiente.
Mediator - ¿Cuándo Usar?
• Usar el patrón Mediator cuando:
– Un conjunto grande de objetos se comunica de una forma
bien definida, pero compleja.

– Reutilizar un objeto se hace difícil por que se relaciona con


muchos objetos.

– Las clases son difíciles de reutilizar porque su función


básica esta entrelazada con relaciones de dependencia.
Mediator
• Encapsular el comportamiento colectivo en un solo objeto
(mediador).
– Un mediador es como un procesador central.

• Coordinar y controlar las interacciones entre los objetos.

• Evitar a los objetos se comuniquen directamente con los


otros objetos.

• Los objetos conocerán únicamente al mediador, de esta


forma se reduce el número de interconexiones.
Mediator - Estructura
Mediator - Colaboraciones
• Los colegas envían y reciben peticiones (requests) de un objeto
mediador.
• El mediador implementa el comportamiento cooperativo
dirigiendo las peticiones los objetos adecuados.
Mediator - Participantes
• Mediador: define la interfaz para comunicarse con los otros
objetos.

• Mediador concreto: Implementa el comportamiento


cooperativo entre los Objetos. Conoce a los Objetos y los
mantiene.

• Colegas: Cada colega (objeto) conoce su mediador, y usa a


este para comunicarse con otros objetos.
Mediator - Ejemplo
Chat.
– Un conjunto de usuarios se comunican entre sí.
• Definir Interfaz para usuarios (métodos enviar y recibir).
• Definir clases de Usuarios.

– Existen Salas de Chat.


• Definir interfaz sala de chat.
– Método registrar usuario y enviar mensaje.
• Clase:
– Contiene un conjunto de usuarios (HashMap).
– Método para enviar mensajes entre usuarios.
Mediator - Ejemplo
Clase HashMap.
– Permite ser asociada a clases.
• Similar a ArrayList.
– Métodos.
• put(clave, objeto): Inserta un objeto en la lista.
• get(clave): devuelve el objeto de Id = clave.
• containsKey(clave): devuelve verdadero si Lista contiene clave, falso
en caso contrario.

• Chat (mediador), en envío de mensajes desde usuario 1 a usuario


2 , verifica que origen y destino sean parte de los usuarios.
– De ser así, permite que usuario destino reciba mensaje.
Mediator - Consecuencias
• Ventajas:

– Reduce la herencia.

– Desacopla a los objetos.

– Simplifica la comunicación entre objetos.

– Abstrae como los objetos cooperan.


Mediator - Consecuencias
• Desventajas:

– Centraliza el control:
• Cambia la complejidad en las interacciones entre
objetos por complejidad en el objeto mediador.
• Puede ser muy complejo, difícil de entender y
modificar.
Mediator - Implementación
• Comunicación Objeto y Mediador:
– Los objetos se comunican a su mediador cuando tiene lugar un
evento.

– Las clases de objetos cada vez que cambian su estado envían


notificaciones al mediador.

– El mediador responde propagando los efectos de dichos eventos


a los otros objetos.

También podría gustarte