Mas o menos así se vería un poco mas organizado
Entender la Programación orientada a objetos
Programación orientada a objetos en Java
¿Qué es un Objeto?
Abstracción: ¿Qué es una Clase?
Modularidad
Definir Clases y sus componentes
Creando nuestra primera Clase
Método constructor
Static: Variables y Métodos Estáticos
Creando elementos estáticos
Final: Variables Constantes
Sobrecarga de métodos y constructores
¡Reto!
Encapsulamiento: Modificadores de acceso
Getters y Setters
Variable vs. Objeto
Variable vs. Objeto: Un vistazo a la memoria
Clases Anidadas
Clases Internas y Locales a un método
Enumerations
Reutilizar Código
¿Qué es la Herencia? Don't repeat Yourself
Super y This
Polimorfismo: Sobreescritura de Métodos
Polimorfismo: Sobreescribiendo el método toString
Interfaces
Creando una interfaz para definir si una fecha es agendable
Collections
Aplicar Abstracción
Clases Abstractas
Miembros abstractos
Clases Anónimas
Diferencias entre las Interfaces y las Clases Abstractas
Interfaces en Java 8 y 9
Herencia en interfaces
Ensamblando Objetos el proyecto
Simulando autenticación de usuarios
Modularizando la UI de Doctores
Definiendo las citas disponibles
Modularizando la UI de Pacientes
Recorriendo estructuras de árbol en Java
Agendando Citas
Cierre del curso: Continúa con Programación Funcional en Java
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Anahí Salgado Díaz de la Vega
Composición de Interfaces en Clases: abstraer todos los métodos/comportamientos de una clase para modularizarlos (comprimirlos, encapsularlos) en una interfaz y reutilizar su código en diferentes clases.
Las interfaces se crean utilizando la palabra reservada interface
y se implementan en nuestras clases con implements
.
Recuerda que podemos heredar (implementar) más de una interfaz, pero no podemos hacerlo de las clases padres o superclases.
public interface ISchedulabe {
void schedule(Date date, String Time);
}
public class AppointmentDoctor implements ISchedulable {
@Override
public void schedule(Date date, String Time) {
// ...
}
}
Aportes 62
Preguntas 19
Mas o menos así se vería un poco mas organizado
las clases con getter and setter se conocen POJO (Plain Old Java Object)
¿No era mejor crear una clase Appointment como super clase de AppointmentDoctor y AppointmentNurse?
No he pasado este video porque de verdad antes de seguir quise practicar a fondo, hice un complejo ejercicio, una mini Api con todos los Stands y usuarios de Jojo bizarre adventure usando Implements, y de verdad que así se aprende bastante, si te pones a practicar cosas bastante jodidas y vale muchísimo la pena hacer esto, excelente clase, esta clase me había dejado las 2 neuronas faltantes fritas pero ya voy encaminado.
POJO: Plain Old Java Object
Esto se pone cada vez más interesante y complejo! jaja
recuerden amiguitos, componer antes que heredar. Esto es porque la herencia es más estática ante el cambio, y te limita a una clase.
El uso de interfaces favorece la escalabilidad del código
“programar contra la interfaz y no contra la implementacion”
Definición: es un tipo de referencia similar a una clase, que tendrán solo constantes y definiciones de métodos
OBLIGAN a implementar métodos y atributos a las clases. Por lo tanto, fomenta el polimorfismo en los métodos.
Generalmente las interfaces indican el “PUEDE HACER” de un objeto.
Los métodos de las interfaces no llevan modificadores de acceso, al igual que las variables, ya que estos y estas los llevan implícitamente. Los métodos son public
y las variables son public static final
, haciéndolas constantes.
Sintaxis:
public interface ISchedulable {
schedule(Date date, String Time);
}
public class AppointmentDoctor implements ISchedulable {
}
Podemos instanciar un objeto de una clase, de una interfaz no**. Se puede crear un objeto de una clase y “asignarlo” a una interfaz que implemente la clase:**
public static void main(String[] args) {
ISchedulable iShealudable = new AppointmentDoctor();
}
iShealudable
solo tendrá acceso a los métodos que tengan en común la interfaz ISchedulable y la clase AppointmentDoctor.Son de gran ayuda para definir los comportamientos que son redundantes y queremos reutilizar más de una clase, incluso cuando tenemos muchas clases y no todas pertenecen a la misma “familia”.
Nos da la posibilidad de tener herencia múltiple en Java.
Habrán momentos en los que los métodos van a tener comportamientos radicalmente diferentes y ya no es tan conveniente declarar el comportamiento de estos en la clase padre. Partiendo de esto, podríamos usar las interfaces, que son solo la declaración y no el comportamiento de los métodos.
Tengo una duda las clases appointmentDoctor y appointmentNurse podian derivar de un super clase Appointment y ahí incluir el método schedule para que lo herederan, ¿como seria mejor herendando de un super clase o implementando una interfaz ?
Hay una manera muy sencilla de ordenar arrays implementando una interfaz llamada Comparable en este caso la implementé para que ordenara un array de Doctores de mayor a menor según la cantidad de citas que tuviera.
Este es el método que tiene la interfaz Comparable por dentro y que Doctor implementa
@Override
public int compareTo(Object o) {
int a = ((Doctor) o).availableAppointments.size();
int b = this.availableAppointments.size();
if(b == a){
return 0;
}else if(b > a){
return -1;
}else {
return 1;
}
}
Existe una clase muy util llamada Arrays que tiene un metodo static sort()
Ejemplo de su uso:
public class Main {
public static void main(String[] args) {
Doctor a = new Doctor("a","@");
Doctor b = new Doctor("b","@");
Doctor c = new Doctor("c","@");
Doctor[] arrayDoctores = {a,b,c};
a.addAvailableAppointment(new Date(),"");
b.addAvailableAppointment(new Date(),"");
b.addAvailableAppointment(new Date(),"");
c.addAvailableAppointment(new Date(),"");
for (Doctor e: arrayDoctores) {
System.out.println(e.getName());
}
//imprimirá
// a ,b, c porque este fue el orden en que se agregaron
Arrays.sort(arrayDoctores); //aquí usamos la clase Arrays
System.out.println();
for (Doctor e: arrayDoctores) {
System.out.println(e.getName());
}
//imprimirá
//b, a, c ya que b es el que tiene mas citas "2"; a y c al ser iguales
//no hace el cambio de posición
}
}
Interesante que se esté dejando a un lado la aplicabilidad de la herencia para adoptar aún más el de interfaces.
No lo entiendo, si de todos modos definió ambos métodos y su comportamiento aparte, que hace la interfaz ahí, que desventaja trae no usarla?
📑 Al momento de implementar una interfaz, debemos utilizar todos sus métodos.
Apuntes de esta Clase:
Creando una interfaz para definir si una fecha es agendable
Composición de interfaces en Clases
Es el proceso de añadirle comportamientos a una Clase mediante interfaces. Consiste en abstraer todos los métodos de una Clase y modularizarlos en una interfaz para poder reutilizarlos todas las veces que sean necesarias. Muchos desarrolladores hoy en día aconsejan usar la composición en lugar de la herencia pues en esta última la reutilización de código es lineal mientras que la composición se puede efectuar a cualquier Clase.
POJOS (Plain Old Java Object)
Es el nombre con el que se conocen las Clases con getters y setters.
Nota: una de las peculiaridades de las interfaces es que se pueden implementar múltiples Interfaces a una Clase.
public class AppointmentNurse implements ISchedulable, Runable {
...
}
COMPARTO CÓDIGO DE LAS CLASES CREADAS EN LA SESIÓN: 😊
Clase Nurse:
public class Nurse extends User{
private String speciallity;
public Nurse (String name, String email){
super(name,email);
}
public String getSpeciallity() {
return speciallity;
}
public void setSpeciallity(String speciallity) {
this.speciallity = speciallity;
}
}
Clase AppointmentDoctor:
package model;
import java.util.Date;
public class AppointmentDoctor implements ISchedulabel{
private int id;
private Patient patient;
private Doctor doctor;
private Date date;
private String time;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Patient getPatient() {
return patient;
}
public void setPatient(Patient patient) {
this.patient = patient;
}
public Doctor getDoctor() {
return doctor;
}
public void setDoctor(Doctor doctor) {
this.doctor = doctor;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
@Override
public void schedule(Date date, String time) {
}
}
Clase AppointmentNurse:
package model;
import java.util.Date;
public class AppointmentNurse implements ISchedulabel{
private int id;
private Patient patient;
private Nurse nurse;
private Date date;
private String time;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Patient getPatient() {
return patient;
}
public void setPatient(Patient patient) {
this.patient = patient;
}
public Nurse getNurse() {
return nurse;
}
public void setNurse(Nurse nurse) {
this.nurse = nurse;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
@Override
public void schedule(Date date, String time) {
}
}
Interface IShedulabel:
package model;
import java.util.Date;
public interface ISchedulabel {
void schedule(Date date, String time);
}
Creando una interfaz para definir si una fecha es agendable
El concepto de añadirle comportamientos a una clase se llama composición, composición de interfaces en clases. Lo que se hace es abstraer los métodos de una clase y comprimirlas en una interfaz para después reutilizarla en todas las clases que tengan esos comportamientos.
Las clases en las que están los getters y setters son conocidas como POJO’s (Plain Old Java Object).
Los métodos que pongamos en una interfaz tienen que ser implementados forzosamente en las clases que implementen la interfaz.
Una interfaz es como un contrato, donde tienes que cumplir con implementar todos los métodos de esta para que no existan errores.
Adjunto link UML realizado por diagrams:
https://drive.google.com/file/d/1BOR6FpCd6ooStpl3R_hyluMd6zWbrVdH/view?usp=sharing
Esto me recuerda a los React hooks de React, y específicamente el react context, es similar el concepto.
Además de los comentarios de los compañeros sobre una clase padre de Appointment, debería crearse una clase padre de Nurse y Doctor, ya que se está repitiento mucha cantidad de código. Por ejemplo, yo he creado la clase UserSpecialist, pensando en que se pueden crear más clases de usuarios especialistas, de modo que las clases Nurse y Doctor heredan de UserSpecialist, generando un código mucho más limpio y sin redundancia.
Al mover los archivos a la carpeta model, hay que agregar “package model;” para evitar errores
Utilizamos interfaces cuando detectamos comportamientos que se pueden reutilizar en diferentes familias, en diferentes clases. La ventaja de las interfaces es que no importa en que familia o nivel de herencia se encuentre, podemos reutilizar su comportamiento e implementar a cualquier clase.
Esta aplicando MVC? hay algun curso de eso?
Composición = dar poderes a las clases,
abstraer métodos acciones de una clase, comprimirlos o encapsularlos en una interfaz para posteriormente utilizarlo.
Super!!
Genial!
Excelente explicación de las interfaces como se implementan
genial 😃
Hola comparto mi repo con todos los ejercicios hasta el momento.
😉
gracias 😃
Increíble. Gracias.
En una interfaz se define el método y sus parámetros y las clases lo implementan, podríamos decir que se define “qué” hacer, pero no el
"cómo" hacerlo, la ventaja sobre la herencia es que se pueden implementar tantas interfaces como necesitemos y cualquier nivel, haciendo el código más modular.
Lo gracioso es que ya había tenido un acercamiento y trabajado con interfaces, pero no entendía bien su funcionalidad, ahora veo… Que ese proyecto es un pequeño Frankenstein jajajajaj y que su arquitectura es pésima… Gracias Anahi. eres la mejor!!! Ahora entiendo cada vez mas a Java y como funciona y cuando y porque usar las cosas.
Un POJO es una clase modelo de un objeto de la vida real abstraído a código, que tiene atributos y comportamientos
Muchas gracias por la estupenda clase instructora Anahí, ahora tengo más claro cómo utilizar las interfaces y ciertos detalles como al momento de mover las clases a paquetes va ser necesario establecerlas public para que en otros lugares sean visibles.
Genial.
Excelente clase 😁
Excelente clase, desconocía totalmente las interfaces.
POJO son las iniciales de “Plain Old Java Object”, que puede interpretarse como “Un objeto Java Plano Antiguo”. Un POJO es una instancia de una clase que no extiende ni implementa nada en especial. Para los programadores Java sirve para enfatizar el uso de clases simples y que no dependen de un framework en especial. Este concepto surge en oposición al modelo planteado por los estándares EJB anteriores al 3.0, en los que los Enterprise JavaBeans (EJB) debían implementar interfaces especiales.
Favorece la composición antes que la herencia. Es un principio del Diseño.
La composición es la utilización de objetos dentro de otros objetos, se conoce como la relacion tiene un en lugar de es un como lo aplica la herencia.
gracias por el aporte
Los POJOS son objetos antiguos de java y el objetivo de estos es desacoplar cualquier framework de la lógica de negocio.
Una forma de optimizarlo aún más, a mi parecer, sería que tanto Doctor como Enfermera sean subclases de una clase llamada trabajador/empleado, (podría ser una clase abstracta, pero entiendo que aún no se ha dado)
Lo mismo para las clases de citas, porque así me parece que se repite bastante el código. Aunque claro, entiendo que esto es un ejemplo
geniaaal
Yo cambié la lógica para que sean los Doctores o Enfermeras las que implementen una interfaz para que atiendan, así que la Appointment solo requiere un objeto con una implementación ISchedulable
Se que a lo mejor a muchos les parece que la estética y el orden no importan, pero es que el diagrama de Anahí es un caos
En java SE 1.8 existe el API joda-time para manejar fechas y horas…!
No seria mejor hacer una clase Appointment que herede a la de AppointmentDoctor y AppointmentNurse y solo cambiar el objeto Doctor y el objeto Nurse?
Luego de ver el tema de composicion me puse a investigar y parecer ser la mejor opcion sobre POO ya que tu codigo puede ser mas escalable.
Wow, por fin entendí las interfaces
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?