Introducción a La Programación Orientada a Objetos
La programación orientada a
objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa los objetos en sus
interacciones, para diseñar aplicaciones y programas informáticos.
Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo y encapsulamiento. Su uso se popularizó a
principios de la década de los años 1990. En la actualidad, existe variedad de
lenguajes de programación que soportan la orientación a objetos.
Definiciones de los Elementos
primordiales de la programación orientada a objetos.
Objeto: entidad que contiene datos (atributos) y comportamiento
(métodos). Los datos definen el estado del objeto, el comportamiento define su
funcionalidad.
Clase: una clase “C” define los datos (atributos) y comportamiento
(métodos) de cada objeto “O” que se cree por instanciación a partir de “C”.
Atributos
|
Instanciación
|
Resultado
|
Nombre
|
Instanciación
|
Nombre: Pedro
|
Cedula
|
Instanciación
|
Cedula: 12345678
|
Edad
|
Instanciación
|
Edad: 30
|
Empresa
|
Instanciación
|
Empresa: UC
|
Encapsulamiento: es la combinación de atributos y métodos en la misma entidad,
lo que permite controlar el acceso de datos.
Ocultamiento de Información: es la definición de restricciones de
acceso a ciertos atributos y/o métodos.
Restricciones de Acceso:
Público: cuando un atributo o método se define
como público, objetos de otras clases pueden acceder a ellos libremente.
Privado: cuando un método o atributo se define
privado, solo el objeto en cuestión puede accederlo y no fuera de él.
Interfaz de Una Clase: define el medio de comunicación fundamental entre
objetos. Debido al ocultamiento de información, todos los atributos deben
declararse como privados. Por lo tanto los atributos no forman parte de la
interfaz, solo los métodos públicos.
Metodos Observadores y Modificadores (Getters y Setters): Complementan el concepto de
ocultamiento de información. Debido que otros objetos no deben manipular
directamente los datos de un objeto, los métodos observadores y modificadores
proveen acceso controlado a los datos.
UML (Unified Modeling Languaje): lenguaje unificado de modelado. Es un
lenguaje grafico estandarizado para la visualización, especificación,
construcción y documentación de un sistema de software. Cuenta con varios tipos
de diagramas:
Diagramas de Estructura: de clases,
de componentes, de objetos, de estructura compuesta, de despliegue, de
paquetes.
Diagramas de Comportamiento: de
actividades, de casos de uso, de estados.
Diagramas de Interacción: de
secuencia, de comunicación, de tiempos y de vista de interacción.
Clases en UML:
Vista Restringida: Notación
Nombre de Clase
|
|
|
|
Ejemplo:
Estudiante
|
|
|
|
Vista Detallada: Notación
Nombre de La Clase
|
Atributo1 : Tipo
Atributo2 : Tipo
Atributo3 : Tipo
AtributoN : Tipo
|
Metodo1 (parámetros)
Metodo2 (parámetros)
Metodo3 (parámetros)
MetodoN (parámetros)
|
Restricciones de Acceso:
+: Publico
-: Privado
#: Protegido
Ejemplo:
Estudiante:
-
Cedula
-
Nombre
-
Edad
-
Promedio
+ modificar_edad (e :
entero)
+ modificar_promedio
(p : real)
+ consultar_cedula ()
+ consultar_edad ()
Interrelaciones Entre Clases: definen conexiones semánticas entre
los elementos del modelo.
Herencia: es un mecanismo que permite que los
datos y el comportamiento de una clase sean incluidos o utilizados como base
para otras clases. Bajo este esquema se relaciona una clase base y una o varias
clases derivadas. La clase base contiene todos los datos y comportamiento
compartidos por las clases derivadas de ella.
Clase
Base
|
|
|
|
Subclase1
|
|
|
|
Subclase2
|
|
|
|
SubclaseN
|
|
|
|
La clase base es conocida como
superclase, y las clases derivadas como subclases.
# Protegido: define que los métodos
protegidos solo pueden ser accedidos por la clase base y sus derivadas.
Extiende el acceso a las clases hijas.
Cuando se hereda de una clase base,
se crea una nueva clase que contiene todos los atributos de la clase base y
contiene a demás la interfaz de esa clase. La herencia es una interrelación
entre dos o más clases. Es una interrelación de tipo “es un”.
Generalización/Especificación: son principios de abstracción que
permiten definir clases como un refinamiento de otras clases. La clase más
general se denomina clase padre o superclase, y las derivadas clases hijas o
subclases.
Asociación: es una interrelación general entre
dos o más clases.
Empresa
|
|
|
|
Empleado
|
|
|
|
Multiplicidad: se define como el
número de instancias relacionadas por medio de la asociación.
N…M siendo el mínimo N y el máximo M.
0…* cero o mas
1…* 1 o mas
Agregación: es una interrelación de tipo “tiene
un”. Modela una interrelación “es parte de” entre dos o más clases.
Composición: es una interrelación de agregación de agregación “más
fuerte”. El objeto parte permanece solo con el todo, cuando el todo desaparece,
la parte también.
Paso de Mensajes: es el proceso mediante el cual un
objeto envía datos a otro objeto o solicita un servicio de otro objeto por
medio de la llamada a un método.
Pseudocodigo: Definición de Clases
Clase <identificador de clase>
Privado
<Identificador de atributo> : tipo
Proc <identificador de procedimiento> (argumentos)
Func <identificador de función> (argumentos) : tipo
Protegido
//atributos y métodos protegidos
Publico
//métodos públicos
Fclase
//implementación de los métodos
Func <identificador de clase> : : <identificador de método>
(argumentos) : tipo
Inicio
//cuerpo del método
Finfunc
Proc <identificador de clase> : : <identificador de metodo>
(argumentos)
Inicio
//cuerpo del metodo
Fproc
Ejemplo de definición de una clase
Clase Punto2D
Privado
X,Y : real
Público:
Punto2D() //constructor sin
parámetros
Punto2D(val x,y : real)
//constructor con parámetros definidores de instancia
Proc setX (val x : real )
//modificadores
Proc setY (val y : real )
//modificadores
Func getX () : real //consultores
Func getY () : real //consultores
Fclase
//Implementación de los Métodos
Punto2D::Punto2D()
Inicio
X = 0
Y = 0
Fin
Punto2D::Punto2D(val x1,y1 : real)
Inicio
X = x1
Y = y1
Fin
Proc Punto2D::setX(val x1 : real)
Inicio
X = x1
Fin
Proc Punto2D::setY(val y1 : real)
Inicio
Y = y1
Fin
Func Punto2D::getX(val x1 : real) : real
Inicio
Retornar (X)
Fin
Func Punto2D::getY(val y1 : real) : real
Inicio
Retornar (Y)
Fin
Pasó de Mensajes:
Para métodos no constructores
<identificador>.<identificador del metodo> ( parametros )
Para constructores
<identificador>( parametros ) : <identificador del
constructor>
Ejemplo usando la clase Punto2D
Algoritmo Puntos
Var
V: real
P1: Punto2D
P2 (5.0,2.4) : Punto2D
Inicio
P1.setX(3.0)
V = P2.getY()
Escribir (v)
Fin
Herencia:
Clase < identificador de clase derivada> hereda_de <identificador de
clase base>
//definición de
atributos y métodos
Fclase
//implementación de atributos y métodos
Nota: un ejercicio para ver la herencia es implementar la clase punto 3D
como herencia de la clase punto 2D, haciendo uso de los métodos de punto 2D
para crear métodos de punto 3D. Otro ejemplo es implementando punto3D como
herencia de punto 2D pero con acceso directo a los atributos de punto2D, al
declarar como protegidos los atributos de punto2D. Para acceder a los métodos
de la superclase se usa la palabra reservada “super”. Su estructura es:
Super <nombre del metodo> (parametros)
Polimorfismo: es una característica que permite a
diferentes clases responder al mismo mensaje, implementando cada una de ellas
el método de manera adecuada.
Tipos de Polimorfismo
Sobrecarga (overloading / static polymorphism): es una característica que
permite proporcionar operaciones con el mismo nombre pero signaturas diferentes
(es decir, operaciones de igual nombre pero que difieren en el tipo de datos o
cantidad de parámetros).
Sobreescritura (overriding /dynamic polimorphism): es una característica
que permite definir en una subclase una operación que restringe o modifica el
comportamiento original de la misma, pero preservando su signatura.
Constructores y Destructores: los constructores definen un objeto
“0” de una clase “C”. Cada objeto representa una instancia de esa clase. Los
constructores sin parámetros definen los datos del objeto en un estado base o
estándar, o estado de inicialización. Los constructores con un parámetro son
conocidos como constructores copia, que permiten realizar una copia exacta de
una instancia en otra instancia diferente. Es usado sobre todo cuando los
atributos de una clase definen un tipo recursivo, para evitar que en vez de
realizar una copia exacta, se realice una “referenciacion” de un objeto a otro.
De esta forma se prevee que al modificar un objeto, el otro tenga que cambiar.
Un constructor con “n” parámetros (n = cantidad de atributos de la clase)
define una instancia determinada para un objeto. Se definen como métodos que
tienen el mismo nombre de la clase.
Los destructores por otra parte permiten la liberación de memoria de un
objeto que ya no será usado. En los lenguajes sin recolección de basura, es
necesario implementar estos destructores para poder liberar el espacio ocupado.
Son métodos definidos con el nombre de la clase, similar a los constructores
pero anteponiéndole el símbolo “~”.
Ejemplo: ~<identificador de clase>(parametros)
Ejemplos Programados (C++)
//Clase persona
class Person{
//Atributos
//Atributos
private:
std::string nombre;
std::string apellido;
std::string cedula;
int anno_nacimiento;
//constantes
static const int EDAD_VOTANTE = 18;
static const int EDAD_MAYOR = 65;
public:
//Constructores
Person(std::string n, std::string a, std::string c, int aa) : nombre(n), apellido(a), cedula(c), anno_nacimiento(aa){}
Person() : nombre(""), apellido(""), cedula(""), anno_nacimiento(1990){}
void modNombre(std::string n){
nombre = n;
}
void modApellido(std::string a){
apellido = a;
}
void modCedula(std::string c){
cedula = c;
}
void modAnno(int aa){
anno_nacimiento = aa;
}
std::string obtNombre(){
return nombre;
}
std::string obtApellido(){
return apellido;
}
std::string obtCedula(){
return cedula;
}
int obtAnno(){
return anno_nacimiento;
}
int edad(int anno);
bool puedeVotar(int anno);
bool esAdultoMayor(int anno);
//sobrecarga de operadores
bool operator==(const Person& per) const;
bool operator!=(const Person& per) const;
};
std::string nombre;
std::string apellido;
std::string cedula;
int anno_nacimiento;
//constantes
static const int EDAD_VOTANTE = 18;
static const int EDAD_MAYOR = 65;
public:
//Constructores
Person(std::string n, std::string a, std::string c, int aa) : nombre(n), apellido(a), cedula(c), anno_nacimiento(aa){}
Person() : nombre(""), apellido(""), cedula(""), anno_nacimiento(1990){}
void modNombre(std::string n){
nombre = n;
}
void modApellido(std::string a){
apellido = a;
}
void modCedula(std::string c){
cedula = c;
}
void modAnno(int aa){
anno_nacimiento = aa;
}
std::string obtNombre(){
return nombre;
}
std::string obtApellido(){
return apellido;
}
std::string obtCedula(){
return cedula;
}
int obtAnno(){
return anno_nacimiento;
}
int edad(int anno);
bool puedeVotar(int anno);
bool esAdultoMayor(int anno);
//sobrecarga de operadores
bool operator==(const Person& per) const;
bool operator!=(const Person& per) const;
};
No hay comentarios:
Publicar un comentario