No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Extensibilidad en Diseño de Software: Contratos e Interfaces

7/14
Recursos

¿Qué es la extensibilidad en el desarrollo de software?

En el mundo del desarrollo de software, adaptarse al cambio es una constante. La extensibilidad se refiere a la capacidad de un sistema para agregar nuevas funcionalidades sin realizar cambios significativos en el código existente. Este principio es crucial para desarrolladores que enfrentan la necesidad diaria de integrar nuevos requerimientos de forma eficaz.

La extensibilidad se logra mediante:

  • Puntos de extensión: Facilitan cambios sencillos y comprensibles.
  • Contratos e interfaces: Estas reglas garantizan que cualquier implementación siga ciertos estándares, asegurando coherencia al ampliar el sistema.

¿Cuáles son los retos de la extensibilidad?

Implementar extensibilidad conlleva desafíos importantes, como la correcta comprensión del problema y la búsqueda de consenso en los estándares del equipo.

  • Comprensión adecuada del problema: A menudo, los desarrolladores se lanzan a codificar sin detenerse a pensar si su enfoque tiene sentido. Tomarse el tiempo para entender claramente qué se está intentando resolver y por qué es esencial.
  • Consenso en estándares de desarrollo: Es necesario acordar las convenciones que guiarán el desarrollo. Estos estándares, idealmente documentados, facilitan la consistencia en el trabajo en equipo.

¿Cómo aplicar extensibilidad con interfaces y contratos?

Imaginemos un servicio que realiza peticiones al backend usando un HTTP gateway. Apostando por la extensibilidad, nos presentan un nuevo requerimiento: ahora debemos utilizar GraphQL en lugar de REST. A continuación, se muestra cómo las interfaces y contratos permiten la incorporación sin fricciones de nuevas funcionalidades.

interface Gateway {
    void fetchMany();
    void fetchOne();
}

class RESTGateway implements Gateway {
    public void fetchMany() {
        // Implementación basada en REST
    }

    public void fetchOne() {
        // Implementación basada en REST
    }
}

class GraphQLGateway implements Gateway {
    public void fetchMany() {
        // Implementación basada en GraphQL
    }

    public void fetchOne() {
        // Implementación basada en GraphQL
    }
}

En este ejemplo, las interfaces definen un contrato que garantiza que todas las implementaciones de gateway sigan las mismas reglas. Esto ofrece la flexibilidad de cambiar o agregar nuevos gateways con mínimo esfuerzo, facilitando la evolución del sistema.

¿Cuáles son los beneficios de las interfaces en la extensibilidad?

Las interfaces y contratos aportan grandes ventajas al diseño extendible del sistema. Ayudan a:

  • Definir las reglas del juego: Todos los elementos que deseen ser considerados de un tipo específico deben implementar los métodos definidos por el contrato.
  • Fomentar el cambio sencillo: Las implementaciones pueden variar mientras se mantengan constantes las reglas.
  • Mantener la abstracción: Al depender de interfaces y no de implementaciones concretas, se promueve un diseño flexible y escalable.

En suma, este enfoque permite que los sistemas de software evolucionen de manera organizada y controlada, favoreciendo la inclusión de nuevas características sin comprometer la integridad del código existente. ¡Ahora te toca a ti poner en práctica estos conceptos en tus proyectos!

Aportes 22

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

¡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:

  • Volar
  • Comer
  • Correr
  • Caminar

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.

La extensibilidad es una medida de la capacidad de extender un sistema y el nivel de esfuerzo requerido para implementar la extensión.

💡 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.

trabajar con interfaces, al principio es muy chocante, suelen ser conceptos muy abstractos

Extensibilidad:

  • Cambios sencillos y comprensibles
  • Cambios por contrato y/o interfaz
    requiere…
  • Comprender el problema
  • Consenso en la norma estándar


El chiste está en iterar, rápido, sencillo y con amplios márgenes de mejora

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')

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.

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: Tratar de extender lo menos posible sin necesidad de tocar el viejo código. * Ventajas: * Puntos de extensión / cambios. * Reglas de cambio definidas (Darse la solución tal cual) * Retos: * Buena comprensión de la situación * Entender las reglas que guien al desarrollo 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.

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/

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
- **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**: - Comprensión del problema antes de codificar. - Consenso en estándares de desarrollo. - Documentación adecuada para facilitar futuros cambios. - **Ejemplo práctico**: - Uso de un servicio de usuarios que puede cambiar entre GraphQL y REST sin modificar el servicio principal, gracias a contratos/interfaces. Estos conceptos son fundamentales para desarrollar software sólido y mantenible.
Los puntos más importantes sobre la extensibilidad en el diseño de software son: 1. Capacidad de agregar nuevas funcionalidades sin modificar el código existente. 2. Uso de contratos e interfaces que definen reglas que deben seguir las implementaciones. 3. Comprensión clara del problema antes de implementar código. 4. Consenso en estándares de desarrollo dentro del equipo. 5. Ejemplos prácticos, como el uso de interfaces para crear diferentes implementaciones de un gateway (REST y GraphQL) sin afectar el resto del sistema. Estos principios son fundamentales para crear soluciones de software robustas y escalables.
Wow por fin entiendo para qué sirven realmente las interfaces. Gracias :)
yo debo decir que nunca he trabajado así, que de repente te lleguen con cambios y que tenga que aplicar estas cosas que se ven sencillas pero que pudiera complicarme mucho implementándolas, tal vez tenga que estudiar mas la programación orientada a objetos.
"Hay que agregar cambios con los menos cambios posibles" ¿Por qué esto es así? lo dijo pero no explicó.