Extensibilidad y Contratos en Programación Orientada a Objetos
Clase 7 de 14 • Curso de Introducción a los Patrones de Diseño de Software
Contenido del curso
Clase 7 de 14 • Curso de Introducción a los Patrones de Diseño de Software
Contenido del curso
Alvaro Eduardo Garzón Pira
Irving Juárez
Jesus Maria Gonzalez Guardo
Julian David Alzate Cuervo
jose alejandro zapata
Daniel Basulto
Jhonier Negrete Muñoz
Gustavo Adolfo Mejía
Daniel Basulto
Josshua Fletes
N40 M10
Daniel Basulto
alex morales
Markin Piero Pulache Guarniz
Dave Juanes
Miguel Angel Reyes Moreno
Carlos Andres Bohorquez Duran
Jorge Arias Argüelles
Leyla Carmona
Saul Hernando Echeverri Duque
Kevin Daniel Guzman Delgadillo
Daniel Basulto
Chanel Mariannis Paredes Sánchez
Diego Reyes Cabrera
Daniel Basulto
Flores Santiago Jose Gerardo
Walter Ricardo Forero Sanchez
Daniel Basulto
Juan David Gutierrez Castaño
Samuel Soto Hoyos
¡Hola!
Con el tema de interfaces se recomienda tener mucho en cuenta el principio I de los principios SOLID, es decir, Interface segregation o segregación de interfaces, este principio consiste en que una clase no debería de tener implementada una interfaz con más métodos de los que necesita, ejemplo, de una interfaz llamada IAnimales que tiene los siguientes métodos:
Una clase llamada Perro no debería de poder implementar esta interfaz, porque un perro no puede volar (a menos que estés en una película de terror), aplicando el principio de segregación de interfaces, se recomienda dividir esta interfaz, ejemplo:
interface IAnimales { correr(): void; caminar(): void; } interface IAnimalesVoladores extends IAnimales { volar(): void; } interface IAnimalesNoVoladores extends IAnimales { noVolar(): void; saltar(): void; } class Pajaro implements IAnimalesVoladores { public correr(): void {} public caminar(): void {} } class Perro implements IAnimalesNoVoladores { public volar(): void {} public noVolar(): void {} public saltar(): void {} public correr(): void {} public caminar(): void {} }
Espero que te sea de ayuda este aporte.
Yo también pensé en este principio al ver el ejemplo de la clase. Aunque es cierto que una interfaz no debe tener más métodos o propiedades de las que necesita, lo que este principio quiere dar a entender es que las interfaces puedan ser intercambiables.
.
Por ejemplo, un objeto firularis esta compuesta por la interfaz "perro". Para que el principio de Interface Segregation se cumpla, se debería poder cambiar la interfaz de firulais por la de "IAnimalesNoVoladores" (de acuerdo a tu ejemplo).
Muy bueno el aporte, hago una corrección al código de ejemplo, dado que en la clase Perro se agrego el metodo public volar(): void{} cuando en realidad debe ir en la clase Pajaro.
El porque debe ir en la clase Pajaro Es porque quien realmente declara el método es la interfaz IAnimalesVoladores y no la interfaz IAnimalesnoVoladores, por lo tanto al invocarlo desde la clase perro, nos puede provocar un error ya que ese método no se implementa en las interfaces invocadas.
La extensibilidad es una medida de la capacidad de extender un sistema y el nivel de esfuerzo requerido para implementar la extensión.
trabajar con interfaces, al principio es muy chocante, suelen ser conceptos muy abstractos
Es correcto, para mi fueron dificiles de comprender porque las veia como elementos de la sintaxis de un lenguaje, error.
Son elementos que nos permitan modelar ciertas situaciones y considero este es el camino correcto para su comprension.
💡 Documentación de todas las convenciones a las que se ha llegado.
Extensibilidad:
Capacidad de agregar nuevas cosas sin la necesidad de modificar en gran forma lo ya existente
Interfaz
Estipula las reglas que, las clases que lo implementen, tienen que seguir. En este sentido, una interfaz puede entenderse como un contrato abstracto que establece el comportamiento esperado del componente que la implementa, así como las restricciones, requisitos y formatos de entrada y salida que deben cumplirse.
solo reorganize el codigo para que se vea desde lo mas independiente (arriba) hasta lo mas dependiente (abajo)
// HttpGateway file import 'http' from 'HttpModule' class HttpGateway: private url = '/api' public method fetchManu(resource) is // url will be /api/users return http.get(url + '/' + resource)
// file client import 'httpGateway' from 'HttpGateway' class UserService: public method getAll() is return httpGateway.fetchMany('users')
Gracias Gustavo!
Extensibilidad:
El chiste está en iterar, rápido, sencillo y con amplios márgenes de mejora
Esto me ha sucedido con bash script, tuve que implementar algo asi pero con llamadas para manipular al sistema operativo.
Pero lo hice sin tener esta teoría, solo fue intuición, tambien me hace recordar cosas que se hacen en redes.
Es bastante interesante observar en retrospectiva la aplicacion de los conceptos sin querer queriendo.
Esto da pie a los famosos momentos "AHA! Con que eso era!"
estoy confundido con los ejemplos vengo del curso de JS a profundidad y no entiendo los ejemplos, interfaces, contratos... me perdi :(( de que lenguaje son los ejemplos??
si son mas avanzados las llamadas de apis desde el forntend
Usar tantas herramientas dentro de un proyecto puede ser enredoso pero si no se aplican patrones, espero mucho de este curso para fortalecer las bases del diseño de patrones
En TS es muy común usar interfaces.
Las interfaces son muy usadas en el proyecto que estoy actualmente trabajando con CSharp, el concepto es claro para mi.
Extensibilidad: Capacidad de agregar nuevas funcionalidades sin modificar el código existente.
Contratos e Interfaces: Reglas que deben implementar las clases que quieren ser parte del sistema, garantizando que cumplan con ciertas expectativas.
Retos de la extensibilidad:
Ejemplo práctico:
Estos conceptos son fundamentales para desarrollar software sólido y mantenible.
Extensibilidad:
Tratar de extender lo menos posible sin necesidad de tocar el viejo código.
La extensibilidad permite que una función obtenga las propiedades de otro metodo u función por ejemplo
Vehiculo
->Sirve para transportar personas
Auto extends vehiculo
->Tiene propiedades de vehiculo pero con nuevas caracteristicas ppor ejemplo solo puede cargar comom máximo 5 personas.
Vine a trabajar con interfaces en la implementación de los servicios que utilizo en Spring Boot, defino una clase para implementar dichos contratos, y otra para implmentar los repositorios de mi clase en función.
De hecho hace poco por no decir días, hice algo similar, resulta que el software estaba implementado en Event Tracking llamado X, por cuestiones de negocio se solicitó cambiar este proveedor por Y. Mi sorpresa fué cuando entré y vi la implementación de X, primero no estaba centralizado, segundo, estaba fuertemente acoplado, y tercero estaba mal regado por todas partes del código, así que creé la EventTrackingInterface y esta solucionó mis problemas.
Esas son las situaciones que personalmente me hicieron comprender el uso de las interfaces.
Excelente clase, todo super interesante y claro 👍
Creo que toda esta explicación de contratos y el ejemplo de RestGateway y GraphqlGateway son parte de lo que es el Principio de Inversión de Dependencias (5to principio SOLID) https://blog.logrocket.com/dependency-inversion-principle-typescript/
Siempre es muy interesante observar como las conexiones entre conceptos van apareciendo cuando se empieza a sacar conclusiones, bien Diego!
si con servicios WCF me gusta esa implementación pero se que actualmente se esta usando mas servicios REST.
En algunas imágenes colocas depende de y en otras dice esta está compuesta por,, ¿cuál es la diferencia ? Gracias , excelente contenido
Claro Walter.
La relación de "dependencia" entre dos clases radica en que los cambios efectuados en una puedan llevar a cambios en la otra. Imagina que en una clase A defines un método myMethod, esta clase es utilizada por la clase B, que también hace uso del método.
Si en algún momento el método cambiara de nombre a myNewMethod, tendrías que modificar la clase A y también las líneas de código en donde haces uso de la clase A en la clase B.
La clase B depende de la clase A.
En la relación de "composición" vamos a cambiar un poco la forma en la que hablamos de la relación entre las clases, ahora, diremos que la clase Carro, NECESITA un motor para que funcione, es decir usará la clase Motor, PERO, con la diferencia que al momento de crear el carro también se creara un objeto de tipo motor. Es decir, cuando se haga uso del operador new() con la clase Carro, en el método constructor de este se usará new() con la clase Motor.
La composición también es una relación de dependencia, es una especialización dada por el tipo de solución al problema en el mundo real que estemos modelando.
Explico esto en la clase 13 de este curso :)
me cuesta un poco entender los conceptos aqui planteados, siento que tal vez me faltan algunos fundamentos, para comprender mejor, saben que cursos podria tomar para ello?
Necesitas aprender un lenguaje que maneje interfaces para poder entender mejor este concepto. prueba Typescript o Go y lo entenderás.