martes, 17 de marzo de 2015

Open Close Principle


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



No hay comentarios:

Publicar un comentario