Patrones de Diseño de Software

Los patrones de diseño de software se refieren a las mejores prácticas adoptadas por desarrolladores con mucha experiencia en el paradigma orientado a objetos y se hacen para que los demás podamos seguir su ejemplo para resolver problemas que se tengan en el proceso. Un patrón de diseño es una solución a los problemas más comunes en el diseño de software, no se refiere a código que se pueda implementar directamente, si no que es una descripción o una plantilla de cómo resolver un problema en diferentes situaciones, por lo que no van a ser tan precisos.

Por ser tan diverso el diseño de software, se han publicado muchos patrones de diseño, para poder adaptarse a las necesidades de los desarrolladores, por lo cual los patrones de diseño se dividen en 3 grandes categorías, estas no están en orden de importancia, aunque algunos autores si las clasifican por las más usadas, yo creo que todas son importantes ya que unas se adaptan bien para algunos casos mientras que otras para otros casos, haciendo que estas sean completamente necesarias.

  1. Patrón de Diseño Creacional
Suresh Devang, Page

Este patrón de diseño se implementa cuando se quiere tener control de los objetos que crean y cómo se crean, para poder reducir la complejidad e inestabilidad del proyecto. El operador “new” se considera peligroso ya que crea objetos por todo el proyecto, lo cual puede llevar a que diferentes clases sean dependientes, lo que dificultaría algún cambio futuro ya que se tendrían que cambiar las clases dependientes a la que se quiere cambiar o terminaría en errores cascada. Este patrón evita esto al controlar la creación de objetos desde el proceso de inicialización y no dejarlo en manos del cliente. Hay varias formas de implementar el patrón:

  • Singleton
  • Método fábrica
  • Fábrica abstracta
  • Constructor
  1. Patrón de Diseño Estructural
Suresh Devang, Page

Este patrón se centra en la composición de clases y objetos que se pueden adaptar para poder hacer estructuras más grandes juntando varios. Se trata de poder hacer las partes más pequeñas de los sistemas y que con varias partes se pueda crear el sistema completo para así poder tener una separación bien definida y que sea más fácil poder dar mantenimiento a cada parte en vez de a todo el sistema a la vez. Se puede lograr este patrón por medio de las siguientes técnicas:

  • Adaptador
  • Puente
  • Composición
  • Decorador
  • Fachada
  • Proxy
  1. Patrón de Diseño basado en Comportamiento
Suserh Devang, Page

Este patrón se basa completamente en la comunicación entre los objetos, ya que se centra en cómo se dividen las responsabilidades entre objetos y cómo se resuelven los problemas, una forma de esto es que cada objeto tenga su propia responsabilidad y no se repita entre objetos, para así poder tener un control y una manera sencilla de agregar un paso entre dos objetos. Esta es solo una técnica de hacer más flexible un programa, pero hay más de este patrón:

  • Cadena de responsabilidades
  • Comando
  • Interpretador
  • Iterador
  • Mediador
  • Objeto Nulo
  • Observador
  • Visitante
  • Plantilla

Gracias a estas herramientas se pueden aprender buenas prácticas para desarrollar proyectos en el paradigma más usado actualmente, orientado a objetos, con estas prácticas se logra que los proyectos puedan crecer y evolucionar de manera que no se tenga que crear un proyecto completamente nuevo cuando hay necesidad de más cosas, si no que se puede usar de base el que ya se tiene y agregarle más funcionalidades, pero de una manera que cualquier programador pueda hacerlo y no solo la persona que lo creó en un principio. Se debe hace uso de estos patrones para evitar casos como el del cómic de abajo.

Paul Ballard, 2015, Page

Si se quiere aprender más de este tema este curso está disponible, o simplemente en línea se encuentran muchos cursos, o páginas con muchos ejemplos como esta que en verdad explica de una manera muy detallada.

Reflexión Parcial 1

En este parcial de la materia de Análisis y Modelación de Sistemas de Software he aprendido que para poder desarrollar un proyecto no basta con empezar a escribir código, lo que suele pasar la mayoría de las veces en este ramo, ya que nos enseñan a programar antes de a cómo organizar el proyecto y ver qué es lo que nos piden, siendo el diseño y análisis lo primero que deberíamos de hacer para poder comprender lo que se nos pide.

De los errores más comunes al desarrollar un sistema de software es la falta de entendimiento en los requerimientos, ya sea porque los clientes en verdad no saben qué es lo que quieren, no saben cómo explicarlo o no sabemos cómo entenderlo nosotros, por lo que pasa que un cliente pide un proyecto y el que se entrega es diferente, se piden cambios tan grandes que el proyecto termina cambiando completamente, lo que hace que se pierda mucho tiempo y dinero en estos casos.

  • Ciclos de Vida del Software

El desarrollo de software se puede descomponer en diferentes procesos, a la suma de los procesos se les llama Ciclo de Vida de Software, ya que va desde el análisis de los requerimientos hasta el final del proyecto donde se le tiene que dar mantenimiento al sistema.

Hay diferentes modelos para poder plasmar el proyecto en diagramas y poder separarlos en los diferentes procesos, los cuales se enfocan en diferentes cosas cada uno, las opiniones de las personas son variadas en cuál es el mejor, pero es cuestión de perspectiva y de el tipo de proyecto que se quiere modelar, ya que algunos se basan en que se de feedback del proyecto cada pequeña entrega que se haga (normalmente cada semana o cada semana), mientras que otros se basan en que se tenga una separación marcada entre cada proceso.

Los modelos más comunes son:

  1. Modelo de cascada
  2. Modelo en V
  3. Modelo de prototipos
  4. Modelo en espiral
  5. Modelo ágil
  • Proceso Unificado de Software
Rational Software Corporation, 2001, Page

Al haber tantos modelos para el desarrollo de software lo que se trató de hacer es tomar las mejores partes de cada uno y hacer un modelo que se use en todos los proyectos.

Una de las mejores partes son los casos de uso los cuales nos sirven para poder tener las requerimientos claros, los escenarios de cada usuario que va a tener interacción con el sistema y cuáles serán las interacciones de los usuarios con el sistema, tomando paso por paso las interacciones para no saltarnos ningún paso importante o propenso a errores.

Del modelo ágil se toma la parte iterativa e incremental, la cual se refiere a que se hará por partes el proyecto, con entregas en poco tiempo, para que se pueda tener feedback del cliente, por si quiere cambiar algo del proyecto o fue completamente mal entendido lo que quería.

También se toma el enfoque centrado a la arquitectura, este se refiere a poder hacer un esquema de las partes del proyecto, para ver cuáles ya se han implementado y qué es lo que hace cada una, así teniendo un esquema claro del proyecto.

  • Casos de Uso
Jessica Greene, 2018, Page

Con esta imagen se puede explicar completamente por qué son necesarios los casos de uso en el desarrollo de un sistema de software, el cliente pide una cosa, pero ya sea por que pasa por demasiada gente o por la complejidad del proyecto, se hace algo que no termina siendo lo que se pidió, por lo que se necesita tener claro lo que el cliente pide y los casos de uso ayudan en eso al separar los usuarios y las acciones que estos tendrían con el sistema.

  • Lenguajes de Modelado de Software

Otras herramientas que nos ayudan para poder tener la imagen clara del proyecto son los lenguajes de modelado de software, ya que estas son herramientas desarrolladas por personas o empresas que tienen experiencia en este ramo, por lo tanto pudieron hacer las herramientas para que cualquier persona modelando un proyecto puedo hacer eso de estos y se facilite más la tarea que tiene, los diferentes tipos que hay son:

  1. Lenguajes de Modelado de Sistemas
  2. Lenguajes de Modelado de Objetos
  3. Lenguajes de Modelado de Datos

Esta clase ha sido muy importante para mi para darme cuenta que en verdad es 100% necesario modelar el software que se quiere hacer antes de poder ponerte a programar.

Lo podemos ver como que una empresa quiere hacer un auto, con la pura idea de qué es lo que tiene que llevar no se puede hacer, se necesita hacer un plano con las especificaciones completas y exactas para poder fabricarlo, en el software pasa igual, aunque no hay un producto físico que se pueda ver, ya que un software puede ser tan complejo como para que se tenga que dividir en partes y hacer un plano de qué es lo que hace cada parte y cómo se relaciona con las demás. En un auto el motor se puede ver como la parte principal, mientras que en el software la parte principal del programa sería donde se procesa la información, pero como un auto, no solo se compone del motor, si no que necesita todas las partes para que funcione, el chasis para que pueda ser manejado por el usuario, lo cuál sería la interfaz del software en este caso, así como otras partes.

Lo que sigue es continuar viendo más temas sobre el modelado del desarrollo del software, el cual me va a permitir tener una visión más completa del proyecto antes de empezar a hacerlo, ya que como dice el libro The Mythical Man-Month (2013), el cuál recomiendo leer, el tiempo para desarrollar un proyecto se va en estas partes:

  • 1/3 parte planeando
  • 1/6 parte escribiendo código
  • 1/4 parte probando los componentes en la versión temprana del sistema
  • 1/4 parte probando los componentes cuando ya está terminado el proyecto

Por lo que nos damos cuenta que la parte que más tiempo toma es la planeación del proyecto, por lo que se debe de tomar muy en serio este proceso y por consiguiente su estudio para poder hacer un proyecto de la manera correcta y más eficiente. Entre más herramientas tengamos para esto, mejor saldrá esta parte, haciendo que el proyecto en general salga bien, ya que esta es la base del proyecto completo, hacer un proyecto sin la parte del análisis es como hacer una casa sin hacer un plano y la investigación necesaria para ver si el suelo necesita algún cambio, puede ser que funcione y salga bien, pero es muy probable que falte algún detalle y con un pequeño problema toda la casa se venga abajo.

Project Delivery 1

Team Name: The Three Amigos (Team three)

Project Name: Proper Course Selection

Stakeholders:

  • University: Tec 
    • working with the software, want to have an easy to understand and handle program to ensure course selection for studentsdatabase should be filled directly by professorssuggestions of timetables should be changeablefinal timetables should be accessible for students via the systemsoftware should be safe (stable and high security)software should be cheapsoftware should be delivered end of Februarymedium requirements (hardware and maintenance) course selection via web page
  • Students 
    • want an easy to understand and handle software to assign the courses they want to participate in
    • prefer to get their favorable courses (especially when they are in their last semester)
    • want their courses at specific times (especially when they are working)
    • course selection via web page
    • want to choose the professor for each course
  • Professors
    • want their courses at a specific time, because some professors also have a regular job and are not only professors
    • want specific rooms, some need specific equipment for their course that is only available in one classroom 

Use case first attempt:

  1. System: Course matching system
  2. Actors: University, Students, Professors
  3. Use cases University:
    1. Input interface for room information
    2. Database access
    3. Interface for control purposes
    4. Access to timetables (students and professors) and room schedules

3. Use cases professors:

  1. Input interface for professor and course information (times available)
  2. Interface to access final timetable
  3. Input interface for classroom preference in case of needed

3. Use cases students:

  1. Input interface for student information (semester, working times if applicable)
  2. Interface to see available courses 
  3. Interface for course selection 
  • course preferences and replacements
  1. Interface to access final timetable

General description (which problems will be solved):

  • minimizing operating time while minimizing manual handling
  • simplifying the course matching (time, room, student and teacher) while lowering the manual handling
  • replace current software used
  • solving the problem of 
    • professors not having more than one class at the same time 
    • students not having more than one class at the same time 
    • rooms not being booked with more than one class at the same time
    • assigning rooms of the right size
    • if possible take into account students and professors preferences
    • reliability of the current software

Lenguajes de Modelado de Software

El diseño de los sistemas de software puede llegar a ser tan complejo que se necesitan herramientas que lo faciliten y hagan más eficiente, por eso se cuenta con los lenguajes de modelación, ya que estos permiten que se pueda hacer la descripción del problema ya sea de manera gráfica o escrita para poder tener una descripción más completa de lo que se quiere hacer.

Hay tantos tipos de sistemas de software que hasta los lenguajes se tienen que dividir dependiendo de para que tipo de sistema de software se quiera modelar, esto puede llegar a ser confuso, pero sin estas categorías sería aún más confuso. Las categorías principales son las siguientes:

  • Lenguajes de Modelado de Sistemas

Como su nombre lo dice, este lenguaje se centra en el modelado de sistemas, por lo que puede incluir hardware, software, información, personas involucradas, procedimientos e instalaciones, mientras que el modelado común no llega a entrar en detalles como las instalaciones. Este fue publicado por la empresa OMG (Object Management Group) en 2003.

OMG, 2019, Page
  • Lenguajes de Modelado de Objetos

Estos se basan en el paradigma Orientado a Objetos, donde se trata de hacer que los sistemas sean independientes entre si, haciendo que cada parte del programa sea representada por un objecto con atributos y acciones. El lenguaje es gráfico y se representan tantos los atributos como las acciones de cada objeto que se tiene, así como la interacciones entre un objeto y otro. La herramienta más conocida de este es UML, el cuál sugiere los parámetros para la realización de los esquemas.

Visual-Paradigm, Page
  • Lenguaje de Modelado de Datos

Debido a la gran cantidad de datos que se producen cada segundo en el mundo, se han desarrollado herramientas para el modelado de estos, podemos pensar en SQL, que ordena la información en tablas e indica las relaciones entre las entidades para hacer un mejor manejo de los datos y tener como buscarlos, ya que, como hay una gran cantidad de datos, si estos no están ordenados se pueden desaprovechar. UML también ofrece una herramienta para esto.

Thomas Frisendal, 2019. Page

En mi opinión las herramientas para el desarrollo de software son 100% necesarias, ya que con la complejidad de estos proyectos se pueden pasar por alto detalles muy importantes para el proyecto así quedando mal con el cliente, por lo que se deben de hacer eso de estas. De estas herramientas las más conocidas son de UML, ya que tiene diagramas para varios tipos y son fáciles de usar, así como muy completos que te permiten declarar todos los pasos antes de la implementación del proyecto.

Casos de Uso

Cuando se quiere desarrollar un Sistema de Software la mayoría de los problemas que se encuentran en el camino son sobre los requerimientos, que el desarrollador no entendió bien lo que el cliente quiere que se haga, el cliente no explicó bien lo que el desarrollador debe de hacer o simplemente el cliente no tiene idea de todo lo necesario para que se pueda hacer el producto que quiere. No es necesario que el cliente lo sepa, ya que este usualmente no tiene el conocimiento suficiente.

Jessica Greene, 2018, Page

Por estos problemas y otros se han necesitado herramientas para que los requerimientos queden claros por las dos partes, desarrollador y cliente, para que no haya malentendidos, una de estas herramientas son los Casos de Uso.

Estos hacen que se tenga que profundizar en los requerimientos y definir de manera concisa ciertos elementos:

  • Cuáles serán los usuarios del sistema, u otros sistemas que interactuarán con este.
  • Cuáles serán las acciones que cada usuario, o sistema, tendrá con el sistema a desarrollar, los posibles escenarios.
  • Los pasos a seguir dentro de cada posible escenario, esto ayudando a poder ver pasos que podrían fallar conforme a los usuarios, y también definiendo pasos alternativos si sucede algún caso excepcional.
  • La relación que tendrá este Caso de Uso con los otros y cómo se hará, ya que se debe de hacer un Caso de Uso por cada acción por cada usuario con el sistema.
Jessica Greene, 2018, Page

Se recomienda tanto el utilización de los Casos de Uso que hasta ya se han creado plantillas para poder generalizarlos y que se hagan de la manera correcta, aquí se presenta un buena plantilla detallando cada elemento de esta.

Se han desarrollado diagramas que nos pueden ayudar a acomodar nuestros casos de uso para tenerlos más ordenados y facilitar la utilización de estos de una manera más visual.

Scott W. Ambler, 2018, Page
  • Elipse horizontal: representan los Casos de Uso
  • Figuras de palitos: representan las personas, organizaciones o sistemas externos
  • Lineas: representan las asociaciones entre los Casos de Uso y las personas

Proceso Unificado de Desarrollo de Software

El Proceso Unificado se trata de tomar las mejores partes de los demás procesos de desarrollo de software y hacer uno solo, por lo que este toma diferentes aspectos de cada uno, así llegando a una herramienta con suficientes aspectos que se hace un análisis más completo. Estas herramientas, a pesar de ser tediosas, son necesarias para poder tener un conocimiento completo de los requerimientos del proyecto y así poder proseguir de manera correcta a la fase de implementación y valoración.

Rational Software Corporation, 2001, Page
  • Casos de Uso

Los casos de uso son herramientas para saber qué es lo que quiere el cliente del proyecto, ya que estos especifican una parte del proyecto, al dar ejemplos de lo que se quiere hacer, como por ejemplo, tener una página de inicio de sesión para los empleados, con este caso de uso ya el desarrollador tiene una idea de lo que quiere el cliente y puede implementarlo de las maneras que sabe. Este punto me parece uno de los más importantes porque define claramente el trabajo que se tiene que hacer en cuanto al proyecto. Con estos casos de uso se hacen prototipos, lo que nos lleva al siguiente punto.

  • Enfoque Iterativo e Incremental

Al hacer los prototipos de los Casos de Uso se puede ir entregando parte del trabajo hecho al cliente, para así poder trabajar de manera conjunta con este y poder tener la comunicación fácil y eficaz para pedir alguna modificación esta se haga al momento que se está implementando y no al final del proyecto, haciendo estos más eficientes. Este enfoque ayuda a poder ir implementando una cosa sobre otra y poder dividir el trabajo que se tiene por áreas como el siguiente enfoque.

Guru99, 2019 Page
  • Enfoque centrado en la arquitectura

Al hacer el proyecto por partes se puede tener una idea de la dimensión de este, ya que se unen los casos de uso y las partes que se llevan trabajadas y se puede hacer un esquema de la totalidad del proyecto para así poder tener una idea bastante certera de las tecnologías que se van a usar así como de los recursos necesarios para esta.

Todos estos enfoques nos llevan a lo que es este proceso y sus partes más importantes para su desarrollo tomando en cuenta lo anteriormente dicho y teniendo en cuenta lo necesario que son seguir estos pasos para la utilización ideal de esta herramienta.

  • Inicio

Se toman los requerimientos y el diagrama del proyecto para tomar la decisión de si se lleva a cabo este proyecto o no, tomando en cuenta las factores como costo, riesgo, beneficio, factibilidad.

  • Elaboración

Se elaboran los Casos de Uso y se detalla la arquitectura del proyecto, para así poder tener claro lo que se a construir.

  • Construcción

En esta fase es donde se implementan los Casos de Uso, se escribe el código y se implementa en el sistema para poder estar listo para enseñárselo al cliente.

  • Transición

La última fase es para enseñar al cliente el producto ya implementado y poder conseguir feed back de este, así yendo a la tercera fase de nuevo para implementar los cambios y nuevos Casos de Uso, repitiendo este proceso hasta que se termine el proyecto.

Para concluir esta estrategia de desarrollo de software en mi opinión debería de tener un gran uso en la industria, ya que hace que el desarrollo sea más eficiente y mantiene al cliente muy metido en el proyecto por lo que puede dar su opinión en todo momento y se pueden hacer cambios sin que sean tan costosos o difíciles de hacer. Un proceso muy parecido a este es el que usa la empresa Rational de IBM, conocido como RUP.

Ciclos de Vida del Software

El Ciclo de Vida del Desarrollo del Software es una parte fundamental del desarrollo de software, ya que gracias a este se hace la planificación de lo que se va a hacer en el proyecto, tomando en cuenta los requisitos o requerimientos que de el cliente para este. Para facilitarlo se divide en fases dependiendo del modelo que se escoja, así teniendo una forma más clara del proceso.

Modelos más comunes:

  • Modelo de cascada

Este modelo se caracteriza por tener un espacio para cada fase del desarrollo de manera muy definida y delimitada, dificultando los cambios en fases anteriores si es que hay un cambio en los requerimientos ya sea por parte del cliente o por otras cuestiones.

  • Modelo en V

Este modelo es una mejor del modelo de cascada, ya que con este se planea con mayor anterioridad las pruebas que se le tienen que hacer al software, así adelantándose a los problemas que podrían surgir, pero tiene desventajas como que no se pueden hacer prototipos por la manera en la que se desarrolla.

  • Modelo de prototipos

El modelo de prototipos se caracteriza por hacer prototipos para el usuario constantemente, por lo que el usuario está más involucrado en el proceso y puede decir de una manera más temprana si el proyecto va como quiere o si le sobra o le falta algo, de esta manera haciendo más eficiente el desarrollo. Las desventajas de este modelo es que puede ser muy costoso hacer tantos prototipos así como también es necesario tener mucho contacto con el usuario para poder evaluar el prototipo.

  • Modelo en espiral

Este modelo se caracteriza por tener la serie de pasos muy claro, donde una cosa depende de otra así haciendo que el desarrollo del proyecto sea muy específico para este proyecto por lo que no se puede reutilizar en otros. Tiene ventajas como que el desarrollador se involucra desde una etapa muy temprana y que tiene estimaciones más especificas tanto de costos como de horas de trabajo.

  • Modelo ágil

Este modelo se refiere a la agilización del proceso por medio del contacto directo e informal con el cliente, por lo que no se tiene que hacer mucha documentación como con los otros modelos, también se hacen pequeños prototipos en cada fase para que el cliente sepa como va quedando, estos prototipos incrementan en cada fase, así terminando con el producto apenas se terminen de ver los requerimientos.

Fuentes

Mastery 00 – Getting Started

This is the blog for my Analysis and Modeling of Software class at my University, I am a Computar Science student in Mexico who is learning the principales of this topic to be better at what I can do.

This work is the begging of all the blogs I would do in this semester about this topic with the strategy of writting a blog to share what I am learning with the world and give a little to the people who also want to learn about it.

#mastery00

Design a site like this with WordPress.com
Get started