El Análisis y Diseño Orientado A Objeto
El Análisis y Diseño Orientado A Objeto
El Análisis y Diseño Orientado A Objeto
Conceptos Clave
1. Clases y Objetos:
2. Encapsulamiento:
3. Herencia:
4. Polimorfismo:
5. Abstracción:
1. Análisis:
2. Diseño:
3. Implementación:
4. Pruebas:
5. Mantenimiento:
Herramientas y Notaciones
• UML (Unified Modeling Language): Es un estándar para visualizar, especificar,
construir y documentar artefactos de software. Incluye diversos diagramas
como el diagrama de clases, diagrama de secuencia, diagrama de casos de
uso, entre otros.
Clases y Objetos
• Objeto: Es una instancia de una clase. Un objeto es una entidad concreta que
se crea en memoria cuando se invoca el constructor de una clase. Cada objeto
tiene su propio conjunto de datos y puede realizar las operaciones definidas
por su clase.
Creación de Instancias
Cuando se crea un objeto a partir de una clase, se dice que se está instanciando la
clase. El proceso de instanciación implica:
Aquí tienes un ejemplo más completo que ilustra la creación y el uso de instancias de
una clase:
python
Copiar código
class Animal:
self.nombre = nombre
self.especie = especie
def hacer_sonido(self):
class Perro(Animal):
def hacer_sonido(self):
return "Guau"
class Gato(Animal):
def hacer_sonido(self):
return "Miau"
# Creación de instancias
En este ejemplo, mi_perro y mi_gato son instancias de las clases Perro y Gato,
respectivamente. Cada instancia tiene sus propios atributos (nombre y especie) y
puede utilizar el método hacer_sonido definido en su clase específica.
En resumen, las instancias de una clase representan objetos concretos que utilizan la
estructura y el comportamiento definidos por la clase, permitiendo crear múltiples
objetos con características similares pero con estados independientes.
Dijiste:
Descripción del Problema: Una biblioteca necesita un sistema para gestionar los
libros y los usuarios. Debe permitir:
Requisitos:
Vamos a modelar este problema con clases que representen los distintos conceptos
involucrados.
• Clase Biblioteca: Gestiona los libros y los usuarios, y maneja las operaciones
de préstamo y devolución.
python
Copiar código
class Libro:
self.id_libro = id_libro
self.titulo = titulo
self.autor = autor
if self.prestado_a is None:
self.prestado_a = usuario.id_usuario
return True
return False
def devolver(self):
self.prestado_a = None
return True
return False
def esta_prestado(self):
class Usuario:
self.id_usuario = id_usuario
self.nombre = nombre
class Biblioteca:
def __init__(self):
self.libros = {}
self.usuarios = {}
self.libros[libro.id_libro] = libro
def registrar_usuario(self, usuario):
self.usuarios[usuario.id_usuario] = usuario
libro = self.libros.get(id_libro)
usuario = self.usuarios.get(id_usuario)
if libro.prestar(usuario):
else:
libro = self.libros.get(id_libro)
libro = self.libros.get(id_libro)
if libro:
if libro.esta_prestado():
usuario = self.usuarios.get(libro.prestado_a)
python
Copiar código
# Crear la biblioteca
mi_biblioteca = Biblioteca()
# Registrar libros
mi_biblioteca.registrar_libro(libro1)
mi_biblioteca.registrar_libro(libro2)
# Registrar usuarios
mi_biblioteca.registrar_usuario(usuario1)
mi_biblioteca.registrar_usuario(usuario2)
# Prestar un libro
print(mi_biblioteca.devolver_libro(1))
Este enfoque orientado a objeto proporciona una estructura clara y modular para
gestionar el sistema de biblioteca, facilitando la extensión y el mantenimiento del
código.
El Análisis y Diseño Orientado a Objetos (AOO) es una metodología que se centra en
el uso de objetos y clases para modelar y diseñar sistemas. Aquí te presento algunos
problemas de ejemplo para ilustrar cómo se aplica el AOO en diferentes contextos:
Requisitos:
• Clases:
python
Copiar código
class Producto:
self.nombre = nombre
self.descripcion = descripcion
self.precio = precio
self.cantidad = cantidad
return True
return False
class Inventario:
def __init__(self):
self.productos = []
self.productos.append(producto)
if producto.nombre == nombre_producto:
return producto.vender(cantidad)
return False
Uso:
python
Copiar código
# Crear productos
producto1 = Producto("Laptop", "Laptop gaming", 1200, 10)
# Crear inventario
inventario = Inventario()
inventario.agregar_producto(producto1)
inventario.agregar_producto(producto2)
print(inventario.informe_stock_bajo(6)) # ["Mouse"]
Requisitos:
• Clases:
python
Copiar código
class Empleado:
self.id_empleado = id_empleado
self.nombre = nombre
self.salario_base = salario_base
self.departamento = departamento
self.bonificaciones = 0
self.bonificaciones += cantidad
def salario_total(self):
class Departamento:
self.nombre = nombre
self.empleados = []
self.empleados.append(empleado)
def informe_empleados(self):
Uso:
python
Copiar código
# Crear empleados
# Crear departamento
departamento_ventas = Departamento("Ventas")
departamento_ventas.agregar_empleado(empleado1)
departamento_ventas.agregar_empleado(empleado2)
# Agregar bonificaciones
empleado1.agregar_bonificacion(200)
empleado2.agregar_bonificacion(150)
Requisitos:
• Clases:
python
Copiar código
class Habitacion:
self.numero = numero
self.tipo = tipo
self.estado = 'disponible'
def reservar(self):
if self.estado == 'disponible':
self.estado = 'reservado'
return True
return False
def cancelar_reserva(self):
if self.estado == 'reservado':
self.estado = 'disponible'
return True
return False
class Reserva:
self.habitacion = habitacion
self.fecha_inicio = fecha_inicio
self.fecha_fin = fecha_fin
class Hotel:
def __init__(self):
self.habitaciones = []
self.reservas = []
self.habitaciones.append(habitacion)
self.reservas.append(reserva)
return True
return False
if reserva.habitacion.numero == numero_habitacion:
reserva.habitacion.cancelar_reserva()
self.reservas.remove(reserva)
return True
return False
return disponibles
Uso:
python
Copiar código
# Crear habitaciones
# Crear hotel
hotel = Hotel()
hotel.agregar_habitacion(habitacion1)
hotel.agregar_habitacion(habitacion2)
# Reservar habitación
# Cancelar reserva
print(hotel.cancelar_reserva(101)) # True
print(hotel.disponibilidad(date(2024, 8, 21))) # [101, 102]
Estos ejemplos ilustran cómo se puede aplicar el enfoque orientado a objeto para
modelar y resolver problemas prácticos en diferentes dominios. Al identificar las
entidades clave, sus atributos y comportamientos, y al diseñar clases que
encapsulan esta información, puedes crear soluciones flexibles y mantenibles.