Principio Abierto/Cerrado (OCP)

Siguiendo con la serie de principios SOLID, hoy hablaremos sobre el Principio Abierto/Cerrado, al que nos referiremos desde ahora como OCP.

Este principio fue enunciado por primera vez por Bertrand Meyer en su obra de 1988 Object-Oriented Software Construction y muy posteriormente, en 2002, Bob Martin publicó un articulo sobre el mismo tema.

El OCP, si es la primera vez que lo oyes enunciar, puede parecer una contradicción en si mismo, pero en breve veremos que la programación orientada a objetos nos da todas las herramientas para que este sea posible.

El principio OCP se define como:

Una clase debería estar abierta a extensión pero cerrada a modificación. Tenemos que ser capaces de extender el comportamiento de nuestras clases sin necesidad de modificar su código.

En pocas palabras, nuestras clases deberían de ser capaces de hacer más cosas, pero sin editar su código.

¿Cómo cumplimos con el OCP?

Como antes decía, puede parecer una contradicción en si mismo, pero no olvidemos que tenemos que pensar en un entorno de OOP, y debemos utilizar todos los mecanismos a nuestro alcance para conseguir esto, así que para solucionar el OCP en nuestro código debemos de usar el polimorfismo, y tenemos dos opciones igualmente válidas para implementarlo:

Supongamos una clase IdentityNumberValidator, la cual tiene un método validate(IdentityDocument $document) encargada de decirnos si el número de identidad de un documento es válido o no:

Como podemos ver, la clase IdentityNumberValidator no cumple con el OCP: con cada nuevo tipo de documento que vaya a soportar nuestro sistema, esta clase debe de ser editada para dar soporte al mismo.

Esto es ciertamente un problema, y ese if parece que va a crecer como la espuma… Veamos una solución usando polimorfismo con clases abstractas:

Como se puede observar:

Como parte negativa a esta solución, puede que cumplir con el OCP esté haciendo que no cumplamos con el SRP, ya que ahora las clases concretas de cada tipo de documento tienen una responsabilidad extra: saber cómo debe ser validado su número.

Veamos ahora una solución basada en interfaces que evite esto:

¿Qué ha cambiado?

Ventajas

Inconvenientes

¿A qué huele una clase que no cumple con el OCP?

Ahora que ya sabemos qué es el OCP y como cumplir con él… ¿Cómo detectamos que nuestras clases no cumplen con él?

Debemos fijarnos siempre en:

Aunque no son motivos determinantes, nos pueden dar una pista de que algo está pasando en nuestro código.

Hasta la próxima!

All you need is Clean Code

Clean Code, buenas prácticas, refactoring y mucho más!

)

Miguel Ángel Sánchez

Written by

PHP Developer - Clean Coder - SciFi freak and podcaster | Founder @wossom_com 🏴‍☠️ | Previously: Tech Lead @Beroomers 🏡 · CTO @origo_by 🌀

All you need is Clean Code

Clean Code, buenas prácticas, refactoring y mucho más!

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade