Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SESIÓN N° 02:
I
OBJETIVOS
II
TEMAS A TRATAR
Introducción.
¿Qué es la abstracción?
Propiedades de la abstracción
¿QUÉ ES EL ENCAPSULAMIENTO?
¿Qué es la abstracción y la encapsulación y cómo se relacionan?
Colaboración de objetos de diferentes clases
Resumen
III
MARCO TEORICO
1. INTRODUCCIÓN
La programación orientada a objetos (POO) es un paradigma de programación que se enfoca en la
creación de soluciones de software a través de la definición y manipulación de objetos y sus
interacciones. En este enfoque, los objetos representan entidades en el mundo real, y se definen sus
propiedades y comportamientos a través de la definición de clases, abstracción, encapsulamiento,
métodos y mensajes.
La abstracción se refiere a la capacidad de simplificar la complejidad de un sistema, aislando las
características esenciales y eliminando las características no esenciales. En la POO, la abstracción se
logra a través de la definición de clases y objetos, que representan entidades y comportamientos
que son relevantes para la solución de un problema específico.
El encapsulamiento es el mecanismo que permite ocultar el estado interno de un objeto y restringir
el acceso a él desde fuera del objeto. En la POO, el encapsulamiento se logra a través de la definición
de métodos públicos y privados, que permiten manipular y acceder a las propiedades de un objeto
de manera controlada.
Los métodos son procedimientos o funciones que se definen dentro de una clase y que permiten
realizar operaciones en los objetos de esa clase. Los métodos se llaman a través de mensajes, que
son las solicitudes que se envían a un objeto para realizar una acción específica.
En la POO, la combinación de abstracción, encapsulamiento, métodos y mensajes permite crear
soluciones de software más modulares, escalables y fáciles de mantener. El dominio de estos
conceptos es fundamental para cualquier programador que desee crear soluciones de software de
alta calidad.
En esta actividad de aprendizaje, nos enfocaremos en estos temas y exploraremos en profundidad
sus fundamentos teóricos y su aplicación práctica. Utilizaremos ejemplos y casos de estudio para
que los participantes puedan aplicar estos conceptos en la creación de soluciones de software en
POO. Al finalizar la actividad, los participantes habrán adquirido una comprensión sólida de los
conceptos fundamentales de la POO, así como habilidades prácticas para aplicarlos en la creación
de soluciones de software más eficientes y escalables.
2. ¿ QUÉ ES LA ABSTRACCIÓN?
La abstracción es uno de los conceptos fundamentales en la programación orientada a objetos
(POO). Se refiere a la capacidad de simplificar la complejidad de un sistema, aislando las
características esenciales y eliminando las características no esenciales. En la POO, la abstracción se
logra a través de la definición de clases y objetos, que representan entidades y comportamientos
que son relevantes para la solución de un problema específico.
Según Bjarne Stroustrup en su libro "The C++ Programming Language", la abstracción es un
mecanismo que permite enfocarse en los aspectos importantes de un problema y evitar preocuparse
por los detalles irrelevantes. En lugar de tratar con datos y operaciones complejas directamente, se
pueden utilizar clases y objetos que encapsulan el comportamiento y los datos en un paquete fácil
de usar. Esto ayuda a reducir la complejidad y aumentar la modularidad del sistema.
Por su parte, en su libro "Thinking in Java", Bruce Eckel define la abstracción como la capacidad de
representar conceptos complejos con entidades simples y fácilmente manejables. La abstracción
permite enfocarse en lo que un objeto es capaz de hacer, en lugar de como lo hace.
En el libro "Java: How to Program" de Paul y Harvey Deitel, se hace hincapié en que la abstracción
es un concepto fundamental en la POO y es esencial para crear software de alta calidad. Se utiliza
para separar la implementación de los detalles de la interfaz de usuario y otras partes del sistema,
lo que permite crear soluciones más robustas y escalables.
Finalmente, en el libro "Object-Oriented Software Construction" de Bertrand Meyer, se destaca que
la abstracción es el mecanismo que permite a los programadores construir modelos que representan
entidades del mundo real, y que estos modelos pueden ser utilizados para crear soluciones de
software más robustas y escalables.
Para ejemplificar la abstracción en la POO, a continuación, se presentan algunos ejemplos en
diferentes lenguajes de programación:
En C++, se puede utilizar una clase "Rectangle" para representar un rectángulo y encapsular sus
propiedades y comportamientos. Por ejemplo:
class Rectangle {
private:
int width;
int height;
public:
void setWidth(int w) { width = w; }
void setHeight(int h) { height = h; }
int getArea() { return width * height; }
};
En este ejemplo, se define una clase "Rectangle" que tiene dos propiedades privadas "width" y
"height", y tres métodos públicos "setWidth", "setHeight" y "getArea". Los métodos "setWidth" y
"setHeight" se utilizan para establecer los valores de las propiedades, mientras que el método
"getArea" se utiliza para calcular el área del rectángulo.
En Java, se puede utilizar una clase "Person" para representar a una persona y encapsular sus
propiedades y comportamientos. Por ejemplo:
En este ejemplo, se define una clase "Person" que tiene dos propiedades privadas "name" y "age",
y cuatro métodos públicos "setName", "setAge", "getName" y "getAge". Los métodos "setName" y
"setAge" se utilizan para establecer los valores de las propiedades, mientras que los métodos
"getName" y "getAge" se utilizan para obtener los valores de las propiedades.
En Python, se puede utilizar una clase "Animal" para representar un animal y encapsular sus
propiedades y comportamientos. Por ejemplo:
class Animal:
def __init__(self, name, species):
self.name = name
self.species = species
def get_name(self):
return self.name
def get_species(self):
return self.species
En este ejemplo, se define una clase "Animal" que tiene dos propiedades "name" y "species", y dos
métodos "get_name" y "get_species". El método "init" se utiliza para inicializar las propiedades
"name" y "species" cuando se crea un objeto de la clase.
En JavaScript, se puede utilizar una función constructora "Car" para representar un coche y
encapsular sus propiedades y comportamientos. Por ejemplo:
this.getMake = function() {
return this.make;
}
this.getModel = function() {
return this.model;
}
this.getYear = function() {
return this.year;
}
}
En este ejemplo, se define una función constructora "Car" que tiene tres propiedades "make",
"model" y "year", y tres métodos "getMake", "getModel" y "getYear". Los métodos se utilizan para
obtener los valores de las propiedades.
3. PROPIEDADES DE LA ABSTRACCIÓN
Desde el punto de vista de la Programación Orientada a Objetos (POO), las propiedades de la
abstracción se refieren a la capacidad de modelar objetos en términos de sus características
esenciales, ignorando los detalles irrelevantes o secundarios. Estas propiedades incluyen:
Simplificación: La abstracción permite simplificar la representación de los objetos, enfocándose en
los aspectos esenciales y eliminando los detalles innecesarios.
Generalización: La abstracción permite representar objetos de manera general, creando clases
abstractas que definen características comunes a un grupo de objetos.
Modularidad: La abstracción permite crear módulos de software que se comunican a través de
interfaces abstractas, permitiendo una mayor flexibilidad y reusabilidad del código.
Polimorfismo: La abstracción permite que los objetos se comporten de manera polimórfica, es decir,
que se adapten a diferentes situaciones y puedan ser tratados como objetos genéricos o específicos
según el contexto.
Encapsulamiento: La abstracción permite ocultar la complejidad interna de los objetos, exponiendo
solo los aspectos relevantes para su interacción con otros objetos.
Flexibilidad: La abstracción permite la flexibilidad y adaptabilidad del código, ya que permite que los
objetos se modifiquen o extiendan de manera controlada y segura.
Estas propiedades son fundamentales para el diseño de sistemas orientados a objetos, ya que
permiten crear modelos de software que son más simples, flexibles, modulares y fáciles de mantener.
4. ¿QUÉ ES EL ENCAPSULAMIENTO?
En Programación Orientada a Objetos (POO), el encapsulamiento es uno de los principios
fundamentales de diseño que se refiere a la capacidad de ocultar la complejidad interna de un
objeto y exponer solo las interfaces o métodos públicos que permiten interactuar con él. Esto
significa que los datos y comportamientos internos de un objeto están protegidos y solo son
accesibles a través de una interfaz pública.
El encapsulamiento tiene varios beneficios importantes, como la mejora de la seguridad y la robustez
del código, la simplificación de la interacción con objetos y la facilidad de mantenimiento. Al ocultar
los detalles internos de un objeto, se evita que los usuarios del objeto hagan cambios no deseados
y se asegura que los cambios realizados en el objeto estén controlados y verificados.
Es importante destacar que el encapsulamiento es diferente al ocultamiento. El ocultamiento se
refiere específicamente a la ocultación de los detalles internos de un objeto, mientras que el
encapsulamiento se refiere al mecanismo general que permite el ocultamiento y la protección de
los datos y comportamientos internos de un objeto. El ocultamiento es una técnica específica que
se utiliza para implementar el encapsulamiento.
En resumen, el encapsulamiento es un principio fundamental de la POO que permite proteger y
controlar el acceso a los datos y comportamientos internos de un objeto a través de una interfaz
pública. El ocultamiento, por su parte, se refiere específicamente a la ocultación de los detalles
internos de un objeto. Juntos, el encapsulamiento y el ocultamiento son importantes para la creación
de objetos seguros, robustos y fáciles de usar.
class BankAccount {
private:
std::string accountNumber;
double balance;
public:
void deposit(double amount);
void withdraw(double amount);
double getBalance();
};
En este ejemplo, se define una clase "BankAccount" que tiene dos propiedades "accountNumber" y
"balance", y tres métodos públicos "deposit", "withdraw" y "getBalance". Los métodos "deposit" y
"withdraw" se utilizan para agregar o retirar dinero de la cuenta, mientras que el método
"getBalance" se utiliza para obtener el saldo actual de la cuenta. La propiedad "accountNumber"
está oculta al mundo exterior de la clase, lo que proporciona un nivel de encapsulación.
En Java, se puede utilizar una clase "Person" para representar una persona y encapsular sus
propiedades y comportamientos. Por ejemplo:
En este ejemplo, se define una clase "Person" que tiene dos propiedades "name" y "age", y cuatro
métodos públicos "setName", "setAge", "getName" y "getAge". Los métodos "setName" y "setAge"
se utilizan para establecer los valores de las propiedades, mientras que los métodos "getName" y
"getAge" se utilizan para obtener los valores de las propiedades. La propiedad "name" y "age" están
ocultas al mundo exterior de la clase, lo que proporciona un nivel de encapsulación.
En Python, se puede utilizar una clase "Employee" para representar un empleado y encapsular sus
propiedades y comportamientos. Por ejemplo:
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
def get_name(self):
return self.name
def get_salary(self):
return self.salary
En este ejemplo, se define una clase "Employee" que tiene dos propiedades "name" y "salary", y dos
métodos "get_name" y "get_salary". El método "init" se utiliza para inicializar las propiedades "name"
y "salary" cuando se crea un objeto de la clase. Las propiedades "name" y "salary" están ocultas al
mundo exterior de la clase, lo que proporciona un nivel de encapsulación.
En JavaScript, la abstracción se puede lograr mediante la creación de clases que encapsulan los
detalles de implementación y proporcionan una interfaz pública clara y coherente para interactuar
con los objetos. Por ejemplo, podemos crear una clase "Persona" que abstraiga las características
esenciales de una persona, como su nombre y su edad:
class Persona {
constructor(nombre, edad) {
this._nombre = nombre;
this._edad = edad;
}
get nombre() {
return this._nombre;
}
set nombre(nuevoNombre) {
this._nombre = nuevoNombre;
}
get edad() {
return this._edad;
}
set edad(nuevaEdad) {
this._edad = nuevaEdad;
}
saludar() {
console.log(`Hola, mi nombre es ${this._nombre} y tengo ${this._edad} años`);
}
}
En este ejemplo, la clase "Persona" abstrae las características esenciales de una persona y encapsula
los detalles de implementación, como el almacenamiento de los datos en atributos privados
(_nombre y _edad) y la definición de métodos públicos para interactuar con ellos (get nombre(), set
nombre(), get edad(), set edad()). Además, la clase proporciona un método público saludar() que
utiliza los atributos encapsulados para imprimir un mensaje de saludo.
Podemos crear instancias de la clase "Persona" y utilizar sus métodos públicos para interactuar con
los objetos:
persona1.nombre = "Pedro";
persona1.edad = 40;
En este ejemplo, estamos utilizando los métodos get nombre(), set nombre(), get edad() y set edad()
para acceder y modificar los atributos encapsulados de las instancias de la clase "Persona", sin
conocer los detalles de implementación. De esta manera, estamos interactuando con los objetos a
través de una interfaz pública clara y coherente, que nos permite abstraer las características
esenciales de una persona y trabajar con ellas de manera abstracta y modular.
A. CLASES Y OBJETOS
Antes de profundizar en la colaboración de objetos de diferentes clases, es importante comprender
los conceptos de clases y objetos en POO. Una clase es una plantilla para crear objetos, que define
sus atributos y métodos. Un objeto es una instancia de una clase, que tiene un estado único definido
por sus atributos y puede realizar acciones definidas por sus métodos.
B. COLABORACIÓN DE OBJETOS
La colaboración de objetos es una técnica utilizada para dividir una tarea compleja en partes más
pequeñas y manejables, en las que cada objeto realiza una tarea específica. La colaboración de
objetos puede ser entre objetos de la misma clase o de diferentes clases.
La colaboración de objetos de diferentes clases implica que cada objeto realiza una tarea específica,
pero trabajan juntos para lograr una tarea en común. Cada objeto se comunica con los demás a
través de métodos públicos, compartiendo información y realizando acciones necesarias para lograr
la tarea.
#include <iostream>
#include <vector>
class Libro {
string titulo;
string autor;
double precio;
public:
Libro(string t, string a, double p) {
titulo = t;
autor = a;
precio = p;
}
string getTitulo() {
return titulo;
}
string getAutor() {
return autor;
}
double getPrecio() {
return precio;
}
};
class CarritoDeCompras {
vector<Libro> librosSeleccionados;
double precioTotal;
public:
CarritoDeCompras() {
precioTotal = 0;
}
vector<Libro> getLibrosSeleccionados() {
return librosSeleccionados;
}
double getPrecioTotal() {
return precioTotal;
}
};
class Pago {
public:
void procesarPago(CarritoDeCompras carrito, double monto) {
if (monto >= carrito.getPrecioTotal()) {
// Realizar la transacción financiera
cout << "La compra ha sido exitosa" << endl;
} else {
cout << "El monto ingresado es insuficiente" << endl;
}
}
};
int main() {
// Realizar el pago
Pago pago;
pago.procesarPago(carrito, 30.00);
return 0;
}
En este ejemplo, se crean tres objetos "Libro" con diferentes títulos, autores y precios. Luego, se
agrega cada libro al objeto "CarritoDeCompras". Después, se obtiene la lista de libros seleccionados
y el precio total de la compra utilizando los métodos "get" de la clase "CarritoDeCompras".
Finalmente, se realiza el pago utilizando el objeto "Pago", que procesa el pago y realiza la
transacción financiera.
class Libro:
def __init__(self, titulo, autor, precio):
self.titulo = titulo
self.autor = autor
self.precio = precio
class CarritoDeCompras:
def __init__(self):
self.lista_de_libros = []
self.total = 0
def imprimir_carrito(self):
for libro in self.lista_de_libros:
print(libro.titulo, libro.autor, libro.precio)
print("Total:", self.total)
class Pago:
def procesar_pago(self, carrito, metodo_de_pago):
if metodo_de_pago == "Tarjeta de credito":
print("Procesando pago con tarjeta de credito...")
print("Pago realizado con exito!")
elif metodo_de_pago == "PayPal":
print("Procesando pago con PayPal...")
print("Pago realizado con exito!")
else:
print("Metodo de pago no valido.")
# Ejemplo de uso
libro1 = Libro("El gran Gatsby", "F. Scott Fitzgerald", 10.99)
libro2 = Libro("1984", "George Orwell", 8.99)
carrito = CarritoDeCompras()
carrito.agregar_libro(libro1)
carrito.agregar_libro(libro2)
carrito.imprimir_carrito()
pago = Pago()
pago.procesar_pago(carrito, "Tarjeta de credito")
Este código crea tres clases: Libro, CarritoDeCompras y Pago. El objeto Libro representa un libro en
la tienda, con los atributos titulo, autor y precio. El objeto CarritoDeCompras se encarga de
almacenar los libros seleccionados y calcular el precio total. El objeto Pago procesa el pago y realiza
una transacción financiera.
El ejemplo de uso crea dos objetos Libro y un objeto CarritoDeCompras. Los libros se agregan al
carrito y luego se llama al método imprimir_carrito() para mostrar la lista de libros y el precio total.
Finalmente, se crea un objeto Pago y se llama al método procesar_pago() para procesar el pago
utilizando el método de pago especificado.
import java.util.ArrayList;
public CarritoDeCompras() {
this.libros = new ArrayList<Libro>();
this.precioTotal = 0.0;
}
// Procesar el pago
if (Pago.procesarPago(carrito.getPrecioTotal())) {
System.out.println("Pago procesado exitosamente.");
} else {
System.out.println("Error al procesar el pago.");
}
}
}
En este ejemplo en Java se utilizan las mismas tres clases que en los ejemplos anteriores: Libro,
CarritoDeCompras y Pago. La sintaxis y la estructura del código es diferente debido a las
particularidades del lenguaje de programación.
En la clase Libro se definen los mismos atributos que en los ejemplos anteriores (titulo, autor y
precio) y se crean los métodos get para acceder a ellos. En la clase CarritoDeCompras se definen
dos atributos (libros y precioTotal) y se crean los métodos para agregar libros al carrito, obtener la
lista de libros y el precio total. En la clase Pago se define un atributo metodoPago y se crea un
método para procesar el pago.
En el método main de la clase TiendaLibrosEnLinea se crea un objeto Libro de ejemplo, se crea un
objeto CarritoDeCompras, se agrega el libro al carrito y se crea un objeto Pago. Finalmente, se llama
al método procesarPago del objeto Pago y se pasa como parámetro el precio total del carrito de
compras.
7. RESUMEN
La programación orientada a objetos (POO) es un paradigma de programación que se centra en el
uso de objetos para representar conceptos del mundo real y permite una mejor organización y
modularidad del código. Los objetos son entidades que tienen atributos y métodos que los definen
IV
(La práctica tiene una duración de 2 horas) ACTIVIDADES
a) ¿Qué métodos son necesarios para vender y agregar productos a las tiendas?
b) ¿Cómo se pueden crear diferentes objetos para representar diferentes tiendas?
V
EJERCICIOS PROPUESTOS
1. Juego de carreras: Crea una clase "Carrera" y la clase “Auto” que permita a los jugadores competir
contra la computadora. La clase debe tener atributos como la distancia total de la carrera y la
dificultad del oponente de la computadora. Los estudiantes deben crear métodos para simular la
carrera y determinar el ganador.
2. Sistema de gestión de pedidos: Crea una clase "Inventario" que tenga una lista de productos
disponibles y una lista de productos agotados. Los estudiantes deben crear métodos para agregar
productos al inventario y actualizar las listas de productos disponibles y agotados. También deben
crear métodos para realizar pedidos y actualizar la lista de facturas de clientes.
3. Programa de simulación de vuelo: Crea una clase "Misión" y “Avión” que permita a los estudiantes
planificar una misión de vuelo. La clase debe tener atributos como el destino, la duración de la
misión y la tripulación necesaria. Los estudiantes deben crear métodos para simular la misión y
determinar si el avión tiene suficiente combustible para completar la misión con éxito.
V
CUESTIONARIO
VI
BIBLIOGRAFIA Y REFERENCIAS
[2] B. Stroustrup, El Lenguaje de Programación C++, Madrid: Pearson Educación S.A., 2012.
[3] C. S. Hortsmann, Big Java: Early Objects, Hoboken: John Wiley & Sons, 2019.
[4] I. Kalb, OBJECT-ORIENTED PYTHON: Master OOP by Building Games and GUIs, San Francisco: No
Starch Press, Inc., 2022.
[5] P. Deitel y H. Deitel, Cómo programar en C++, México: Pearson Educación, 2009.
[6] B. Moo, S. Lippman y J. Lajoie, C++ Primer, 2015: Adisson Wesley, Wesford.