Diseño y desarrollo de sistemas

Principios de diseño de software

Responsabilidad única

El principio de responsabilidad única dictamina que una clase debería tener un único motivo de cambio. Definimos la responsabilidad como una razón para el cambio.

Abierto – cerrado

El principio de abierto – cerrado enuncia que las entidades software (clases, módulos, funciones…) deberían estar abiertas para la extensión, pero cerradas para la modificación.

Sustitución de Liskov

El principio de sustitución de Liskov dice que los subtipos deben poder ser reemplazados por cualquiera de sus tipos base. Los objetos de un programa deberían ser reemplazables por instancias de sus subtipos sin alterar el correcto funcionamiento de un programa.

Inversión de dependencias

1. Los módulos de alto nivel no deberían depender de módulos de bajo nivel. Ambos deben depender de abstracciones.

2. Las abstracciones no deben depender de detalles. Son los detalles los que deben depender de abstracciones.

Segregación de interfaces

Es mejor muchas interfaces específicas para cada cliente que una sola interfaz de propósito general. Es decir, los clientes no deberían depende de métodos que no usan.

Para mi el tema más importante es el de versionamiento.

Si bien es cierto todos los temas que hemos visto tienen que ver con este y son igual de importantes, me inclino que si se tiene un orden eficiente en los diferentes grupos de trabajo en cuanto al desarrollo de software nos referimos se puede generar una muy buena estructura basica, y se pueden incluir estos principios y patrones, los cuales se pueden adaptar, entonces estaríamos hablando que además del orden del fuente, estariamos aplicando estándares que pueden lograr hacer que nuestra aplicación sea de calidad.

Patrones de diseño

Patrones creacionales

Utilizados para instanciar objetos, y así separar la implementación del cliente de la de los objetos que se utilizan. Con ellos intentamos separar la lógica de creación de objetos y encapsularla.

Abstract Factory

Nos provee una interfaz que delega la creación de un conjunto de objetos relacionados sin necesidad de especificar en ningún momento cuáles son las implementaciones concretas.

Factory Method

Expone un método de creación, delegando en las subclases la implementación de este método.

Builder

Separa la creación de un objeto complejo de su estructura, de tal forma que el mismo proceso de construcción nos puede servir para crear representaciones diferentes.

Singleton

limita a uno el número de instancias posibles de una clase en nuestro programa, y proporciona un acceso global al mismo.

Prototype

Permite la creación de objetos basados en “plantillas”. Un nuevo objeto se crea a partir de la clonación de otro objeto.

Patrones de comportamiento

Se utilizan a la hora de definir como las clases y objetos interaccionan entre ellos.

Command

Son objetos que encapsulan una acción y los parámetros que necesitan para ejecutarse.

Chain of responsibility

Se evita acoplar al emisor y receptor de una petición dando la posibilidad a varios receptores de consumirlo. Cada receptor tiene la opción de consumir esa petición o pasárselo al siguiente dentro de la cadena.

Interpreter

Define una representación para una gramática así como el mecanismo para evaluarla. El árbol de sintaxis del lenguaje se suele modelar mediante el patrón Composite.

Iterator

Se utiliza para poder movernos por los elementos de un conjunto de forma secuencial sin necesidad de exponer su implementación específica.

Mediator

Objeto que encapsula cómo otro conjunto de objetos interactúan y se comunican entre sí.

Memento

Este patrón otorga la capacidad de restaurar un objeto a un estado anterior.

Observer

Los objetos son capaces de suscribirse a una serie de eventos que otro objetivo va a emitir, y serán avisados cuando esto ocurra.

State

Permite modificar la forma en que un objeto se comporta en tiempo de ejecución, basándose en su estado interno.

Strategy

Permite la selección del algoritmo que ejecuta cierta acción en tiempo de ejecución.

Template Method

Especifica el esqueleto de un algoritmo, permitiendo a las subclases definir cómo implementan el comportamiento real.

Visitor

Permite separar el algoritmo de la estructura de datos que se utilizará para ejecutarlo. De esta forma se pueden añadir nuevas operaciones a estas estructuras sin necesidad de modificarlas

Patrones estructurales

Utilizados para crear clases u objetos que incluidos dentro de estructuras más complejas.

Adapter

Permite a dos clases con diferentes interfaces trabajar entre ellas, a través de un objeto intermedio con el que se comunican e interactúan.

Bridge

Desacopla una abstracción de su implementación, para que las dos puedan evolucionar de forma independiente.

Composite

Facilita la creación de estructuras de objetos en árbol, donde todos los elementos emplean una misma interfaz. Cada uno de ellos puede a su vez contener un listado de esos objetos, o ser el último de esa rama.

Decorator

Permite añadir funcionalidad extra a un objeto (de forma dinámica o estática) sin modificar el comportamiento del resto de objetos del mismo tipo.

Facade

Una facade (o fachada) es un objeto que crea una interfaz simplificada para tratar con otra parte del código más compleja, de tal forma que simplifica y aísla su uso.

Flyweight

Una gran cantidad de objetos comparte un mismo objeto con propiedades comunes con el fin de ahorrar memoria.Proxy: Es una clase que funciona como interfaz hacia cualquier otra cosa: una conexión a Internet, un archivo en disco o cualquier otro recurso que sea costoso o imposible de duplicar.