Conceptos básicos de OOP
OOP Vs Programación estructurada
- En programación el paradigma imperativo está basado en funciones y datos.
- El paradigma orientado a objetos está basado en Objetos.
- Los objetos son el elemento básico y central de la programación orientada a objetos (OOP) o (POO).
- Podemos hablar de universo de discurso como el sistema que queremos automatizar por software
- Un Objeto es una entidad (concreta o abstracta) que presenta una actividad en un entorno concreto, en un determinado universo de discurso.
Definición
Objeto Cada elemento activo que identificamos dentro de un determinado universo de discurso.
- Serán nuestros componentes software para ensamblar nuestros programas
|
|
Ejemplo
|
|
- En un banco hay cuentas bancarias (objeto)
- Las cuentas bancarias se identifican con un número y un titular (nombre, apellido y dni) atributos
- Las cuentas se pueden dar de alta, de baja, hacer extracciones e ingresos y transferencias... métodos
|
|
Ejemplo
|
|
- En la gestión de una empresa, a nivel de información tenemos
-
- Empleados
- Nóminas
- Base de datos
- Proveedores
- Facturas
- Pedidos
|
|
Compartiva con la aplicación de master mind
|
|
|
- Puede parecer una forma más complicada de programar, pero es una manera de dividir la naturaleza del problema que estamos estudiando en unidades independientes que pueden interactuar entre ellas.
- Cada una de ellas va a tener una identidad propia asignando valores a sus atributos
- Cada una de ellas va a tener un comportamiento concreto que va a ser lo que sabe hacer para que los demás o el programa principal lo utilice
Elementos en la programación orientada a objetos
- De lo dicho anteriormente deducimos que tenemos dos elementos:
- Los atributos o características de la clase.
- Los métodos o comportamiento de la clase .
- Para crear objetos, previamente hay que definir su estructura.
- La definición de la estructura (atributos y métodos ) de componentes software se llama clase
Clase
- La descripción y especificación de componentes software para su posterior uso en los programas
- Una clase es la estructura de un tipo concreto de objetos.
- Los objetos son elementos concretos en mi sistema. Instancias de la clase en memoria para ser usadas por un programa
|
- Elementos de la POO
Atributo
- Son las características o datos de un objeto.
- Sus valores nos da el estado de un objeto en un momento dado.
- Normalmente al instanciar un objeto en memoria lo primero que hacemos es dar valores a sus atributos
- Es recomendado que los atributos estén encapsulados solo al objeto (privados)
|
- Elementos de la POO
Métodos
- Especifican el comportamiento de los objetos.
- Permiten modificar y conocer el estado de un objetos (métodos getter and setter).
- Permiten que un objeto haga cosas en el sistema (comunicación entre objetos) .
- Los métodos son las acciones que el objeto sabe hacer, servicios que ofrece
- También son las acciones internas para facilitar las acciones al objeto
|
Herencia
- La herencia es un mecanismo de programación que me permite crear una jerarquía en los componentes software, que se pueden ir especializando
- Es principio de abstracción por el cual podemos crear una jerarquía de clases, donde tenemos la raíz con los elementos comunes y en los nodos vamos especializando clases.
- La idea es definir una clase con ciertas características comunes (atributos, métodos)
Posteriormente crearemos otras clases a partir de la ya existente, quedando implícitamente los atributos y métodos como también parte de su estructura o composición.
- Es una característica muy natural (p.e Personas (médicos y bailarines) vehículos (Terrestres (coche, moto) Acuáticos (barco, lancha))
- Es una forma de obtener características comunes por separado y luego especializar evitando redundancias
- Facilita la reusabilidad y adaptación
- La herenica implica declarar jerarquía de clases
- En la raíz de la misma, establecemos la parte o estructura común a dichas clases , y posteriormente vamos especializando las diferencias de cada clase
- Todos los atributos y métodos de un supertipo o clase en nivel superior que sean públicos o protegidos, son heredados (son parte de ella) a todas las clases de nivel inferior.
|
- Para establecer una jerarquía, usamos la palabra reservada extends en las clases que hereden.
- Vamos a verlo con un ejemplo
- Primero establecemos la clase Persona
<?php
class Persona
{
protected $nombre;
protected $direccion;
protected $edad;
protected $frase;
public function __construct(string $n, string $d, string $e){
}
public function establecer_frase ($frase){
}
public function hablar ($frase){
}
}
- Ahora establecemos la clase que hereda de persona
Principios del uso de la herencia
- Todos los atributos y métodos públicos y protegidos del supertipo Persona son también de Sanitario
- En un momento dado, podemos invocar a los métodos del supertipo usando el operador parent seguido del operador de resolución de ámbito ::
|
<?php
class Sanitario extends Persona
{
protected $centroSalud;
protected $yearTitulacion;
public function __construct(string $centro, string $year){
parent::__construct();
....
}
- Vemos dos ejemplos para explicar de forma empírica este concepto
|
Herencia: gestión personal ambulatorio
|
|
- Se pide gestionar un ambulatorio.
- Para ello vamos a hacer sólo el diagrama de clases y su implementación.
- Lo hacemos a nivel básico (sin entrar en detalles).
- Tras realizar un análisis se determina que se pretende gestionar:
- los datos de los empleados y anotar las acciones básicas que realizan.
- Encontramos los siguientes elementos que especificamos como clases
- Conserjes
- Enfermeras
- Médicas
Las propiedades (atributos) y métodos de cada clase se especifican
en los siguientes diagramas de clases
- Claramente vemos que todos ellos tienen varios elementos en común.
- Esto nos permite crear una clases genérica que por ejemplo podemos llamar personalAmbulatorio
- Posteriormente creamos una especialización de personalAmbulatorio con los elementos particulares
- El digrama podría quedar
- Ver la aplicación ejecutándose
http://manuel.infenlaces.com/dwes/ejercicios/T6_Ambulatorio/
Posible index de uso |
---|
<?php
spl_autoload_register(function ($nombre_clase) {
include $nombre_clase . '.php';
});
$medico1 = new Medica("María", "Martínez", "Casa de María", 29, "Cardiólogía");
$medico2 = new Medica("Luis", "Pérez", "Casa de Luis", 38, "Pediatría");
$medico3 = new Medica("Nieves", "Ruiz", "Casa de Nieves", 44, "Dermatología");
$conserje = new Conserje("Soledad", "Viruela", "Casa de Soledad", 58, "Mostrador Entrada");
$enfermera = new Enfermera("Javier", "Moreno", "Casa de Javier", "general", 1990);
$enfermera2 = new Enfermera("Luis", "Perez", "Casa de Javier", "general", 1990);
$conserje->avisoEnfermera($enfermera, "Realizar cura en brazo Señor Martínez NSS 50/2155441/35");
$enfermera->avisoMedico($medico3, "Paciente con toss y fiebre");
$enfermera2->avisoMedico($medico2, "Paciente con toss y fiebre");
$enfermera2->avisoMedico($medico2, "Paciente con Vómitos");
$enfermera2->avisoMedico($medico3, "Paciente con pie torcido, impresión de rotura");
$conserje->avisoMedico($medico1, "Visitar en casa con mucha fiebre", "Visita");
$conserje->avisoMedico($medico1, "Problemas para desplazarse ", "Visita");
$conserje->avisoMedico($medico2, "Mareos y vétigos", "Visita");
$conserje->avisoMedico($medico2, "Persona mayor con poca mobilidad", "Visita");
$conserje->avisoMedico($medico3, "Niño pequeño con fiebre", "Visita");
$conserje->avisoMedico($medico1, "Caída en el parque", "Consulta");
?>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
</style>
<link rel="stylesheet" href="./stilo.css" type="text/css"/>
</head>
<body>
<?php
echo "$medico3";
echo "$medico1";
echo "$medico2";
// put your code here
?>
</body>
</html>
|
|
Clases Abstractas
- Cuando realizamos jerarquías muchas veces encontramos métodos comunes a varias clases. Esto implicaría que ese método sería un método de una superclase o clase padre de la que luego se heredará
- Pero puede ocurrir que aunque el concepto del método es común a todas las clases,la forma de implementarla es particular en cada una de ellas.
- En este caso, la forma correcta de proceder, es especificar el método el la clase superior, e implementar el código en cada una de las clases que derivo.
- El método especificado en la clase superior sería un método sin código, conocido como un método abstracto, y la clase dónde se especifica pasa a ser abstracta
Clase Abstracta
Es aquella clase que tiene un método o más abstracto
|
Método Abstracto
- Es un método que no tiene código asociado
- El código se implementará en las clases derivadas
|
- Nunca podremos instanciar un objeto de una clase abstracta
- Esto es normal, ya que ese objeto no tendría instrucciones para su/s método/s abstracto/s
|
- Vamos a platear un ejemplo
|
App de Geometría
|
|
- Gestionar figuras geométricas de tipo triángulo, cuadrado y Rectángulo.
- De ellas queremos conocer:
- el número de lados.
- calcular el área.
- dibujar el polígono (Esto insertaremos un pequeño código de javascript de uso básico del canvas
- conocer el número de lados del polígono.
- Realizamos los siguientes clases
- Clase Polígono
Descripción de la Clase Polígono
- Clase Rectángulo
Descripción de la Clase Rectángulo
- Clase Cuadrado
Descripción de la Clase Cuadrado
- Clase Triangulo
Descripción de la Clase Triángulo
- Uso de esta aplicación
- Un posible código index.php que lo único que hace es crear objetos y visulizar su área y dibujarlos
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<?php
spl_autoload_register(function ($clase){
require "$clase.php";
});
$triangulo = new Triangulo(200,300);
$cuadrado = new Cuadrado(200);
$rectangulo = new Rectangulo(200,100);
echo "<h4>Triángulo, ". Poligono::lados($triangulo)." y área ".
$triangulo->area()." px<sup>2</sup></h4>";
echo "<h4>Cuadrado, ". Poligono::lados($cuadrado)." y área ".
$cuadrado->area()." px<sup>2</sup></h4>";
echo "<h4>Rectángulo, ". Poligono::lados($rectangulo)." y área ".
$rectangulo->area()." px<sup>2</sup></h4>";
echo $triangulo->dibuja();
echo $cuadrado->dibuja();
echo $rectangulo->dibuja();
?>
</body>
</html>
- Resultado de su ejecución
|
V
|