Relación de los patrones SOLID y los principios de POO¶
Juan M. Fonseca-Solís · March/April 2025 · 10 min read
Introducción¶
En la metodología de trabajo SCRUM, el equipo de desarrollo de software incorpora funcionalidades nueva al sistema de forma incremental (cada dos semanas, por ejemplo), luego el equipo de pruebas y el cliente proveen retroalimentación para asegurarse que los requerimientos fueron satisfechos correctamente. Durante este proceso, los cambios realizados por los desarrolladores pueden afectar la funcionalidad pre-existente, por lo que es necesario correr pruebas de regresión, es decir, repetir las pruebas realizadas en las iteraciones pasadas. Como la ejecución de estas pruebas resulta costozo (a veces imposible, por limitaciones de tiempo), se recurre a la automatización; sin embargo, puede ocurrir también que los scripts de automatización pasados dejen de funcionar, entre otras razones, por un mal diseño. Para evitar esto se utilizan cuatro patrones de diseño, llamados "SOLID", que permiten que lograr que la solución de pruebas sea mantenible y escalable en el tiempo, procurando una "alta cohesión y bajo acoplamiento" entre sus componentes (GRASP) [1, 2]:
- S - Responsabilidad única (single responsibility).
- O - Abierto-cerrado (Open-closed).
- L - Sustitución de Liskov (Liskov substitution).
- I - Segregación de la interfaz (Interface segregation).
- D - Inversión de la dependencia (Dependency inversion).
Estos cuatro patrones de diseño SOLID son ampliamente explicados en la literatura y en este ipython notebook no pretendemos hacer lo mismo, sino que más bien nos enfocamos en describir su relación con los cuatro principios básicos de programación orientada a objetos (OOP, por sus siglas en inglés): polimorfismo, abstracción, encapsulamiento y herencia; pues ambos conceptos suelen confundirse.
Responsabilidad única (encapsulamiento)¶
En este diseño cada componente de software (clase o método) desempeña o "encapsula" una sola tarea y está relacionado con el diseño de segregación de la interfaz.
Abierto-cerrado (polimorfismo)¶
En el diseño abierto-cerrado los componente de software están abiertos para extender su funcionalidad pero cerrados para su modificarla; esto se cumple en el principio de polimorfismo, donde la funcionalidad de una clase padre (por ejemplo, TestBase o PageBase) se escribe una sola vez y son las clases hijas las encargadas de agregar atributos y métodos nuevos.
Sustitución de Liskov (herencia)¶
En este diseño los atributos y métodos de la clase padre también están presentes en sus clases hijas, y pueden ser invocados sin necesidad de realizar conversión explícita de datos; lo que se relaciona al principio de herencia.
Segregación de la interfaz (encapsulamiento)¶
En el diseño de segregación de la interfaz los componentes implementan roles documentados o "encapsulados" en una interfaz (por ejemplo, ejecutar operaciones de lectura, escritura y borrado en un repositorio). Es mejor tener "muchas interfaces de cliente específicas que una interfaz de propósito general).
Inversión de la dependencia (abstracción)¶
Este diseño propone que "se debe depender de abstracciones, no de implementaciones", es decir, que primero se piensa en la "abstracción" de los métodos (firma, retorno y parámetros) en los componentes "subordinados" a componentes "maestros", y luego se crea su implementación.
Conclusiones¶
...
Referencias¶
- SOLID. (2024, 9 de enero). Wikipedia, La enciclopedia libre. Fecha de consulta: 13:10, enero 9, 2024 desde https://es.wikipedia.org/w/index.php?title=SOLID&oldid=156873545.
- GRASP. (2024, 7 de diciembre). Wikipedia, La enciclopedia libre. Fecha de consulta: 15:17, diciembre 7, 2024 desde https://es.wikipedia.org/w/index.php?title=GRASP&oldid=163990059.
- Anton Angelov. Automated Testing Unleashed : Automated Testing Engineering Fundamentals: The Complete Handbook Volume 1. Automate the Planet.
This work is under a Creative Commons Atribución 4.0 Internacional license. The website juanfonsecasolis.github.io It is a Costa Rican blog dedicated to independent research on issues related to my computer science and math. To reuse this article and cite the source you can use Bibtex:
@online{Fonseca2025,
author = {Juan M. Fonseca-Solís},
title = { Principios SOLID },
year = 2025,
url = {https://juanfonsecasolis.github.io/blog/JFonseca.solid.html},
urldate = {}
}