Open Close Principle
Una de las
características del desarrollo de software, es que el software debe
de estar diseñado para cambiar, alguna vez leí que el software que
no cambia tiende a morir, bajo esta idea, el software que se mantiene
evolucionando, agregando nuevas funcionalidades, mejorando las que ya
se tienen, innovando, ... es el software que sobrevive. Pero, para
que un software sea mejorado y/o aumentado debe de contar con
ciertos principios que permitan evitar que un pequeño cambio tenga
efectos no deseados en otras secciones de código.
En este blog
analizaremos el principio Open Close Principle, este principio
establece que el diseño de software deberá ser hecho de una forma
que las nuevas funcionalidad sean agregadas con mínimos cambios en
el código existente. La idea es que al agregar nuevas
funcionalidades se haga mediante nuevas clases, manteniendo lo mas
posible sin cambios el código que ya existe.
Por lo anterior, la
máxima del principio Open Close es: Open para extensión, Close
para modificación.
Lo que quiere decir
es que se debe de evitar modificar código ya creado, y tratar de
hacer uso de técnicas de diseño orientado a objetos tales como
interfaces y clases abstractas.
En el siguiente
ejemplo se tiene una clase que envía 3 tipos diferentes de mensajes,
las implementaciones para cada tipo de mensaje se encuentra en una
clase concreta que implementa la interface Message. La clase
MessageSender tiene un método llamado sendNotification que recibe un
tipo de objeto Message, de manera que podemos tener muchas
implementaciones y esta clase no se ve afectada de ninguna manera.
En el diagrama
podemos observar que si se desea agregar un nuevo tipo de mensaje no
es necesario modificar nada de las clases ya existentes (Close para
modificaciones), por otro lado, solo se requiere crear la nueva
implementación del tipo de mensaje que se desee extendiendo de la
clase abstracta o interface Message (Open para extensión).
En caso de que las
implementaciones se encontraran en una sola clase(rompiendo el
principio Open Close), cuando se desea agregar un nuevo tipo de
mensaje es necesario modificar esa clase y posiblemente realizar
cambios al código ya existen, con lo cual se viola el principio de
Open Close.
Código:
public class SenderNotification {
public Boolean sendNotification(final Message message) {
return message.sendMessage();
}
}
public interface Message {
Boolean sendMessage();
}
public class MailMessage implements Message{
@Override
public Boolean sendMessage() {
return true;
}
}
public class SMSMessage implements Message{
@Override
public Boolean sendMessage() {
return true;
}
}
public class VoiceMessage implements Message{
@Override
public Boolean sendMessage() {
return true;
}
}
Referencias:
http://www.oodesign.com/open-close-principle.html
http://www.objectmentor.com/resources/articles/ocp.pdf
http://code.tutsplus.com/tutorials/solid-part-2-the-openclosed-principle--net-36600