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.